0

Jquery UIのオートコンプリート機能を使用して、データベースのユーザー名をクエリしようとしています。したがって、ユーザーは私のデータベースにあるものと同様のユーザー名を入力し、オートコンプリートはドロップダウンで探しているものを推測すると想定されます。残念ながら、バックエンドスクリプトで提案を返すことができません。

<?php

sleep( 3 );
// no term passed - just exit early with no response
if (empty($_GET['term'])) exit ;
$q = strtolower($_GET["term"]);
// remove slashes if they were magically added
if (get_magic_quotes_gpc()) $q = stripslashes($q);

$sql = "SELECT * FROM users";   
$r = mysql_query($sql);
$items = array();
if ( $r !== false && mysql_num_rows($r) > 0 ) { 
    while ( $a = mysql_fetch_assoc($r) ) {  
        $username = $a['username'];
        array_push($items, $username);              
        }
}

$result = array();
foreach ($items as $key=>$value) {
    if (strpos(strtolower($key), $q) !== false) {
        array_push($result, array("id"=>$k, "label"=>$key, "value" => strip_tags($key)));
    }
    if (count($result) > 11)
        break;
}

// json_encode is available in PHP 5.2 and above, or you can install a PECL module in earlier versions
echo json_encode($result);
/* echo $items; */

?>

スクリプトは、結果を返す必要がある場合でも、単に空の配列を返します。ここで何が悪いのかわかりません。

4

1 に答える 1

1

まず、データベースにクエリを実行し、テーブル全体を返して結果をふるいにかけるのは適切な方法ではありません。SQLクエリは、データベースからのデータをフィルタリングしている場合、より高速に実行されます。とにかくデータを呼び出す必要があります。それをフィルタリングして、関連する結果のみを返すのはなぜですか?

次のように、クエリにLikeパラメータを送信する必要があります。

$sql = "SELECT * FROM users where username like :term";

(この場合、SQLインジェクション攻撃から保護するために使用する必要があるパラメーター化されたクエリを使用しています。)

次のように、より不安定な方法を使用することもできます。

$sql = "SELECT * FROM users WHERE username = ". $term;

パラメータ化されたクエリのリファレンス: PHPでSQLインジェクションを防ぐにはどうすればよいですか?

于 2012-07-29T23:54:43.053 に答える