4

PHP を学習するための Web サイトを構築しており、Jquery Ui から自動提案を作成しています。

これが私のコードです(私はずっと前にSOの投稿からこのコードを取得しましたが、私はそれが何をするのか100%ではないので、誰かが説明できれば役に立ちます!)このコードはsuggest.phpからのものです。 jqueryコードから呼び出します(これは機能していると思うので、投稿しませんでしたが、必要に応じて投稿できます!)

<?
include("config.php");

$queryString = strtolower($_GET["q"]);

$return = array();
$query = mysql_query("SELECT name FROM company WHERE name LIKE '$queryString%' UNION SELECT cat FROM cat WHERE cat LIKE '$queryString%' UNION SELECT subcat FROM subcat WHERE subcat LIKE '$queryString%' LIMIT 10");
while ($row = mysql_fetch_array($query)) {
     array_push($return,array('label'=>$row['name'],'value'=>$row['name']));
}
echo(json_encode($return));

?>

現在、これで自動提案が機能していますが、結果は同じです (たとえば、「Johns」と入力すると、提案として「Johns Hot Dogs」が表示されますが、「fjfjdjf669959」と入力すると、「ジョンズ・ホットドッグ」も。

会社テーブルの名前行、猫テーブルの行、およびサブキャットテーブルのサブキャット行を自動提案に入力しようとしているため、Mysql Union を実行しています。

なぜこれが機能しないのですか?

助けてくれてありがとう!!

私の JQUERy コードは次のようになります。

<script>
    $(function() {
        $( "#search" ).autocomplete({
            source: "suggest.php"
        });
    });
</script>
4

1 に答える 1

4

まず第一に、PHP コードはSQL インジェクション攻撃に対して脆弱です。さらに、mysql_* 関数は非推奨です。代わりに、PDOを使用してください。

間違ったクエリ変数を読み取っているため、コードは失敗します。jQuery UI オートコンプリート プラグインは検索クエリのパラメーターを使用するため$_GET['q']、空です。を空にして、SQL クエリを実行します。term$queryString

SELECT name FROM company WHERE name LIKE '%'   -- UNION ...

もちろん、これはすべてを返します。あなたがしたい:

<?php
include("config.php");
$db = new PDO('mysql:host=localhost;dbname=database', 'user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if (!isset($_GET['term'])) {
    header('HTTP/1.0 400 Bad Request');
    echo 'Missing term parameter in request';
    exit();
}
$queryString = strtolower($_GET["term"]);
$query = $db->prepare("SELECT name FROM company WHERE name LIKE :qs" .
  " UNION SELECT cat AS name FROM cat WHERE cat LIKE :qs" .
  " UNION SELECT subcat AS name FROM subcat WHERE subcat LIKE :qs " .
  " LIMIT 10");
$query->execute(array(':qs' => $queryString . '%'));
$query->setFetchMode(PDO::FETCH_NAMED);
$result = array_map(function($row) {
    return array('label'=>$row['name'],'value'=>$row['name']);
}, $query->fetchAll());

header('Content-Type: application/json');
echo(json_encode($result));

これは、ライブでダウンロード可能な (データベースを含む) デモです。

于 2012-08-12T21:06:56.460 に答える