O preenchimento automático da interface do usuário do jQuery pode receber 3 tipos diferentes de valores da opção de origem :
- Uma matriz contendo a lista de itens a serem preenchidos automaticamente
- Uma sequência contendo a URL de um script que filtra uma lista e nos envia os resultados. O plug-in pegará o texto digitado nele e o enviará como um
term
parâmetro em uma string de consulta anexada ao URL que fornecemos. - Uma função que recupera os dados e, em seguida, chama um retorno de chamada com esses dados.
Seu código original usa o primeiro, um array.
var availableTags = [
"autocomplete.php";
];
O que isso diz ao preenchimento automático é que a string
"autocomplete.php"
é a única coisa na lista de coisas para completar automaticamente. Acho que o que você estava tentando fazer é incorporá-lo com algo assim:
$(function() {
var availableTags = [
<?php include("autocomplete.php"); /* include the output of autocomplete as array data */ ?>;
];
$( "#tags" ).autocomplete({
source: availableTags
});
});
Isso provavelmente funcionaria bem, assumindo que a lista de coisas que estão sendo retornadas do banco de dados sempre permanecerá curta. Fazer isso dessa maneira é meio frágil, já que você está apenas empurrando a saída bruta do PHP para o seu JS. Se os dados retornados contiverem
"
você pode ter que usar addSlashes
para escapar dele corretamente. No entanto, você deve alterar a consulta para retornar um único campo em vez de *
, você provavelmente deseja apenas um campo como rótulo no preenchimento automático e não a linha inteira. Uma abordagem melhor, especialmente se a lista pudesse crescer muito, seria usar o segundo método:
$(function() {
var availableTags = "autocomplete.php";
$( "#tags" ).autocomplete({
source: availableTags
});
});
Isso exigirá que você faça uma alteração no script de back-end que está capturando a lista para que ele faça a filtragem. Este exemplo usa uma instrução preparada para garantir que o usuário forneceu dados em
$term
não abre você para injeção de 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);
?>
Já faz um tempo desde que eu trabalhei com mysqli, então esse código pode precisar de alguns ajustes, pois não foi testado.
Seria bom adquirir o hábito de usar instruções preparadas, pois quando usadas corretamente, elas impossibilitam a injeção de SQL. Em vez disso, você pode usar uma instrução normal não preparada, escapando de cada item fornecido pelo usuário com mysqli_real_escape_string antes de inseri-lo em sua instrução SQL. No entanto , fazer isso é muito propenso a erros. Basta esquecer de escapar de uma coisa para se abrir a ataques. A maioria dos principais "hacks" na história recente são devidos à codificação desleixada que introduz vulnerabilidades de injeção de SQL.
Se você realmente quiser ficar com a declaração não preparada, o código seria algo assim:
<?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);
?>