7

次のコードで null パラメーターをバインドするのに問題があります

$nullVariable = NULL;
$sql = new PDO('mysql:host=' . $Server, $User, $Password);
$sql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$statement = $sql->prepare("SELECT * FROM Table WHERE Binary16Column = :uuid");
$statement->bindParam(":uuid", $nullVariable, PDO::PARAM_NULL);
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);

結果変数は空の配列になります。パラメータを使用せず、クエリを「WHERE Binary16Column IS NULL」に変更すると、予想される行数が返されます。したがって、問題は、SQL クエリではなく、パラメーターの処理方法にあるはずです。

私のコードは上記よりも複雑で、null の可能性があるパラメーター変数を使用できるようにする必要があるため、変数が null であることを確認して別のクエリを実行することは理想的ではありません。技術的には、パラメーターを設定するための独自の関数があります。これは、変数の内容が null であるかどうかを確認し、パラメーターを適切にバインドする場所であるため、不要な数のクエリを記述する必要はありません。変数に有効なデータが含まれていて、パラメーターの型が PARAM_LOB の場合、クエリは正常に機能します。

誰かが私が間違っていることを知っていますか? どうもありがとう!

4

3 に答える 3

8

三値論理を読んでください。NULL は値ではありません。これは値が存在しないことを示すマーカーであるため、NULL はそれ自体を含め、何にも等しいことはありません。

ただし、「宇宙船演算子」とも呼ばれる null セーフ比較演算子があり、2 つの null を同等と見なします。

WHERE Binary16Column <=> :uuid

...あなたが期待したことをするはずです。

于 2012-12-29T06:51:35.540 に答える
5

が nullのレコードを選択する場合は、条件としてBinary16Columnを使用する必要がありますが、 は使用しません。IS NULL= NULL

SELECT * FROM Table WHERE Binary16Column IS NULL

あなたがする必要があります:

$uuid = /**some value**/;

$sql = new PDO('mysql:host=' . $Server, $User, $Password);
$sql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

if ($uuid === null) {
  $statement = $sql->prepare("SELECT * FROM Table WHERE Binary16Column IS NULL");
} else {
  $statement = $sql->prepare("SELECT * FROM Table WHERE Binary16Column = :uuid");
  $statement->bindParam(":uuid", $uuid);
}

$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
于 2012-12-29T04:52:00.127 に答える
2

NULL がキーワードであるため、結果が得られない理由だと思います。MySQL が NULL 値を処理する方法のため、NULL 値の検索を実行する場合は IS NULL を実行する必要があると思います。NULL 値を持つローカル データベースで一連のテストを行いました。それが機能したのは、IS NULL または IS NOT NULL を使用していたときだけです。

申し訳ありませんが、これ以上お役に立てず (または、既にご存じのことをお伝えしているだけなら)、別のクエリを作成するか、適切な WHERE ロジックを連結する簡単なロジックを作成する必要があるようです。 、変数がnullかどうかに応じて。

于 2012-12-29T04:58:07.563 に答える