0

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関数を作成する前に、これに対するかなり簡単な修正はありますか?

4

0 に答える 0