繁体   English   中英

PDO,其中IN语句始终为null

[英]PDO where IN statement is always null

由于工作时间过多(超过14 -.-“)并且我正在入睡,所以我一直在不停地工作。也许这就是为什么我浪费了2个多小时来试图理解我的PDO查询为什么不起作用的原因。查询:

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

当然,在此之前,我定义了$ where和$ clauses:

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

表格的每一行都有一个带有国家ISO代码的“国家”列(例如FR,ES,IT,DE,US ...)。 我的$ countries包含一个键=>值数组,如下所示:

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)-是的,我知道这是伪代码-在我眼中意味着“一切”。 在这一点上,我感到震惊。

如果您认为脚本很奇怪,或者您发现它很愚蠢,或者您认为问题出在其他地方,请不要专注于此。 这只是一个例子。 您在这里看到的不是真正的代码,不,其他地方都没有错。 我已经调试了所有内容。 感谢您的时间。

由于必须使用多个占位符而不是一个,因此在这种情况下不能使用命名的占位符,因为您不知道数组值。 您可以使用assoc数组,并使用命名参数以这种方式循环构建查询。 但为简单起见,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);

在这里,我们将有效的SQL放在一起,以便使用sprintf删除

然后准备并执行

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM