jQuery UIオートコンプリートは、ソースオプション の3種類の値を取ることができます。 :
- 配列 オートコンプリートに入力するもののリストが含まれています
- 文字列 リストをフィルタリングして結果を送信するスクリプトのURLが含まれています。プラグインは入力されたテキストを受け取り、
term
として送信します 提供したURLに追加されたクエリ文字列のパラメータ。 - 関数 データを取得し、そのデータを使用してコールバックを呼び出します。
元のコードは最初の配列を使用しています。
var availableTags = [
"autocomplete.php";
];
オートコンプリートを示すのは、文字列"autocomplete.php"
オートコンプリートするもののリストにあるのはこれだけです。
あなたがやろうとしていたことは、次のようなものを埋め込んだことだと思います:
$(function() {
var availableTags = [
<?php include("autocomplete.php"); /* include the output of autocomplete as array data */ ?>;
];
$( "#tags" ).autocomplete({
source: availableTags
});
});
データベースから返されるもののリストが常に短いままであると仮定すると、それはおそらく問題なく機能します。 PHPからの生の出力をJSに押し込んでいるだけなので、このようにするのはちょっと壊れやすいです。返されたデータに"
が含まれている場合 addSlashes
を使用する必要がある場合があります 正しくエスケープします。ただし、*
ではなく単一のフィールドを返すようにクエリを変更する必要があります 、行全体ではなく、オートコンプリートのラベルとして1つのフィールドのみが必要になる可能性があります。
特にリストが非常に大きくなる可能性がある場合は、2番目の方法を使用することをお勧めします。
$(function() {
var availableTags = "autocomplete.php";
$( "#tags" ).autocomplete({
source: availableTags
});
});
これには、リストを取得しているバックエンドスクリプトに変更を加えて、フィルタリングを実行する必要があります。この例では、プリペアドステートメント
を使用しています。 ユーザーが$term
にデータを提供したことを確認します SQLインジェクション
を利用できません :
<?php
include('conn.php');
// when it calls autocomplete.php, jQuery will add a term parameter
// for us to use in filtering the data we return. The % is appended
// because we will be using the LIKE operator.
$term = $_GET['term'] . '%';
$output = array();
// the ? will be replaced with the value that was passed via the
// term parameter in the query string
$sql="SELECT name FROM oldemp WHERE name LIKE ?";
$stmt = mysqli_stmt_init($mysqli);
if (mysqli_stmt_prepare($stmt, $sql)) {
// bind the value of $term to ? in the query as a string
mysqli_stmt_bind_param($stmt, 's', $term);
mysqli_stmt_execute($stmt);
// binds $somefield to the single field returned by the query
mysqli_stmt_bind_result($stmt, $somefield);
// loop through the results and build an array.
while (mysqli_stmt_fetch($stmt)) {
// because it is bound to the result
// $somefield will change on every loop
// and have the content of that field from
// the current row.
$output[] = $somefield;
}
mysqli_stmt_close($stmt);
}
mysqli_close($mysqli);
// output our results as JSON as jQuery expects
echo json_encode($output);
?>
mysqliを使用してからしばらく経ちました。そのため、コードはテストされていないため、微調整が必要になる場合があります。
プリペアドステートメントを適切に使用するとSQLインジェクションが不可能になるため、プリペアドステートメントを使用する習慣を身に付けるとよいでしょう。代わりに、通常のプリペアドされていないステートメントを使用して、ユーザーが提供したすべてのアイテムを mysqli_real_escape_string SQLステートメントに挿入する前に。 ただし 、これを行うとエラーが発生しやすくなります。攻撃にさらされるためには、1つのことを逃れるのを忘れるだけです。 主要な「ハッキング」 最近の歴史では、SQLインジェクションの脆弱性を導入するずさんなコーディングが原因です。
プリペアドされていないステートメントを本当に使い続けたい場合、コードは次のようになります。
<?php
include('conn.php');
$term = $_GET['term'];
$term = mysqli_real_escape_string($mysqli, $term);
$output = array();
$sql = "SELECT name FROM oldemp WHERE name LIKE '" . $term . "%';";
$result = mysqli_query($mysqli,$sql) or die(mysqli_error());
while($row=mysqli_fetch_array($result))
{
$output[] = $row['name'];
}
mysqli_close($mysqli);
// output our results as JSON as jQuery expects
echo json_encode($output);
?>