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.

問題は、空の配列があることになります。この状況ではワイルドカードを null に置き換えることができます。しかし、NOT IN(?) と空の配列がある場合はどうすればよいですか?

ホットポイントはNOT IN (?)空の配列で使用しています。

4

1 に答える 1

2

問題は、空の配列があることになります。

これは非常に興味深い問題で、調査に時間がかかりました。

NULL友人の助けを借りていくつかの非常に興味深い議論を行った後、配列が空の場合に備えて IN() ステートメントに渡すという結論に達しました。それはかなり賢明な振る舞いをし、クエリを失敗させません。

ただし、1 つの問題がまだ未解決です。

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 に答える