我不停地工作,因为太多时间(超过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) - 是的,它的伪代码我知道它 - 意味着"一切"在我的眼里。在这一点上,我感到震惊。
如果你觉得这个剧本很奇怪,或者你觉得它很愚蠢,或者你认为问题出在其他地方,请不要专注于此。这只是一个例子。你在这里看到的不是真正的代码,不,在其他地方没有错。我已经调试好了一切。谢谢你的时间。
答案 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);