我正在从正常的SQL迁移到PDO,因为我让我的一个朋友测试我是否有任何弱点,他建议我去PDO,因为他发现了很多弱点。
所以这是我的完整错误:
致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在第54行的/home/ubuntu/workspace/post.php附近使用正确的语法
(!)PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MySQL服务器版本对应的手册,以便在'附近使用正确的语法? (
id
,title
,info_bys
,info_shorts
,info_longs
,
这是我的代码:
$stmt = $db->prepare("INSERT INTO :portal
(`id`, `title`, `info_bys`, `info_shorts`, `info_longs`, `email`, `filename`, `filepath`, `filename2`, `filepath2`, `approved`)
VALUES ('', ':title', ':by_information', ':short', ':long_information', ':email', ':filename', ':filetarget', ':filename2', ':filetarget2', 'false'");
$stmt->execute(array(':portal' => $portal, ':title' => $title, ':by_information' => $by_information, ':short' => $short, ':long_information' => $long_information, ':email' => $email, ':filename' => $fileName, ':filetarget' => $fileTarget, ':filename2' => $fileName2, ':filetarget2' => $fileTarget ));
echo $affected_rows.' were affected';
我是否可以在PDO中使用我可以在SQL中使用的东西,或者我只是输错了东西。
希望有人可以提供帮助。
编辑:
新代码:
function buildQuery( $get_var )
{
switch($get_var)
{
case 1:
$portal = $_POST['portal'];
break;
}
$stmt = $db->prepare("INSERT INTO :portal
(`id`, `title`, `info_bys`, `info_shorts`, `info_longs`, `email`, `filename`, `filepath`, `filename2`, `filepath2`, `approved`)
VALUES (:title, :by_information, :short, :long_information, :email, :filename, :filetarget, :filename2, :filetarget2, 'false'");
$stmt->execute(array(':portal' => $portal, ':title' => $title, ':by_information' => $by_information, ':short' => $short, ':long_information' => $long_information, ':email' => $email, ':filename' => $fileName, ':filetarget' => $fileTarget, ':filename2' => $fileName2, ':filetarget2' => $fileTarget ));
echo $affected_rows.' were affected';
}
答案 0 :(得分:2)
代码有三个问题:
PDO准备处理转义和引号。
VALUES('',':title',':by_information',':short',':long_information',':email',':filename',':filetarget',':filename2',': filetarget2','false'“);
这里的问题是,如果您将字符串定义为字符串(PDO::PARAM_STR
),则使用单引号对引号进行双引号。而是这样做:
`VALUES ('', :title, :by_information, :short, ....");`
不要插入ID,这应该设置为自动增量并自动完成。
'INSERT INTO table (title, ...'
此外,反引号(``)用于让数据库驱动程序知道您使用此值,而不是用作保留关键字。换句话说,在这个查询中完全过时了。