【问题标题】:pdo - prepared statement loses data?pdo - 准备好的语句丢失数据?
【发布时间】:2012-04-13 00:20:12
【问题描述】:

我有一个查询(PHP、Mysql)一个名为“table”的表,如下所示:

 id | name
-------------
  6 | abc
  10| xxx
  52| def

还有一个查询:

$ids = '5,62'

$name = $pdo -> prepare('SELECT id, name FROM table WHERE id IN ( :ids )');
$name -> bindValue(':ids', $ids, PDO::PARAM_STR); 
$name -> execute();
$name = $name->fetchAll(PDO::FETCH_ASSOC);
print_r($nazwa);

我希望得到类似的结果

 id | name
-------------
  6 | abc
  52| def

不幸的是,我只得到:

 id | name
-------------
  6 | abc

好像第二个值会被忽略。如果我将查询更改为:

$name = $pdo -> prepare('SELECT id, name FROM table WHERE id IN (' $ids ')');

一切顺利。你能告诉我为什么准备好的语句不考虑带逗号的内爆表吗?

【问题讨论】:

  • 两个参数不是一个参数; bindValue 是一个参数。如果该值包含两个参数的值,则说明您使用了错误的工具。是的,这已经被问过了。 IN () 加上准备好的语句,例如这里是可变数量的参数和 PDO 的示例:stackoverflow.com/a/7128193/367456
  • 我已经阅读了您提供的链接,但它仍然没有让我在解决问题的路上。对我来说,“绑定”是我之前提出的查询的变量。而我这种情况下的字符串 '6, 52' 只是 mysql 查询中位于 ( 和 ) 之间的另一个字符串。我没有看到它是两个、三个和更多参数.. 不知道为什么我应该在这个级别上将它视为 2 或更多。抱歉 - 我是 pdo 的新手

标签: php mysql pdo prepared-statement


【解决方案1】:

因为评论栏写的不好,这里只回复评论:

假设您有两个 ID:

$name = $pdo->prepare('SELECT id, name FROM table WHERE id IN ( :id1, :id2 )');

假设您有三个 ID:

$name = $pdo->prepare('SELECT id, name FROM table WHERE id IN ( :id1, :id2, :id3 )');

你看到模式了吗?您拥有的值与拥有的 ID 一样多。根据您拥有的 ID 数量制定准备语句以及执行绑定语句。

所以答案是:您需要更改您的代码,以便它真正反映您要处理的 ID 数量。 MySQL 服务器不会神奇地将字符串中的逗号分隔列表解释为多个 ID。相反,您需要告诉服务器每个 ID。

【讨论】:

  • 是的,现在更清楚了 :) 谢谢。我仍然必须找出如何映射适当数量的 id,因为有时它们可​​能是 2 个 id,而另一个时间是 25 个。但我想最简单的方法是将 bindValue 放入 foreach 循环中。再次感谢您。
  • 是的,arrays 是您的朋友,拥有不同数量的 ID。循环,implode 等。 PDO 还有命名参数和位置参数。看看什么最适合您的需求。
猜你喜欢
  • 1970-01-01
  • 2014-07-20
  • 2010-11-30
  • 1970-01-01
  • 2011-07-13
  • 2017-09-29
  • 2016-12-30
相关资源
最近更新 更多