【问题标题】:PDO Not escaping string quotesPDO 不转义字符串引号
【发布时间】:2012-03-29 06:49:42
【问题描述】:

我在使用 PDO 访问我的数据库的 php 脚本中遇到问题。当我在 PDO 中使用prepare()execute()时,我似乎无法让 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 服务器版本,以便在“def”附近使用正确的语法, '123')' 在第 1 行

我也尝试过使用query() 方法,但与引号相同的问题。 我真的不明白,这很令人沮丧。感谢您的帮助。

【问题讨论】:

标签: php sql database pdo


【解决方案1】:

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

【讨论】:

  • 当 PDO 扩展有内置函数时,为什么还要使用 addlashes?
  • 您可能不应该这样做。不知道 PDO 有能力解决这样的事情。
【解决方案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()我更喜欢键而不是字符串中对象的索引。
  • 这种方法的效果是一样的,唯一的缺点是,如果你有一个带有大量参数的查询,它可能会让人困惑。
【解决方案3】:

试试这个:

# 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 文档,95% 的时间都有很好的示例从中收集如何正确实现 api 调用。尽可能接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2013-01-06
  • 1970-01-01
  • 2016-01-16
相关资源
最近更新 更多