【问题标题】:Why can't I write PDO prepared statements in quotes?为什么我不能在引号中编写 PDO 准备语句?
【发布时间】:2011-11-20 10:56:12
【问题描述】:

我有以下代码与PDO prepared statements

$stmt = $conn->prepare('SELECT `myColumn1` FROM my_table '.
                       'WHERE `myColumn2`=:val LIMIT 1');
$stmt->bindValue(":val", $value);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

这很好用。它发送以下查询:

113 Query   SELECT `myColumn1` FROM my_table WHERE `myColumn2`=":val" LIMIT 1

它会返回正确的值。

但是如果我将第一行改为

$stmt = $conn->prepare('SELECT `myColumn1` FROM my_table '.
                       'WHERE `myColumn2`=":val" LIMIT 1');

$stmt = $conn->prepare('SELECT `myColumn1` FROM my_table '.
                       'WHERE `myColumn2`=':val' LIMIT 1');

发送相同的查询,但 PDO 返回 false。

谁能解释一下原因?

【问题讨论】:

  • 我可以问一个问题吗?干什么用的?

标签: php pdo prepared-statement


【解决方案1】:

来自the page you quote

prepared statements 的参数不需要引用;驱动程序会自动处理。

引号的目的是将字符串数据与查询的其余部分分隔开来,因为它不容易分开(与具有明显格式的数字不同)。由于使用prepared statements意味着查询和数据是分开传递的,所以引号是不必要的。

【讨论】:

  • AFAIK 这不是真的 - 准备好的语句由服务器解析,包括占位符和通过 API 单独传递的参数。由于引号仅与语句解析相关,因此根本不需要它们。
  • 感谢您的回答。我已经阅读了该页面的德语版本,并且quote 的翻译是......好吧......与我会使用的翻译不同。
  • @MichaelBorgwardt 在支持预准备语句的数据库中确实如此,但 PDO 模拟了其他数据库的行为。我会尝试清除语言。
  • @Col.Shrapnel 想详​​细说明一下吗?
  • 如果你想说出了什么问题,请说出来。如果你想说什么是对的,那就更好了。如果您想使用本网站提供有用的信息,那就太好了。否则...
【解决方案2】:

prepared statements 的一个优点是可以为您处理类型(有点......)。换句话说,prepared statements 允许 MySQL(或任何 RDBMS)决定如何处理数据。加上引号时,这将迫使它成为一个没有意义的字符串。如果它应该是一个字符串,那么服务器将处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多