0

我想使用这样的查询:

$sql = "SELECT `name` FROM `table` WHERE `id` IN (?)";

并绑定值数组

$sth = $pdo->prepare($sql);
$sth->execute(array(array('1', '2', '4')));

所以,我必须包装 PDO。如何实现这种行为并考虑所有的陷阱?

它必须考虑:

IN(?) with array values;
IN(?) with empty array;
NOT IN(?) with array values;
NOT IN(?) with empty array;
NOT (expr IN (?)) with array values;
NOT (expr IN (?)) with empty.

问题变成了我们有一个空数组。在这种情况下,我可以使用简单的通配符将通配符替换为空。但是,如果我没有 IN(?) 和空数组,我必须做什么?

热点是使用NOT IN (?)空数组。

4

1 回答 1

2

问题变成了我们有一个空数组。

这是一个非常有趣的问题,我花了一些时间来调查。

在朋友的帮助下进行了一些非常有趣的辩论后,我得出结论,NULL如果数组为空,则将其传递给 IN() 语句。它做出了非常明智的行为,并且不会使查询失败。

但是,一个问题仍然悬而未决:

虽然IN(NULL)返回 FALSE 并且看起来很明智,NOT IN(NULL)返回... FALSE 再次!所以,你必须小心这种说法。

对于我自己的实现,我使用条件查询构建作为解决方法,NOT IN()仅在非空数组的情况下添加整个语句。它使逻辑更加可靠,尽管以额外的代码为代价:

$in = '';
if ($array) {
    $in = $db->parse(" AND col NOT IN(?a)", $array);
}
$data = $db->getAll("SELECT * FROM t WHERE name=?s ?p", $name, $in);

(在直接 IN 的情况下将其与简明陈述进行比较):

$data = $db->getAll("SELECT * FROM t WHERE name=?s AND col IN(?a)", $name, $in);

如果数组为空,它将不返回任何行。

因此,我仍然愿意接受有关如何以NOT IN更优雅的方式解决问题的建议。

于 2013-03-30T16:33:18.377 回答