【问题标题】:PDO prepare with question marks doesn't work with numbers [duplicate]带问号的 PDO 准备不适用于数字 [重复]
【发布时间】:2013-05-06 02:31:12
【问题描述】:

我有这个:

$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'pass');

$max = 10;
$min = 0;
$q = $_GET['q'];

$result = $pdo->prepare("SELECT * FROM fruits WHERE name LIKE ? LIMIT ?, ?");
$result->execute(array('%'.$q.'%', $min, $max));

但是,当我将 LIMIT 替换为 LIMIT 0、10 并从数组中删除 $min 和 $max 时,它不起作用(不返回任何内容)。 我究竟做错了什么?我尝试使用 '0' 而不是 0,但它也不起作用......

【问题讨论】:

标签: php sql pdo sql-like


【解决方案1】:

PDO::execute 将所有参数转义为 STRING。

$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'pass');

$max = 10;
$min = 0;
$q = (isset($_GET['q']) && is_string($_GET['q'])) ? $_GET['q'] : '';

$stmt = $pdo->prepare('SELECT * FROM fruits WHERE name LIKE ? LIMIT ?, ?');
$stmt->bindValue(1, "%{$q}%", PDO::PARAM_STR);
$stmt->bindValue(2, $min    , PDO::PARAM_INT);
$stmt->bindValue(3, $max    , PDO::PARAM_INT);
$stmt->execute();

【讨论】:

  • 它有效,感谢您的帮助!
【解决方案2】:

我的猜测是数字被绑定为字符串。来自手册:

包含与绑定参数一样多的元素的值数组 在正在执行的 SQL 语句中。所有值都被视为 PDO::PARAM_STR。

所以你应该使用bindValue 而不是执行快捷方式。

【讨论】:

  • 你是对的,谢谢!
猜你喜欢
  • 2019-06-29
  • 2011-09-23
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2012-10-27
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多