私は、PHPからMySQLを実行するために、標準のmysql_connect()、mysql_query()などのステートメントを使用していました。最近、私は素晴らしいMDB2クラスの使用に切り替えています。それに加えて、プリペアドステートメントを使用しているので、入力やSQLインジェクション攻撃を逃れることを心配する必要はありません。
しかし、私が直面している問題が1つあります。null以外として指定されている(つまり、NULL値を許可しない)VARCHAR列がいくつかあるテーブルがあります。古いMySQLPHPコマンドを使用すると、次のようなことが問題なく実行できます。
INSERT INTO mytable SET somevarchar = '';
ただし、次のようなクエリがある場合:
INSERT INTO mytable SET somevarchar = ?;
そして、PHPでは次のようになります。
$value = "";
$prepared = $db->prepare($query, array('text'));
$result = $prepared->execute($value);
null value violates not-null constraint
これにより、エラー「 」がスローされます
一時的な回避策として、$value
空かどうかを確認し、 " "
(単一のスペース)に変更しますが、これは恐ろしいハックであり、他の問題を引き起こす可能性があります。
代わりにNULLを挿入しようとせずに、プリペアドステートメントで空の文字列を挿入するにはどうすればよいですか?
編集:プロジェクトが大きすぎてコードベース全体を調べ、空の文字列 ""を使用しているすべての場所を見つけて、代わりにNULLを使用するように変更します。私が知る必要があるのは、標準のMySQLクエリが「」とNULLを2つの別個のものとして扱うのに(私が正しいと思うように)、プリペアドステートメントが「」をNULLに変換する理由です。
「」とNULLは同じものではないことに注意してください。たとえば、期待どおりの代わりにSELECT NULL = "";
戻ります。NULL
1