Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как парсить массив данных через JSON?

Константин Ефименко Гуру (3721), закрыт 4 года назад
У меня есть многострочный select, в котором нужно вывести отфильтрованный список option. Здесь jquery берёт критерий фильтрации из input, и методом POST отправляет на php, ожидая ответа.
$('.Or-fio').on('keypress', function(e) {
if (e.which == 13) {
var fio = $('.Or-fio').val();
$.post("fio.php", "fio-str=" + fio, function (data) {
var jsonData = JSON.parse(data);

}
});
e.preventDefault();
}
});

Здесь мы фильтруем нужные данные и получаем массив, который в виде строки отправляем обратно на js.
$fiostr = $_POST['fio-str'];
$sql = ("SELECT FIO FROM [MyBD] WHERE Fam = '$fiostr' OR Imy = '$fiostr' OR Otch = '$fiostr' ORDER BY Fam");
if ($stmt = sqlsrv_query($conn, $sql)) {
while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$data[] = $row;
}
echo json_encode($data, JSON_UNESCAPED_UNICODE);
}

Я пытался делать что-то вроде:
for (var i = 0; i < jsonData.counters.length; i++) {
var counter = jsonData.counters[i];
$('.left').html('<option data-num="" value="'+counter+'">'+counter+'</option>');
Но это просто не работает, ничего не происходит.

Помогите составить цикл, чтобы вывести данные.
Лучший ответ
Андрей Высший разум (425593) 4 года назад
1. var jsonData = JSON.parse(data); не нужно. $.post умеет САМ преобразовывать данные в JSON. Обрати внимание на параметр dataType:
http://jquery.page2page.ru/index.php5/Ajax_запрос_методом_POST

2. Данные, возвращаемые PHP-скриптом, должны иметь заголовок:
Content-Type: application/json
https://www.php.net/manual/ru/function.header.php

3. Метод html ПЕРЕЗАПИСЫВАЕТ содержимое элемента. В результате выполнения в цикле $('.left').html(...) у тебя в .left окажется ОДИН option - который был в массиве последним. Чтобы ДОБАВЛЯТЬ элементы, надо использовать:
http://jquery.page2page.ru/index.php5/Добавление_содержимого_в_конец_элементов

4. jsonData у тебя имеет формат: [{FIO: "aaa"}, {FIO: "bbb"}, ..] - простой массив объектов. В нём НЕТ никаких counters. Именно такие данные ты формируешь своим PHP-скриптом.

5. Библиотека sqlsrv УМЕЕТ работать с подготовленными запросами:
https://www.php.net/manual/ru/function.sqlsrv-prepare.php
https://www.php.net/manual/ru/function.sqlsrv-query.php
потому вставлять значение непосредственно в запрос - это классический говнокод и классическая же дыра в безопасности. Любой хакер-недоучка сможет организовать на твоём сайте SQL-инъекцию.
Константин ЕфименкоГуру (3721) 4 года назад
Я больше скажу, я проверил алертом и возвратом значения откуда брал. Оказалось что, если оставить как есть, то php ничего не возвращает, если убрать if (){} с php файла, то возвращает null.
Андрей Высший разум (425593) Проверять надо НЕ alert'ом. Нажимаешь в браузере F12 и на вкладке сеть/network смотришь, какой запрос оправляется на сервер и какие данные сервер возвращает браузеру.
Константин ЕфименкоГуру (3721) 4 года назад
Как быть? Я что добавляю header("Content-Type: application/json; charset=UTF-8");, что не добавляю разницы нету.
Остальные ответы
Татьяна Шеховцова Высший разум (419508) 4 года назад
Что такое jsonData.counters и откуда оно взялось - так и не поняла. Оно не задано
Константин ЕфименкоГуру (3721) 4 года назад
Это просто пример который я нашёл. Понятия не имею.
Татьяна Шеховцова Высший разум (419508) Так понимать надо, что пишешь. У тебя никакого counters нет
Похожие вопросы