sql >> Databáze >  >> RDS >> Mysql

Výsledky automatického doplňování textového pole na základě databáze SQL

Automatické doplňování uživatelského rozhraní jQuery může nabývat 3 různých typů hodnot možnosti zdroje :

  1. Pole obsahující seznam věcí, kterými se má automaticky vyplnit
  2. ř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.
  3. 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);
?>


  1. Konverze datového typu MySQL z varchar na float

  2. MySQL:Curdate() vs Now()

  3. Získejte název dne z data v PostgreSQL

  4. Soubor MySQL my.cnf - Nalezeno možnost bez předchozí skupiny