Automatické doplňování uživatelského rozhraní jQuery může nabývat 3 různých typů hodnot možnosti zdroje :
- Pole obsahující seznam věcí, kterými se má automaticky vyplnit
- řetězec obsahující URL skriptu, který filtruje seznam a posílá nám výsledky. Plugin převezme text zadaný do něj a odešle jej jako
term
parametr v řetězci dotazu připojeném k adrese URL, kterou jsme poskytli. - funkce který načte data a poté zavolá zpětné volání s těmito daty.
Váš původní kód používá první, pole.
var availableTags = [
"autocomplete.php";
];
To, co říká automatickému dokončování, je řetězec "autocomplete.php"
je jediná věc v seznamu věcí, se kterými se má automatické doplňování provádět.
Myslím, že to, o co jste se pokoušeli, je vložit to do něčeho takového:
$(function() {
var availableTags = [
<?php include("autocomplete.php"); /* include the output of autocomplete as array data */ ?>;
];
$( "#tags" ).autocomplete({
source: availableTags
});
});
To by pravděpodobně fungovalo dobře za předpokladu, že seznam věcí, které se vracejí z databáze, bude vždy krátký. Dělat to tímto způsobem je však poněkud křehké, protože do svého JS pouze vkládáte surový výstup z PHP. Pokud vrácená data obsahují "
možná budete muset použít addSlashes
aby to správně uniklo. Měli byste však změnit dotaz tak, aby vracel jedno pole, nikoli *
, pravděpodobně budete chtít jako štítek v automatickém doplňování pouze jedno pole, nikoli celý řádek.
Lepším přístupem, zvláště pokud by se seznam mohl potenciálně velmi zvětšit, by bylo použít druhou metodu:
$(function() {
var availableTags = "autocomplete.php";
$( "#tags" ).autocomplete({
source: availableTags
});
});
To bude vyžadovat, abyste provedli změnu v back-end skriptu, který získává seznam, aby provedl filtrování. Tento příklad používá připravené prohlášení
abychom zajistili, že uživatel poskytl data v $term
neotevře vám vložení 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);
?>
Je to už nějakou dobu, co jsem pracoval s mysqli, takže tento kód možná bude potřebovat nějaké úpravy, protože nebyl testován.
Bylo by dobré si zvyknout na používání připravených příkazů, protože při správném použití znemožňují vkládání SQL. Místo toho můžete použít běžný nepřipravený příkaz, který každou položku poskytnutou uživatelem unikne pomocí mysqli_real_escape_string než jej vložíte do příkazu SQL. Nicméně , je to velmi náchylné k chybám. Stačí zapomenout uniknout jedné věci, abyste se otevřeli útokům. Většina hlavní "hacky" v nedávné historii jsou způsobeny nedbalým kódováním, které zavádí zranitelnost SQL injection.
Pokud opravdu chcete zůstat u nepřipraveného příkazu, kód by vypadal asi takto:
<?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);
?>