我一直盯着下面的代码超过一个小时,任何看不到任何问题。
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行
答案 0 :(得分:8)
您需要将其放入反引号中,或使用其他列名称。
答案 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();
}
即使你不知道任何一个保留字,也不会引起任何错误。