Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   тег option <<многоуровневый>> (https://javascript.ru/forum/dom-window/1263-teg-option-mnogourovnevyjj.html)

griga 18.08.2017 12:15

мы на верном пути!
Теперь в теге
<select>
выдается валидное количество опций подкатегорий, но все они называются
Код:

[object Object]

Nexus 18.08.2017 12:25

griga, посмотри, что передается функции «fillSubcatList», в начало этой функции засунь это:
console.log(elements);

griga 18.08.2017 12:48

Nexus,
Вот сейчас вообще не понял(((
Снова выдает ошибку на строке
var Subcategories=JSON.parse(HTTPReq.responseText);

Ошибка:
Uncaught SyntaxError: Unexpected token < in JSON at position 0
    at JSON.parse (<anonymous>)
    at XMLHttpRequest.HTTPReq.onreadystatechange

Команда
echo json_encode($output);

в файле page.php возвращает следующий результат:
[{"9":"\u0420\u0430\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u043a\u043e\u0441\u043c\u0435\u0442\u0438\u043a\u0430"},{"14":"\u041e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438"},{"16":"\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442"}]

Nexus 18.08.2017 12:59

griga,
в page.php while замените на это и все будет работать:
while($row=$result->fetch_assoc()){
    $output[$row['id']]=addslashes($row['subcategory']);
};

laimas 18.08.2017 13:08

Цитата:

Сообщение от Nexus
addslashes($row['subcategory']);

Зачем?

Nexus 18.08.2017 13:16

Цитата:

Сообщение от laimas (Сообщение 461973)
Зачем?

согласен, нужно убрать «addslashes».

griga 18.08.2017 13:28

Итак,
Теперь код page.php выглядит так:
if(!array_key_exists('category', $_GET)) die();

include('scripts/connect.php');

$query = "SELECT id, subcategory FROM expenses_cat WHERE category='" . $_GET['category'] . "' AND inmenu = 1";
$result = $conn->query($query);
$output = array();

while($row=$result->fetch_assoc()){
    $output[$row['id']]=$row['subcategory'];
};

echo json_encode($output);
exit;

Если заменить $_GET['category'] на одно из реальных значений категории, на выходе получаем данные типа
{"9":"\u0420\u0430\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u043a\u043e\u0441\u043c\u0435\u0442\u0438\u043a\u0430","14":"\u041e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438","16":"\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442"}

В самой же форме при выборе категории консоль отображает ошибку на строке
var Subcategories=JSON.parse(HTTPReq.responseText);

VM3836:1 Uncaught SyntaxError: Unexpected token < in JSON at position 0
    at JSON.parse (<anonymous>)
    at XMLHttpRequest.HTTPReq.onreadystatechange

Может проблема кроется в передаче данных на обработку посредством $_GET?

laimas 18.08.2017 13:29

Nexus,
сервер отдает валидный json, а убрать кодирование многобайтных строк можно начиная с версии 5.4 опцией JSON_UNESCAPED_UNICODE.

Ошибка на клиенте потому, что до передачи json есть еще вывод в браузер.

Nexus 18.08.2017 13:47

Цитата:

Сообщение от laimas
сервер отдает валидный json, а убрать кодирование многобайтных строк можно начиная с версии 5.4 опцией JSON_UNESCAPED_UNICODE.

Сейчас - да, валидный, ранее - инвалидный, в посте №29 это видно.
Можно воспользоваться опцией, а можно убрать экранирование.
(Версия PHP вопрощающего неизвестна, а проверять её в коде - глупость.)

griga,
Цитата:

Сообщение от laimas
Ошибка на клиенте потому, что до передачи json есть еще вывод в браузер.

+ смотри пост №30:
$category=$conn->real_escape_string($_GET['category']);
$query = "SELECT id, subcategory FROM expenses_cat WHERE category='".$category."' AND inmenu = 1";

Цитата:

Сообщение от Nexus
PS. Рекомендую почитать статьи про SQL-инъекции, как минимум.
Статей по этой теме полно, вот первая попавшаяся: https://habrahabr.ru/post/148151/


griga 18.08.2017 14:08

Цитата:

Сообщение от Nexus (Сообщение 461984)
$category=$conn->real_escape_string($_GET['category']);
$query = "SELECT id, subcategory FROM expenses_cat WHERE category='".$category."' AND inmenu = 1";

поправил, но на ошибку никак не влияет.
Что касается среды: локальный сайт на OpenServer:
Apache-PHP-7
PHP 7.0
MySQL 5.6

P.S. Про инъекции почитаю обязательно. Спасибо


Часовой пояс GMT +3, время: 12:26.