PDO,其中IN语句始终为null

时间:2015-03-28 04:17:39

标签: php mysql pdo

我不停地工作,因为太多时间(超过14-.-")并且我已经睡着了。也许这就是为什么我浪费了2个多小时才能理解为什么我的PDO查询不起作用的原因。这是查询:

$query = $mysql->prepare('SELECT * FROM table '.$where.'');
$query->execute($clauses);

在此之前我定义$ where和$子句:

$where["country"] = "country IN (:country)"; 
$clauses["country"] = "'".implode("','",array_keys($countries))."'"

表格的每一行都有一个'国家'具有国家ISO代码的列(例如FR,ES,IT,DE,US ......)。我的$国家/地区包含一个键=>像这样的值数组:

Array
(
    ES => Spain
    IT => Italy
    DE => Germany
)

总之,你清楚地知道这是我的$ where:

country IN (:country)

同时我的$条款是:

'ES','IT','DE'

换句话说,完整的查询字符串是:

country IN ('ES','IT','DE')

不用担心,当然还有前面的WHERE声明。解释的问题是这个:

SELECT * FROM table WHERE country IN ('ES','IT','DE')

它适用于PHPMyAdmin,但PDO总是返回一个空数组,我99%确定它是由于IN()内部没有任何东西。我知道这个,因为如果我将IN()更改为NOT IN(),查询将返回数据库的所有行。 NOT IN(null) - 是的,它的伪代码我知道它 - 意味着"一切"在我的眼里。在这一点上,我感到震惊。

如果你觉得这个剧本很奇怪,或者你觉得它很愚蠢,或者你认为问题出在其他地方,请不要专注于此。这只是一个例子。你在这里看到的不是真正的代码,不,在其他地方没有错。我已经调试好了一切。谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

因为您必须使用多个占位符而不是一个占位符,所以在这种情况下您不能使用命名的占位符,因为您不知道数组值。您可以使用命名参数以循环方式使用关联数组和构建查询。但为简单起见,PDO中的IN子句的工作原理如下:

$quest = implode(',',array_fill(1,count($ar),'?'));

这里我们创建了所需数量的未知占位符:?,?,?,? ...

$col = 'cats';
$table = 'pets';
$sql = sprintf('DELETE FROM %s WHERE %s IN (%s)', $table, $col, $quest);

这里我们使用sprintf

将有效的SQL放在一起进行删除

然后准备&执行

return $this->handler->prepare($sql)->execute($ar);