PHP字符串在MYSQL IN()中不起作用

时间:2016-02-09 19:03:11

标签: php mysql implode

我只是添加代码,因为它会说出一切。是的,它不起作用,我不知道为什么:(

$array = array('One', 'Two', 'Three');
$string = "'" . implode("', '", $array) . "'";

$query = "SELECT * FROM $table WHERE name IN (" . $string . ")";
$make = $this->conn->prepare($query);
$make->execute();
$result = $make->fetchAll();

返回空数组。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

问题出现了,因为您在尝试传递给表格的值中有单引号,即" Man-o' -War"

因为您正在使用数组和预准备语句,所以在执行查询时应该传递数组:

$array = array('One', 'Two', 'Three');

$query = "SELECT * FROM $table WHERE name IN (" . implode(',',str_split(str_repeat('?',count($array)))).") ";
$make = $this->conn->prepare($query);
$make->execute($array);
$result = $make->fetchAll();

为了确保我们有足够的位置占位符,我们会使用implode()str_split()str_repeat()执行一些魔术,以便在语句中获得足够的?

来自Demystifying PHP's Data Objects (PDO)

  

您必须传递所有值以在 数组 中绑定到PDOStatement->execute(),或者您必须使用PDOStatement->bindValue()绑定每个值,然后调用{ {1}}没有参数。将数组(空或非空)传递给PDOStatement->execute()将替换任何先前的绑定并可能导致错误,例如与MySQL错误" SQLSTATE [HY000]:一般错误:2031" (CR_PARAMS_NOT_BOUND)如果您传递了一个空数组。

另外请注意,请确保execute()已正确填充(并且,您无法在PDO中将表或列名称作为参数传递)。