автозаполнения JQuery UI может принимать 3 различных типов значений source option:
- массив, содержащий список вещей, которые необходимо заполнить автозаполнение:
- A строка содержит URL-адрес скрипта, который фильтрует список и отправляет нам результаты. Плагин примет текст, введенный в него, и отправит его как параметр
term
в строку запроса, добавленную к URL-адресу, который мы предоставили.
- A Функция, которая извлекает данные, а затем вызывает обратный вызов с этими данными.
В исходном коде используется первый массив.
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
});
});
Это потребует от вас внести изменения в серверном скрипт, который захватывая список, чтобы он выполнял фильтрацию. В этом примере используется prepared statement для обеспечения при условии, пользовательские данные в $term
не открывает вам до 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);
?>
Это было некоторое время, так как я работал с MySQLi, так что код может потребоваться некоторые настройки, как это не был протестирован.
Было бы неплохо привыкнуть к использованию подготовленных операторов, поскольку при правильном использовании они делают невозможным внедрение SQL. Вместо этого вы можете использовать обычный незаготовленный оператор, избегая каждого элемента, предоставленного пользователем, с помощью mysqli_real_escape_string, прежде чем вставлять его в свой SQL-запрос. Однако, делая это очень подвержен ошибкам. Только нужно забывать о том, чтобы избежать одной вещи, чтобы открыть себя атаками. Большинство из major "hacks" в новейшей истории связаны с неаккуратным кодированием, которое представляет собой уязвимости 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);
?>
И вопрос в том, что? – Mattt
Отредактировано сообщение. Вопрос теперь включен в конце. –
Позвольте мне сообщить вам, что серийное редактирование, как правило, неодобрительно. Можно отредактировать сообщение или два изредка и по какой-то причине. Но незначительные формулировки, сделанные в пучках, НЕ являются способ пойти. –