15

mysqliではなくPDOプリペアドステートメントを使用するようにアプリを変換してきましたが、奇妙な問題が発生しています。データベースに、フィールドがnullになると予想されるレコードがいくつかあります。'null'(文字列)または''(空の文字列)ではなく、NULLです。私はクエリを動的に構築するので、過去にオブジェクトでnull変数に遭遇したとき、次のようにクエリを構築していました。

WHERE fieldName is null;

そして、フィールドがnullの場合、期待される結果が得られます。

PDOを使用すると、クエリは結果を返さず、エラーも発生しません。それは単に私が期待するレコードを返さないだけです。構築されたクエリをエコーし​​てMySQLで直接実行すると、期待どおりの結果が得られますが、アプリケーション内では結果が返されません。

私が試したことのいくつかには、次のようなクエリの作成が含まれます。

WHERE fieldName is null;

また

WHERE fieldName <=> null;

私はまた、次の標準的な準備されたステートメントを試しました:

WHERE fieldName = :fieldName

次に、これらの種類のステートメントをバインドします。

$stmt->bindParam(":$field", $value);
$stmt->bindParam(":$field", $value, PDO::PARAM_NULL);
$stmt->bindParam(":$field", null, PDO::PARAM_NULL);
$stmt->bindValue(":$field", null, PDO::PARAM_NULL);
$stmt->bindValue(":$field", null, PDO::PARAM_INT);

これに関する助けをいただければ幸いです。私のPHPバージョンは5.3.10で、MySQLは5.5.22です。副次的な質問として、bindParamとbindValueの違いについてはまだはっきりしていません。そのため、回答に含めることが理にかなっている場合は、この件についていくつか説明していただければ幸いです...

4

3 に答える 3

9

この質問が書かれているので、mysqlはnull値を照合するために通常のクエリを使用できるようにする宇宙船演算子を導入しました

WHERE fieldName <=> :fieldName;

nullaまたはnull以外の値の両方に一致します。

だから、すぐにクエリを書いて、いつものように実行してください

$stmt = $db->prepare('SELECT field FROM table WHERE fieldName <=> :fieldName;');
$stmt->execute(['fieldName' => null]);
$result = $stmt->fetchAll(); // whatever fetch method is suitable

そして、動的に構築されたクエリでは、それはすべて同じです。

于 2012-11-12T23:36:58.883 に答える
-1

別の質問ですが、すべてのawnserがここにあります:PDOを使用してNULL値を挿入するにはどうすればよいですか?

要約すると:

$stmt->bindValue(':param', null, PDO::PARAM_INT); 

動作するはずです。次も使用できます。

$stmt->execute( array(":param" => NULL));

bindparamの場合、変数(定数ではない)で値を指定する必要があります。bindvalueは定数を使用できます。

于 2012-11-12T23:22:11.343 に答える
-2

MySqlでは、クエリを使用できます

select * from atable where isnull(column_name); 

null値をチェックします。

于 2013-12-30T01:19:30.200 に答える