Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Automatische Vervollständigung von Textbox-Ergebnissen basierend auf der SQL-Datenbank

Die automatische Vervollständigung der jQuery-Benutzeroberfläche kann 3 verschiedene Arten von Werten der Quellenoption annehmen :

  1. Ein Array enthält die Liste der Dinge, mit denen die automatische Vervollständigung ausgefüllt werden soll
  2. Eine Zeichenfolge enthält die URL eines Skripts, das eine Liste filtert und uns die Ergebnisse sendet. Das Plugin nimmt den darin eingegebenen Text und sendet ihn als term Parameter in einer Abfragezeichenfolge, die an die von uns bereitgestellte URL angehängt wird.
  3. Eine Funktion die die Daten abruft und dann einen Rückruf mit diesen Daten aufruft.

Ihr ursprünglicher Code verwendet das erste, ein Array.

var availableTags = [
  "autocomplete.php";
];

Was die Autovervollständigung sagt, ist, dass die Zeichenfolge "autocomplete.php" ist das Einzige in der Liste der Dinge, die automatisch vervollständigt werden.

Ich denke, was Sie versucht haben, ist, es mit so etwas einzubetten:

$(function() {

  var availableTags = [
    <?php include("autocomplete.php"); /* include the output of autocomplete as array data */ ?>;
  ];

  $( "#tags" ).autocomplete({
    source: availableTags
  });

});

Das würde wahrscheinlich funktionieren, wenn man davon ausgeht, dass die Liste der Dinge, die von der Datenbank zurückgegeben werden, immer kurz bleibt. Dies auf diese Weise zu tun, ist jedoch etwas zerbrechlich, da Sie nur die Rohausgabe von PHP in Ihr JS schieben. Wenn die zurückgegebenen Daten " enthalten möglicherweise müssen Sie addSlashes verwenden ihm richtig zu entkommen. Sie sollten die Abfrage jedoch so ändern, dass sie statt * ein einzelnes Feld zurückgibt , möchten Sie wahrscheinlich nur ein Feld als Beschriftung in der automatischen Vervollständigung verwenden, nicht die gesamte Zeile.

Ein besserer Ansatz, insbesondere wenn die Liste potenziell sehr groß werden könnte, wäre die Verwendung der zweiten Methode:

$(function() {

  var availableTags = "autocomplete.php";

  $( "#tags" ).autocomplete({
    source: availableTags
  });

});

Dazu müssen Sie eine Änderung am Back-End-Skript vornehmen, das die Liste erfasst, damit es die Filterung durchführt. Dieses Beispiel verwendet eine vorbereitete Anweisung um die vom Benutzer bereitgestellten Daten in $term sicherzustellen öffnet Sie nicht für SQL-Injection :

<?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);

?>

Es ist schon eine Weile her, dass ich mit mysqli gearbeitet habe, daher muss dieser Code möglicherweise etwas angepasst werden, da er nicht getestet wurde.

Es wäre gut, sich daran zu gewöhnen, vorbereitete Anweisungen zu verwenden, da sie bei richtiger Verwendung eine SQL-Einschleusung unmöglich machen. Sie können stattdessen eine normale, nicht vorbereitete Anweisung verwenden und jedes vom Benutzer bereitgestellte Element mit mysqli_real_escape_string bevor Sie es in Ihre SQL-Anweisung einfügen. Allerdings , ist dies sehr fehleranfällig. Man muss nur vergessen, einer Sache zu entkommen, um sich Angriffen auszusetzen. Die meisten der große "Hacks" in der jüngeren Geschichte sind auf schlampige Codierung zurückzuführen, die Schwachstellen durch SQL-Injektion einführt.

Wenn Sie wirklich bei der nicht vorbereiteten Anweisung bleiben wollen, würde der Code in etwa so aussehen:

<?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);
?>