Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyniki autouzupełniania pól tekstowych na podstawie bazy danych SQL

Autouzupełnianie jQuery UI może przyjmować 3 różne typy wartości opcji źródła :

  1. tablica zawierający listę rzeczy do wypełnienia autouzupełniania
  2. 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.
  3. 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);
?>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pozyskiwać nowych użytkowników dziennie w MySQL?

  2. Jak uzyskać dane z ostatniego miesiąca w MySQL?

  3. Zmień nazwę tabeli w MySQL

  4. policz 10 najczęściej występujących wartości w kolumnie w mysql

  5. Jaki jest odpowiednik LEN() w MySQL?