连接失败:SQLSTATE [42000]:语法错误或访问冲突

时间:2017-10-18 08:13:12

标签: php database pdo mariadb

你知道我的代码有什么问题吗?我无法弄明白。

  

连接失败:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中出错;检查与您的MariaDB服务器版本对应的手册,以便在第3行使用'VARCHAR(50)NOT NULL,url TEXT(65535)NOT NULL,ip VARCHAR(150)NOT NULL)附近使用正确的语法

<?php
$host = "localhost";
$dbname = "nope";
$username = "nope";
$password = "nope";

if(isset($_GET["s"])){
    try{
        $pdo = new PDO("mysql:host=".$host.";dbname=".$dbname,$username,$password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $table = "links";
        $sql ="CREATE TABLE IF NOT EXISTS $table(
        ID INT(11) AUTO_INCREMENT PRIMARY KEY,
        key VARCHAR(50) NOT NULL, 
        url TEXT(65535) NOT NULL,
        ip VARCHAR(150) NOT NULL)";
        $pdo->exec($sql);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }


    /*$statement = $pdo->prepare("select url from $table where key = :key");
    $statement->execute(array(':key' => $_GET["s"]));
    $result = $statement->fetch();
    echo $result;*/
}
else{
    echo "error";
}
?>

2 个答案:

答案 0 :(得分:1)

您的列名keyreserved keyword in mysql

解决方案是引用反引号中的列名称

    `key` VARCHAR(50) NOT NULL, 

或者只是将列的名称更改为您喜欢的任何不是保留字的列。

     my_key VARCHAR(50) NOT NULL,

所以你的陈述应该是

    $sql ="CREATE TABLE IF NOT EXISTS $table(
    ID INT(11) AUTO_INCREMENT PRIMARY KEY,
    `key` VARCHAR(50) NOT NULL, 
    url TEXT(65535) NOT NULL,
    ip VARCHAR(150) NOT NULL)";

    $sql ="CREATE TABLE IF NOT EXISTS $table(
    ID INT(11) AUTO_INCREMENT PRIMARY KEY,
    table_key VARCHAR(50) NOT NULL, 
    url TEXT(65535) NOT NULL,
    ip VARCHAR(150) NOT NULL)";

答案 1 :(得分:1)

请尝试以下查询:

CREATE TABLE IF NOT EXISTS $table(
        `ID` INT(11) AUTO_INCREMENT PRIMARY KEY,
        `key` VARCHAR(50) NOT NULL, 
        `url` TEXT NOT NULL,
        `ip` VARCHAR(150) NOT NULL)

KeyMariaDB中的Reserved Word。因此需要包含在``中。并且无需为类型TEXT

定义长度