Я использую плагин Select2 jquery и не могу получить результаты с помощью json. При поиске ответа json в браузере все выглядит нормально. Вот так например:
[{
"id" : "50",
"family" : "Portulacaceae "}, {
"id" : "76",
"family" : "Styracaceae "}, {
"id" : "137",
"family" : "Dipsacaceae"}
]
URL, вызываемый с помощью ajax, в этом случае: http://localhost/webpage/json_family.php?term=acac&_=1417999511783
но я не могу получить эти результаты на входе select2, консоль говорит:
Uncaught TypeError: Невозможно прочитать свойство ‘length’ из неопределенного
Вот код:
HTML
<input type="hidden" id="select2_family" name="term" style="width:30%" />
JS
$("#select2_family").select2({
minimumInputLength: 3,
ajax: {
url: "json_family.php",
dataType: 'json',
data: function (term) {
return {
term: term,
};
},
results: function (data) {
return { results: data.results };
}
}
});
PHP
$myArray = array();
if ($result = $mysqli->query("SELECT id,family FROM family WHERE family LIKE '%$term%'")) {
$tempArray = array();
while($row = $result->fetch_object()) {
$tempArray = $row;
array_push($myArray, $tempArray);
}
echo json_encode($myArray);
}
Есть ли ошибка в коде?
Хорошо, у меня есть ваш пример работы на моем тестовом сервере, пожалуйста, сделайте следующее
измените свой запрос на это, изменили несколько имен для удобочитаемости, но они должны иметь ту же функциональность, важной частью является добавление «AS TEXT» в запрос
$query = $mysqli->query("SELECT id, family AS text FROM family WHERE family LIKE '%$term%'"));
while ($row = mysql_fetch_assoc($query)) {
$return[] = $row;
}
echo json_encode($return);
во-вторых, похоже, что вы пытаетесь вызвать свойство из ответа json под названием «результаты»
если это так, ваш json должен выглядеть следующим образом, обратите внимание, что семья теперь является текстом из-за изменения выше:
{
"results":
[
{
"id": "50",
"text": "Portulacaceae "},
{
"id": "76",
"text": "Styracaceae "},
{
"id": "137",
"text": "Dipsacaceae"}
]
}
Но ваш php не создает свойства результатов, поэтому измените функцию результатов, чтобы удалить вызов свойства .results
results: function (data) {
return { results: data };
}
окончательный код, который я использовал (обратите внимание, что я не избежал / не очистил $ _GET [термин] и не связал его с запросом, рекомендую это сделать), если у вас все еще есть проблемы, я могу отправить вам ссылку на пример моего сайта
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.css">
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.js"></script>
</head>
<script>
$(document).ready(function () {
$("#select2_family").select2({
minimumInputLength: 3,
ajax: {
url: "select2.php",
dataType: 'json',
data: function (term) {
return {
term: term,
};
},
results: function (data) {
return { results: data };
}
}
});
});
</script>
<input type="hidden" id="select2_family" name="term" style="width:30%" />
</html>
PHP
<?
/*** connection strings ***/
// get the database singleton instance
$yog = MySqlDatabase::getInstance();
// connect
try {
$yog->connect($host, $user, $password, $db_name);
}
catch (Exception $e) {
die($e->getMessage());
}
$term = $_GET['term'];
if (!$term){
$sub = $yog->query("SELECT id, family AS text FROM family");
} else {
$sub = $yog->query("SELECT id, family AS text FROM family where family like '%$term%'");
}
while ($row = mysql_fetch_assoc($sub)) {
$return[] = $row;
}
echo json_encode($return);
?>
Примечание: просто удар в это. Как раз то, что торчало.
У вашего json нет результатов поиска, так что попробуйте.
$("#select2_family").select2({
minimumInputLength: 3,
ajax: {
url: "json_family.php",
dataType: 'json',
data: function (term) {
return {
term: term,
};
},
results: function (data) {
// CHANGED
return { results: data };
}
}
});
изменил запрос — посмотрите, поможет ли это
$myArray = array();
// here
if ($result = $mysqli->query("SELECT id, family AS text FROM family WHERE family LIKE '%$term%'")) {
$tempArray = array();
while($row = $result->fetch_object()) {
$tempArray = $row;
array_push($myArray, $tempArray);
}
echo json_encode($myArray);
}
вам нужно определить text
собственность на результаты
и вам может понадобиться добавить formatResult
а также formatSelection
$("#select2_family").select2({
minimumInputLength: 3,
ajax: {
url: "json_family.php",
dataType: 'json',
data: function (term) {
return {
term: term,
};
},
results: function (data) {return { results: data, text: 'family'}; },
formatResult: function(item) { return item.family; },
formatSelection: function(item) { return item.family; }
}
});