Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Resultados de caixa de texto de preenchimento automático com base no banco de dados SQL


O preenchimento automático da interface do usuário do jQuery pode receber 3 tipos diferentes de valores da opção de origem :
  1. Uma matriz contendo a lista de itens a serem preenchidos automaticamente
  2. 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.
  3. 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);
?>