PDO未转义字符串引号

4

我在使用PDO访问数据库的php脚本中遇到了一个问题。当我在PDO中使用prepare()execute()时,似乎无法对字符串进行转义。我已经寻找了很多地方,但都没有找到答案,因为无论我去哪里查看,都说PDO会自动转义字符串。

这是我的代码:

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

假设有 $var1 = "abc'def"$var2 = "123",问题是我收到了错误信息,因为引号没有被转义。

错误: SQLSTATE[42000]: 语法错误或访问冲突: 1064 在你的MySQL服务器版本对应的手册中检查使用语法时发生了错误,'def','123')' 在第1行

我也尝试过使用 query() 方法,但是引号的问题仍然存在。 我真的不理解这个问题,感到非常沮丧。谢谢任何帮助。


请查看示例 - netcoder
3个回答

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();

没问题。作为参考,阅读 PHP 文档,在其中有很棒的例子可以借鉴如何正确实现 API 调用,95% 的情况都适用。只要能接受就行。 - Mike Purcell

2
请看PDO库的bindParam()方法。
这将使您的查询语句如下所示:
$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();

//我真的应该加载新答案 :) 当进度条显示有新答案时。


正如Mike Purcell所建议的那样,我使用了一个类似的方法bindValue()。对于字符串中的对象,我更喜欢使用键而不是索引。 - califrench
1
这种方法的效果是一样的,唯一的缺点是如果你有一个带有大量参数的查询,它可能会变得混乱。 - Mike Purcell

0

有一个专门用于此目的的函数。请查看www.php.net/addslashes


3
当PDO扩展中具有内置函数时,为什么应该使用addslashes呢? - stUrb
你最好不要这样做。我没有意识到PDO有解决这种问题的能力。 - Kasper Munck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接