Я пытаюсь создать функцию автозаполнения в текстовое поле, но результат должен исходить из моей базы данных SQL.
Вот код, который я пытаюсь настроить:
index.php :
<html lang="en"> <head> <meta charset="utf-8"> <title>jQuery UI Autocomplete - Default functionality</title> <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css"> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script> <link rel="stylesheet" href="/resources/demos/style.css"> <script> $(function() { var availableTags = [ "autocomplete.php"; ]; $( "#tags" ).autocomplete({ source: availableTags }); }); </script> </head> <body> <div class="ui-widget"> <label for="tags">Tags: </label> <input id="tags"> </div> </body> </html>
EDIT : я изменил содержимое переменной доступныхTags и превратил его в var availableTags = <?php include('autocomplete.php') ?>;
Variable availableTags является источником слов, поэтому я пытаюсь изменить его и вместо этого ставить имя файла, из которого происходит выборка из моей базы данных.
Вот мой файл autocomplete.php :
<?php include('conn.php'); $sql="SELECT * FROM oldemp"; $result = mysqli_query($mysqli,$sql) or die(mysqli_error()); while($row=mysqli_fetch_array($result)) { echo "'".$row['name']."', "; } ?>
в<?php include('conn.php'); $sql="SELECT * FROM oldemp"; $result = mysqli_query($mysqli,$sql) or die(mysqli_error()); while($row=mysqli_fetch_array($result)) { echo "'".$row['name']."', "; } ?>
в<?php include('conn.php'); $sql="SELECT * FROM oldemp"; $result = mysqli_query($mysqli,$sql) or die(mysqli_error()); while($row=mysqli_fetch_array($result)) { echo "'".$row['name']."', "; } ?>
EDIT : также изменил содержимое цикла while и превратил его в
$name=mysqli_real_escape_string($con,$row['name']); $json[]=$name;
Как вставить выбранные слова из autocomplete.php в переменную availableTags ?
EDIT / UPDATE : появляется список, когда я набираю текст в текстовом поле, но в нем нет текста. Я знаю, что это выборка, но само слово не отображается в списке.
Когда используется строка, плагин Autocomplete ожидает, что строка укажет на ресурс URL, который будет возвращать данные JSON.
source: "autocomplete.php"
Поэтому вам нужно вернуть объект JSON.
$json = false; while($row=mysqli_fetch_array($result)) { $json[] = array( 'name' => $row['name'] ); } echo json_encode($json);
в$json = false; while($row=mysqli_fetch_array($result)) { $json[] = array( 'name' => $row['name'] ); } echo json_encode($json);
Ваш файл autocomplete.php,
include('conn.php'); $sql="SELECT * FROM oldemp"; $result = mysqli_query($mysqli,$sql) or die(mysqli_error()); //Create an array $arr = Array(); while($row=mysqli_fetch_array($result)) { array_push($arr,$row['name']); } header('Content-Type: application/json'); echo json_encode($arr) ?>
вinclude('conn.php'); $sql="SELECT * FROM oldemp"; $result = mysqli_query($mysqli,$sql) or die(mysqli_error()); //Create an array $arr = Array(); while($row=mysqli_fetch_array($result)) { array_push($arr,$row['name']); } header('Content-Type: application/json'); echo json_encode($arr) ?>
вinclude('conn.php'); $sql="SELECT * FROM oldemp"; $result = mysqli_query($mysqli,$sql) or die(mysqli_error()); //Create an array $arr = Array(); while($row=mysqli_fetch_array($result)) { array_push($arr,$row['name']); } header('Content-Type: application/json'); echo json_encode($arr) ?>
Результатом этого будет массив JSON, который может быть непосредственно использован в JavaScript. Следовательно, сценарий будет чем-то вроде:
var availableTags = []; $.ajax({ url:"autocomplete.php",success:function(result){ availableTags = result }});
Автозаполнение jQuery UI может принимать 3 разных типа значения параметра источника :
term
в строке запроса, добавленной к URL-адресу, который мы предоставили. В исходном коде используется первый массив.
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); ?>
в<?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); ?>
в<?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); ?>
в<?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); ?>
Решила мою проблему.
Попросите сценарий:
<!-- WITHOUT THESE THREE BELOW, THE AUTOCOMPLETE WILL LOOK UGLY OR WILL NOT WORK AT ALL --> <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css"> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script> <script> $(function() { $( "#tags" ).autocomplete({ source: "autocomplete.php" }); }); </script>
И autocomplete.php ( где мы получим данные для заполнения поля ввода автозаполнения ):
<?php include("conn.php"); /* ESTABLISH CONNECTION IN THIS FILE; MAKE SURE THAT IT IS mysqli_* */ $stmt = $con->prepare("SELECT description FROM table"); /* START PREPARED STATEMENT */ $stmt->execute(); /* EXECUTE THE QUERY */ $stmt->bind_result($description); /* BIND THE RESULT TO THIS VARIABLE */ while($stmt->fetch()){ /* FETCH ALL RESULTS */ $description_arr[] = $description; /* STORE EACH RESULT TO THIS VARIABLE IN ARRAY */ } /* END OF WHILE LOOP */ echo json_encode($description_arr); /* ECHO ALL THE RESULTS */ ?>
в<?php include("conn.php"); /* ESTABLISH CONNECTION IN THIS FILE; MAKE SURE THAT IT IS mysqli_* */ $stmt = $con->prepare("SELECT description FROM table"); /* START PREPARED STATEMENT */ $stmt->execute(); /* EXECUTE THE QUERY */ $stmt->bind_result($description); /* BIND THE RESULT TO THIS VARIABLE */ while($stmt->fetch()){ /* FETCH ALL RESULTS */ $description_arr[] = $description; /* STORE EACH RESULT TO THIS VARIABLE IN ARRAY */ } /* END OF WHILE LOOP */ echo json_encode($description_arr); /* ECHO ALL THE RESULTS */ ?>
Просто предложение для файла автозаполнения. Извините, я бы добавил комментарий выше, но мне не хватает репутации, как писать это.
После успешного внедрения предложения бесполезного кода я заметил, что мои серверные накладные расходы проходили через крышу. Казалось, что ботами были некоторые, как инициировать сценарий, хотя в области ввода не было введенных букв. Я сделал небольшой тест в файле автозаполнения и обнаружил, что он будет запрашивать мою базу данных, даже если этот термин был пустым.
Итак, я просто заключил весь сценарий автозаполнения с инструкцией if … так …
<?php if(!empty($_GET['term'])) { 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); } ?>
в<?php if(!empty($_GET['term'])) { 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); } ?>
в<?php if(!empty($_GET['term'])) { 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); } ?>
… и теперь мой сервер вернулся к нормальной жизни.