-1

ファーストネーム、ラストネーム、説明、グレードを含む ajax $.post リクエストの形式で取得したドロップ可能なデータを一致させ、データベース内の同じデータと一致させようとするスクリプトがあります。そうすることで、ユーザーを見つけてクエリで取得したいと考えています。を使用して効率的なクエリを作成するのに問題があり、LIKEこれを正しく行うために追加する他のコンポーネントがわかりません

if (isset($_POST['data'])){
    $data = $_POST['data'];
    $query = mysql_query("SELECT * FROM `tempusers`
        WHERE `firstname` LIKE '%" . $data . "%'
            OR `lastname` LIKE '%" . $data . "%'
            OR `description` LIKE '%" . $data . "%'
            OR `grade` LIKE '%" . $data . "%'");

    if (! $query){
        echo'Database error: ' . mysql_error();
    }

    while ($row=mysql_fetch_assoc($query)) {
        $description = $row['description'];
        echo $description;
    }

    exit;
}

問題は、結果を返さず、代わりにエラーが発生することです

SQL 構文にエラーがあります。正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してくださいand

実装できるヒントを歓迎します。大いに感謝します

4

4 に答える 4

1

クエリの構文は有効です。つまり、入力データのどこかに一重引用符があり、構文エラーでクエリが失敗します。

これを解決するには、引用符をエスケープするパススルーを実行できます。最も重要なのは、SQLインジェクションを防ぐことです$datamysql_real_escape_string()

エスケープするよりもさらに良いのは、PDOまたはMySQLiでパラメーター化されたクエリを使用することです。

最適化に関しては、複数のLIKEの代わりにREGEXPを試すことができます。ここの例

于 2012-11-08T16:23:53.917 に答える
1

動作しないMySQLクエリを最適化するための支援を求めています。

まず、クエリを機能させる必要があります。これを行う通常の手順は、MySQLクライアント(phpmyadminなど)にクエリを入力して、何が起こるかを確認することです。また、構築されたクエリをechoで出力すると、SQL構文エラーを確認するのに役立つ場合があります。

次に、フォームのクエリ

  column LIKE '%matchstring%'

単に最適化することはできません。一致文字列の先頭の%は、MySQLサーバーが一致を見つけるために言及した列のすべての行を検索する必要があることを意味します。インデックスはこれを助けません。このようにクエリできる場合

 column LIKE 'matchstring%'

インデックスを使用して、これらの検索を最適化できます。

第三に、ORクエリで使用しています。MySQLオプティマイザはORがあまり好きではなく、それぞれのテーブルを再スキャンします。

このテーブルをMyISAMアクセスメソッドに入れて(まだ行っていない場合)、FULLTEXTマッチングを使用することができます。これを試して:

  WHERE MATCH (firstname, lastname, description, grade) 
        AGAINST ('matchstring' IN BOOLEAN MODE)

これにより、必要な検索が実行されます。フルテキストインデックスを使用して最適化できます。

最後に、Marc Bが指摘したように、SQLインジェクションの問題を修正する必要があります。小学校は、中等学校を気にせず、成績評価システムを作りたいと思っている人々でいっぱいです。危険を見つけるために、検索エンジンで「小さなジョニードロップテーブル」を調べてください。

于 2012-11-08T16:24:47.513 に答える
1

die;後に配置echo'Database error: ' . mysql_error();してコードを実行し、データベース エラーの内容を確認します。

于 2012-11-08T16:34:54.973 に答える
0

ユーザー入力をサニタイズしていません。これにより、SQL に引用符文字が表示されなくなります (エラー メッセージで証明されています)。簡単な修正が可能です (文字列をクエリに入れる前にエスケープします):

if (isset($_POST['data'])){

    // sanitize user input
    $data = mysql_real_escape_string($_POST['data']);

    $query = mysql_query("SELECT * FROM `tempusers`
        WHERE `firstname` LIKE '%" . $data . "%'
            OR `lastname` LIKE '%" . $data . "%'
            OR `description` LIKE '%" . $data . "%'
            OR `grade` LIKE '%" . $data . "%'");

    if (! $query){
        echo'Database error: ' . mysql_error();
    }

    while ($row=mysql_fetch_assoc($query)) {
        $description = $row['description'];
        echo $description;
    }

    exit;
}

SQL インジェクションについて読んでください。

効率化について: インデックスは、クエリを実行するフィールドでは機能しませんLIKE

さらに、このmysql_関数は非推奨であるため、使用しないことをお勧めします。mysqli代わりに使用してください。

于 2012-11-08T16:27:51.857 に答える