0

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

    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 服务器版本相对应的手册,以获取在“使用,选择”附近使用的正确语法 VALUES(“517371547”、“no-auth”、“Shane Jones”、“Manchest”在第 1 行

4

4 回答 4

8

USEmySQL 中的保留字。

您需要将其放在反引号中,或使用不同的列名。

于 2013-02-01T15:03:07.260 回答
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)';

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

于 2013-02-01T15:05:33.303 回答
2

USE是必须用反引号括起来的保留关键字`请参阅文档)。

于 2013-02-01T15:06:19.090 回答
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();
}

即使您一个都不知道,也不会对近百个保留字中的任何一个提出错误。

于 2013-02-01T15:09:39.247 回答