sql >> Databasteknik >  >> RDS >> Mysql

Autoslutför textrutaresultat baserade från SQL-databas

JQuery UI autocomplete kan ta tre olika typer av värden av källalternativet :

  1. En matris som innehåller listan över saker att fylla i automatisk komplettering med
  2. En sträng som innehåller webbadressen till ett skript som filtrerar en lista och skickar oss resultaten. Insticksprogrammet tar text som skrivits in i det och skickar det som en term parametern i en frågesträng som läggs till webbadressen vi angav.
  3. En funktion som hämtar datan och sedan ringer upp en återuppringning med den datan.

Din ursprungliga kod använder den första, en array.

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

Det som talar om för autokompletteringen är att strängen "autocomplete.php" är det enda i listan över saker att autokomplettera med.

Jag tror att det du försökte göra är att bädda in det med något sånt här:

$(function() {

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

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

});

Det skulle förmodligen fungera okej förutsatt att listan över saker som returneras från databasen alltid kommer att förbli kort. Att göra det på detta sätt är dock lite bräckligt eftersom du bara trycker in råutdata från PHP till din JS. Om den returnerade informationen innehåller " du kanske måste använda addSlashes för att slippa det korrekt. Du bör dock ändra frågan så att den returnerar ett enskilt fält istället för * , du vill förmodligen bara ha ett fält som etikett i autoslutförandet, inte hela raden.

Ett bättre tillvägagångssätt, särskilt om listan potentiellt skulle kunna bli mycket stor, skulle vara att använda den andra metoden:

$(function() {

  var availableTags = "autocomplete.php";

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

});

Detta kräver att du gör en ändring i back-end-skriptet som tar tag i listan så att det utför filtreringen. Det här exemplet använder ett förberett uttalande för att säkerställa att användaren tillhandahållit data i $term öppnar dig inte för SQL-injektion :

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

?>

Det var ett tag sedan jag arbetade med mysqli, så den koden kan behöva finjusteras eftersom den inte har testats.

Det skulle vara bra att ta för vana att använda förberedda satser eftersom de när de används på rätt sätt omöjliggör SQL-injektion. Du kan istället använda ett normalt icke-förberett uttalande, och undslippa varje objekt som användaren tillhandahåller med mysqli_real_escape_string innan du infogar den i din SQL-sats. Men , att göra detta är mycket felbenäget. Det krävs bara att du glömmer att fly en sak för att öppna dig för attacker. De flesta av stora "hack" i den senaste historien beror på slarvig kodning som introducerar SQL-injektionssårbarheter.

Om du verkligen vill hålla fast vid det icke-förberedda uttalandet, skulle koden se ut ungefär så här:

<?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. Utveckla PostgreSQL för Windows, del 1

  2. Hur man inaktiverar CDC på en uppsättning tabeller ELLER inaktiverar på alla tabeller i en databas i SQL Server - SQL Server Tutorial

  3. Analysera XML till SQL Server

  4. Gruppera efter dataintervall