これは、PDOのプリペアドステートメントエミュレーションの(報告されていない?)バグのように見えます:
-
実装
PDOStatement ::execute()
の 最終的にpdo_parse_params()
を呼び出します ; -
次に、値の引用/エスケープを試みます 関連するパラメータのデータ型に基づきます(
$ data_type
で示されます)。PDOStatement ::bindValue()
への引数 およびPDOStatement ::bindParam()
-すべてのパラメーターは$input_parameters
として提供されますPDOStatement ::execute()
PDO ::PARAM_STR
として扱われます 、その関数のドキュメントに記載されているように); -
文字列型の値は、呼び出し<を呼び出すことにより、エスケープ/引用されます。 / a> 関連するデータベースドライバーの
quote()
null
であるかどうかに関係なくメソッド :PDO_MySQLの場合、それはmysql_handle_quoter()
、(最終的に)値を<のいずれかに渡します。 code> mysqlnd_cset_escape_quotes() またはmysql_cset_escape_slashes()
、サーバーのNO_BACKSLASH_ESCAPES
によって異なります SQLモード; -
与えられた
null
引数の場合、これらの関数は両方とも空の文字列を返します。
私の意見では、パラメータをオンにする前に、タイプ
(上記のステップ2で)、 pdo_parse_params()
タイプをPDO::PARAM_NULL
に設定する必要があります 値がnull
の場合 。ただし、これにより null
のタイプ固有の処理が妨げられると主張する人もいるかもしれません。 必要に応じて値。この場合、 string case (上記のステップ3で)間違いなく null
を処理する必要があります ドライバーのquoter()
の呼び出しに進む前の値 メソッド。
暫定的な回避策として、プリペアドステートメントのエミュレーションを無効にするのが通常は最善の方法です:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);