Autouzupełnianie jQuery UI może przyjmować 3 różne typy wartości opcji źródła :
- tablica zawierający listę rzeczy do wypełnienia autouzupełniania
- ciąg zawierający adres URL skryptu, który filtruje listę i wysyła nam wyniki. Wtyczka pobierze wpisany do niego tekst i wyśle go jako
term
parametr w ciągu zapytania dołączonym do podanego adresu URL. - Funkcja który pobiera dane, a następnie wywołuje wywołanie zwrotne z tymi danymi.
Twój oryginalny kod używa pierwszej, tablicy.
var availableTags = [
"autocomplete.php";
];
Autouzupełnianie mówi, że ciąg "autocomplete.php"
jest jedyną rzeczą na liście rzeczy do autouzupełniania.
Myślę, że próbowałeś osadzić go w coś takiego:
$(function() {
var availableTags = [
<?php include("autocomplete.php"); /* include the output of autocomplete as array data */ ?>;
];
$( "#tags" ).autocomplete({
source: availableTags
});
});
To prawdopodobnie zadziałałoby dobrze, zakładając, że lista rzeczy zwracanych z bazy danych zawsze będzie krótka. Robienie tego w ten sposób jest jednak trochę kruche, ponieważ po prostu wpychasz surowe dane wyjściowe z PHP do swojego JS. Jeśli zwrócone dane zawierają "
być może będziesz musiał użyć addSlashes
aby poprawnie uciec. Należy jednak zmienić zapytanie, aby zwracało pojedyncze pole, a nie *
, prawdopodobnie potrzebujesz tylko jednego pola jako etykiety w autouzupełnianiu, a nie całego wiersza.
Lepszym podejściem, zwłaszcza jeśli lista mogłaby potencjalnie bardzo się rozrosnąć, byłoby użycie drugiej metody:
$(function() {
var availableTags = "autocomplete.php";
$( "#tags" ).autocomplete({
source: availableTags
});
});
Będzie to wymagało wprowadzenia zmian w skrypcie zaplecza, który pobiera listę, aby wykonać filtrowanie. W tym przykładzie użyto przygotowanej instrukcji
aby upewnić się, że użytkownik dostarczył dane w $term
nie otwiera cię na wstrzyknięcie 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);
?>
Minęło trochę czasu, odkąd pracowałem z mysqli, więc ten kod może wymagać pewnych poprawek, ponieważ nie był testowany.
Dobrze byłoby wyrobić w sobie nawyk korzystania z gotowych instrukcji, ponieważ odpowiednio użyte uniemożliwiają wstrzyknięcie SQL. Zamiast tego możesz użyć zwykłego, nieprzygotowanego oświadczenia, ustępując każdemu elementowi dostarczonemu przez użytkownika za pomocą mysqli_real_escape_string przed wstawieniem go do instrukcji SQL. Jednak , jest to bardzo podatne na błędy. Wystarczy zapomnieć o ucieczce od jednej rzeczy, aby otworzyć się na ataki. Większość główne "hacki" w niedawnej historii są spowodowane niechlujnym kodowaniem, co wprowadza luki w zabezpieczeniach wstrzykiwania SQL.
Jeśli naprawdę chcesz trzymać się nieprzygotowanej instrukcji, kod będzie wyglądał mniej więcej tak:
<?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);
?>