2012-03-12 128 views
4

我在使用PDO访问我的数据库的php脚本中遇到问题。当我在PDO中使用prepare()或​​时,似乎无法使PDO逃离我的字符串。我已经看遍了,我还没有找到这个问题的答案,因为无论我看到它说PDO自动逃脱字符串。 这里是我的代码:PDO不转义字符串引号

$statement = $db->prepare("INSERT INTO Table (ID, Column1, Column2) VALUES (NULL, '$var1', '$var2')"); 
$query->execute(); 

让我们承认$var1 = "abc'def"$var2 = "123"的问题是,我得到一个错误消息,因为报价没有逃脱。

错误:SQLSTATE [42000]:语法错误或访问冲突:1064您 在您的SQL语法错误;检查对应于 你的MySQL服务器版本正确的语法使用近“高清”的手册, 第1行

我使用query()方法,但用同样的prpblem还试图“123”)”报价。 我真的不明白,这很令人沮丧。谢谢你的帮助。

+0

查看[例子](http://ca.php.net/pdo.prepare)。 – netcoder 2012-03-12 20:36:53

回答

13

试试这个:

# Took out ID, as it should be auto_increment and handled by database 
$statement = $db->prepare("INSERT INTO Table (Column1, Column2) VALUES (:col1, :col2)"); 

$statement->bindValue(':col1', $var1, PDO::PARAM_STR); 
$statement->bindValue(':col2', $var2, PDO::PARAM_INT); 

$statement->execute(); 
+0

工作奇迹!非常感谢 !! – califrench 2012-03-12 20:42:12

+0

没问题。为了将来的参考,阅读PHP文档,95%的时间里有很好的例子,从中收集如何正确实现API调用。尽可能接受。 – 2012-03-12 20:46:07

+0

相信我,我做到了。谢谢。 – califrench 2012-03-12 20:46:57

2

请看看在bindParam()的PDO库的方法。

这使得您的查询是这样的:

$statement = $db->prepare("INSERT INTO Table (ID, Column1, Column2) VALUES (NULL, ?, ?)"); 
$statement->bindParam(1, $var1, PDO::PARAM_STR); 
$statement->bindParam(2, $var2, PDO::PARAM_INT); 

$query->execute(); 

//我真的应该载入新的答案:)当酒吧说,有。

+0

正如Mike Purcell所建议的那样,我用一个名为'bindValue()'的类似方法完成了它。我更喜欢键而不是字符串中对象的索引。 – califrench 2012-03-12 21:07:52

+1

这种方法的工作原理是一样的,唯一的缺点是如果你有一个含有大量参数的查询,它会变得混乱。 – 2012-03-13 21:20:24

0

为此目的有一个功能。看看www.php.net/addslashes

+3

为什么要在PDO扩展内置函数时使用addslashes? – stUrb 2012-03-12 20:41:21

+0

你可能不应该。不知道PDO有能力解决这个问题。 – 2012-03-12 21:05:37