【问题标题】:PDO quoting integers in the query.What should I do now? [duplicate]PDO 在查询中引用整数。我现在应该做什么? [复制]
【发布时间】:2014-02-07 14:15:52
【问题描述】:

有人问过这个问题before。我有以下疑问

$start=150;
$sql='select * from articles where category=? limit ?,5';
$query=$con->prepare($sql)
$query->execute(array($_GET['category'],$start));

我收到错误消息(由于引用 150):

您的 SQL 语法有错误;查看 与您的 MySQL 服务器版本相对应的手册 在第 1 行的 ''150',5' 附近使用的语法。

这已被报告为错误,后来被关闭为虚假。我现在该怎么办?有任何解决方法吗?

编辑

为什么我没有遇到同样的问题,当我有类似的查询时

$sql='select * from articles where id=?';
$query=$con->prepare($sql);
$query->execute(array($id));

【问题讨论】:

  • @MichaelBerkowski:请参阅编辑
  • 绑定id=? 时不是问题,因为MySQL 不在乎是否被引用。在LIMIT 中使用它的解决方案在下面的答案和链接的问题中都确定是明确地bindParam() 强制PDO::PARAM_INT 而不是将数组传递给execute(),这将发送字符串(并引用它们)
  • @MichaelBerkowski: 为什么如此特别。不应该在每种情况下行为都相同。在主键列的情况下引号是否可以接受,因为它可以代替id user_id 并且它仍然适用于整数周围的引号?
  • 这是 MySQL 开发人员的问题。 LIMIT 是特定于 MySQL 的,未在所有其他 RDBMS 中实现。如果您启用了模拟准备并在 PDO 中禁用它,您可能会得到不同的结果。

标签: php mysql pdo


【解决方案1】:

正如PDOStatement::execute 文档所说,“所有值都被视为 PDO::PARAM_STR。” 您应该使用 bindValuebindParam:

$query->bindValue(1, (int) $_GET['category'], PDO::PARAM_INT);
$query->bindValue(2, $start, PDO::PARAM_INT);
$query->execute();

【讨论】:

  • @Pitor: 如果我没记错的话,那就是如果我只有字符串,那么不用担心我可以直接使用$query->execute(array(string1,string2,string3,string4))。当我有非字符串并因此使用绑定指定它们的类型时,唯一需要注意的是
【解决方案2】:

第一个解决方案:
正如这个答案中所述https://stackoverflow.com/a/10014200/1311025

  • 禁用模拟准备(MySQL 驱动程序有一个错误/功能, 将使其引用数字参数):

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

  • 将单个绑定参数与整数转换选项一起使用:

$comments->bindParam(1, $post, PDO::PARAM_STR);
$comments->bindParam(2, (int)$min, PDO::PARAM_INT);
$comments->bindParam(3, (int)$min, PDO::PARAM_INT);


另一种解决方案:
由于它始终是整数,因此您可以避免 PDO 变量绑定的更多问题,并使用 intval 检索 $start 变量的整数表示,从而添加与变量绑定相同的安全验证.

$start=150;
$integerStart = intval($start);
$sql='SELECT * FROM articles WHERE category=? LIMIT '.$integerStart.', 5';
$query=$con->prepare($sql)
$query->execute(array($_GET['category']));

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多