MySQL查询的PDO错误

时间:2013-02-01 14:59:29

标签: php mysql pdo

我一直盯着下面的代码超过一个小时,任何看不到任何问题。

    public function add($data){
        $sql = 'INSERT INTO ' . $this->name . '(fbid, userAccessToken, name, location, story, gender, email, email_md5, referrer, date, use, optin) VALUES (:fbid, :userAccessToken, :name, :location, :story, :gender, :email, :email_md5, :referrer, :date, :use, :optin)';

        $mysqldate = date('Y-m-d G:i:s');
        $result = $this->dbh->prepare($sql);

        if($result->execute(array(
            ':fbid' => $data['fbid'],
            ':userAccessToken' => $data['userAccessToken'],
            ':name' => $data['name'],
            ':location' => $data['location'],
            ':story' => $data['story'],
            ':gender' => $data['gender'],
            ':email' => $data['email'],
            ':email_md5' => md5($data['email']),
            ':referrer' => $data['referrer'],
            ':date' => $mysqldate,
            ':use' => $data['use'],
            ':optin' => $data['optin']
        ))){

            $return = $this->dbh->lastInsertId();  
        }
    }

错误是

  

PHP警告:PDOStatement :: execute()[pdostatement.execute]:   SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本,在'use,optin'附近使用正确的语法               VALUES('517371547','no-auth','Shane Jones','Manchest'在第1行

4 个答案:

答案 0 :(得分:8)

USEreserved word in mySQL.

您需要将其放入反引号中,或使用其他列名称。

答案 1 :(得分:3)

use是MySQL中的关键字。如果要将其用作列标识符,请将其括在反引号中:

$sql = 'INSERT INTO `' . $this->name . '` ( `fbid`, `userAccessToken`, `name`, `location`, `story`, `gender`, `email`, `email_md5`, `referrer`, `date`, `use`, `optin`) VALUES (:fbid, :userAccessToken, :name, :location, :story, :gender, :email, :email_md5, :referrer, :date, :use, :optin)';

无论如何,你应该始终将所有标识符括在反引号中,以防止出现此类错误!

答案 2 :(得分:2)

USE是一个保留关键字,必须用反引号`see documentation)括起来。

答案 3 :(得分:1)

您的问题来自于您手动构建查询 虽然任何理智的数据库抽象库都需要为您构建语法正确的查询,但代码会变得很少行:

public function add($data){
    global $db;
    $data['date'] = date('Y-m-d G:i:s');
    $db->query('INSERT INTO ?n SET ?u',$this->name,$data);
    return $db->insertId();
}

即使你不知道任何一个保留字,也不会引起任何错误。