Mysql
 sql >> база данни >  >> RDS >> Mysql

Резултати от текстовото поле за автоматично довършване на базата на SQL база данни

Автоматичното довършване на потребителския интерфейс на jQuery може да приема 3 различни типа стойности на изходната опция :

  1. Масив съдържащ списък с неща, с които да попълните автоматичното завършване
  2. низ съдържащ URL адреса на скрипт, който филтрира списък и ни изпраща резултатите. Плъгинът ще вземе въведен в него текст и ще го изпрати като term параметър в низ на заявка, добавен към URL адреса, който предоставихме.
  3. функция който извлича данните и след това извиква обратно извикване с тези данни.

Вашият оригинален код използва първия, масив.

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

Това, което казва на автоматичното довършване, е, че низът "autocomplete.php" е единственото нещо в списъка с неща за автоматично довършване.

Мисля, че това, което се опитвате да направите, е да го вградите с нещо подобно:

$(function() {

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

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

});

Това вероятно ще работи добре, ако приемем, че списъкът с нещата, които се връщат от базата данни, винаги ще остане кратък. Правенето на това по този начин е малко крехко, тъй като просто вкарвате суров изход от PHP във вашия JS. Ако върнатите данни съдържат " може да се наложи да използвате addSlashes да го избягаш правилно. Трябва обаче да промените заявката, за да върне едно поле, а не * , вероятно искате само едно поле като етикет в автоматичното довършване, а не целия ред.

По-добър подход, особено ако списъкът потенциално може да нарасне много голям, би бил да се използва вторият метод:

$(function() {

  var availableTags = "autocomplete.php";

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

});

Това ще изисква от вас да направите промяна в скрипта на задния край, който грабва списъка, така че да извърши филтриране. Този пример използва подготвено изявление за да се гарантира, че потребителят е предоставил данни в $term не ви отваря до 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);

?>

Измина известно време, откакто съм работил с mysqli, така че този код може да се нуждае от някои настройки, тъй като не е тестван.

Би било добре да придобиете навика да използвате подготвени оператори, тъй като когато се използват правилно, те правят SQL инжектирането невъзможно. Вместо това можете да използвате нормално неподготвено изявление, избягвайки всеки предоставен от потребителя елемент с mysqli_real_escape_string преди да го вмъкнете във вашия SQL израз. Въпреки това , правенето на това е много податливо на грешки. Трябва само да забравите да избягате от едно нещо, за да се отворите за атаки. Повечето от основни "хакове" в най-новата история се дължат на небрежно кодиране, което въвежда уязвимости при инжектиране на SQL.

Ако наистина искате да се придържате към неподготвеното изявление, кодът ще изглежда така:

<?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. Мога ли безопасно да разчитам на главния регистър на името на колона в mysql?

  2. Доктрина 2 и таблица с връзки много към много с допълнително поле

  3. Групиране по дата, връщане на ред, дори ако няма намерени записи

  4. MySQL - ИЗБЕРЕТЕ името, което идва първо по азбучен ред

  5. Съпоставяне, чувствително към главни букви в MySQL