jquery ビルダー ( http://querybuilder.js.org/から) を使用して、ユーザーが日付を選択し、さらに PHP 関数を介して DataTables (datatables.net/ ) のデータを選択できるようにします。
DataTables と特に Ajax 関数は次のようになります。
var table = $(id).DataTable({
serverSide: true,
searching: true,
processing: true,,
ajax: {
url: "controllers/myAjax.php",
type: "POST",
data: result
}
});
データとして渡されるオブジェクトは、queryBuilder によって定義され、PHP スクリプトのクエリ文字列に追加されます。物事を突き止めるために、データをプレーン SQL ( http://querybuilder.js.org/plugins.html#import-export ) として渡します。私の問題のテストケースでは、これは次のとおりです。
WHERE birthdate < '1990-01-01'
これにより、次の SELECT クエリが生成されます。
SELECT * from table_1 WHERE birthdate < '1990-01-01'
このクエリは MySQL エラーをスローします。
"[...] check the manual that corresponds to your MySQL
server version for the right syntax to use near '\'1990-01-01\' "
明らかに、日付は正しくエスケープされません。しかし、MySQL ワークベンチにこのクエリを正確に入力すると、サーバーが実行され、正しい結果セットが返されます。さらに、ワークベンチはシングル クォーテーション (') またはダブル クォーテーション (") のどちらを使用してもかまいません。
さらに、PHP str_replace を使用してこれらのエスケープ文字を手動で削除しようとしました。関数は値を返しますが、明らかに int として解釈され、他のクエリ (等しい ID など) を壊します。同じことが msqli.real-escape-string ( http://php.net/manual/de/mysqli.real-escape-string.php )にも当てはまります。
私が試した別のアプローチは、Ajax 関数の dataType を少し変更することでしたが、基本的にはフォーム エンコードされたデータを送信しているので、これのデフォルトの型で問題ないでしょうか?
では、なぜ (のみ) 日付フィールドが間違った方法でエスケープされるのでしょうか? DBにアクセスするための独自のPHP関数を作成する前に、これに対するかなり簡単な修正はありますか?