php - pdo - 准备好的语句丢失数据?

标签 php mysql pdo prepared-statement

我有一个查询(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 ')');

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

最佳答案

因为评论区不允许写那么好,这里只是评论一个答案:

假设您有两个 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 数量制定准备语句并执行绑定(bind)语句。

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

关于php - pdo - 准备好的语句丢失数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133661/

相关文章:

MySQL:从多个表,子查询中排名?

php - 我可以在 PHP 中混合使用 MySQL API 吗?

php - 保存检索到的数据

php - 这个sql IF语句是如何工作的?

datetime - 我需要计算一个日期时间列之间的日期/时间差

php - 仅当目录或文件不存在时才重写规则

mysql - 带有数据库 MYSQL 的 WiX

php - 我在我的项目中使用 PHP 的工作单元设计模式

PHP 和 Codeigniter - 如何检查模型是否存在和/或不抛出错误?

javascript - 使用 javascript 设置的 Cookie,无法被 PHP 识别(相同的域和路径)