Не понятки с JSON
Всем доброго времени суток. Народ, нужна помощь... есть обработчик АЯКСА:
header('Content-Type: application/json; charset=utf-8'); require 'functions.php'; require 'admin/functions.php'; if(isset($_POST['password'])) { function testJson($connect) { $pass = $_POST['password']; // Без всяких пока обработок /* $sql = mysqli_query($connect, "SELECT * FROM `users` WHERE `id` = '$pass'"); $res = mysql_fetch_array($sql); */ $data = array( "err" => 0, "id" => $pass, "name" => $res['name']); $data = json_encode($data); } return $data; } echo testJson($connect); Ну и конечно же сам JQ->Ajax function TestUs(data) { var pass; var user = data; var title = "Введите пароль администратора"; var result = prompt(title, pass); if(result) { $.ajax({ url: "/test.php", type: "POST", data: {password: result}, dataType: 'json', success: function (data) { var result = data; alert(result.err); console.log(result.id); } }); } } Так вот, если в самом обработчике снести инклуды и запрос на выборку, то JSON отправляет и принимает значения как нужно. Пробовал играться и с инклудами и с выборкой, без результатов. Кодировка в UTF-8 без BOM. Куда копать? |
Цитата:
|
Покопал, проблему не решил. Дело в том что в том примере хоть что то приходит от сервера клиенту. А у меня что самое интересное, если открыть фаирбаг -> Сеть, и отправить данные, то во вкладке "Сеть" не отображается отправленный мой ПОСТ запрос, но и алерт срабатывает у меня после SUCCESS, который считывает err=0 в файле test.php. Может сказанное мною сейчас и тупо, но оно и есть так. Я даже не понимаю сейчас как прочитать хотя бы то что сервер якобы отправляет клиенту.
|
Цитата:
|
Сейчас снёс инклуды, и в фаирбаге теперь наблюдаю успешную отправку своего ПОСТ запроса. Но при этом конечно же нарушается подключение к БД и одно из полей в ответе отображается как NULL, ну не суть. Интересно то, что при подключении инклудов, скрипт всё равно выполняется, но в каком то не понятном фоном режиме так сказать...Т.е. если в файле test.php в масииве $data => err, указать к примеру 555, затем вернутся в броузер и сделать рефрэш странички, а затем отправить снова данные ( при подключённых includ'ах ), то в фаирбаге нету отправленного пост запроса в сторону test.php, а алет со значением 555 срабатывает, значит данные всё же отправляются...и...в общем я запутался
|
А что там сложного в mysqli с обработкой, плейсхолер в запрос подставить.
Но если алерт срабатывает у меня после SUCCESS, который считывает err=0, значит JSON корректный возвращается. Если не работает при запросах и подключении, то есть ошибки на сервере, которые возвращаются, парсер JQ при этом не выдаст ошибки "не валидно". |
Цитата:
|
Цитата:
|
Тип принимаемых данных в запросе изменить на text, запрос парсить средствами JS - JSON.parse с обработкой исключительных ситуаций. Уверен, что будет ошибка.
В каком браузере отладка? |
Цитата:
if(isset($_POST['password'])) { function asd() { header('Content-type: application/json; charset: utf-8'); require 'functions.php'; #require 'admin/functions.php'; $pass = $_POST['password']; $sql = mysqli_query($connect, "SELECT * FROM `users` WHERE `id` = '$pass'"); $res = mysql_fetch_array($sql); $data = array( "status" => 1, "id" => $pass, "name" => $res['name']); $data = json_encode($data); return $data; exit(); } } Со включёнными инклудами, JSON отдаёт результат, но стоит раскоментировать выборку к БД, то вообще на глухо молчит. Без выборки возвращает NULL и всё то что я его прошу, с выборкой же всё глушится на тихо |
Цитата:
|
Оригинальный код - а где вызов функции?
|
Цитата:
|
Цитата:
function DeleteUs(data) { var user = data; var pass; var title = "Введите пароль администратора"; var result = prompt(title, pass); if(result) { $.ajax({ url: "test.php", type: "POST", data: {password: result}, dataType: 'json', success: function (data) { var result = data; alert(result.name); console.log(result.name); } }); } } |
А причем тут событие? Действие по умолчанию блокируется, если что-то да есть, и ладно, а так это не важно.
Значит так - не получить объект как результат обработки json в JQ можно либо когда ответа нет (null от сервера), либо данные невалидный json. Как можно проверить написано выше. В FF в отладчике отлично видно и запросы, и ответы сервера, а если их не видим, то их и нет. |
Изменил на JSON.parse(data); При всём текущем положении, теперь в отладке показывается отправка данных, но ответ приходит пустым
.... type: 'json', success: function (data) { var result = JSON.parse(data); alert(result.name); console.log(result.name); // распарсим JSON } |
Цитата:
|
oops :-? Глянул сейчас в консоль, а там вот это:
JSON.parse: unexpected character at line 1 column 1 of the JSON data т.е. ругается на вот эту строку получается var result = JSON.parse(data); Я как то не правильно сделал, да? |
Да что вы зациклились на клиенте - ошибку надо искать на сервере, там она 100%. Ну сколько можно в ступе толочь - проверять и анализировать ответы сервера всеми доступными способами.
С этим затруднения, так что мешает на время сделать обычный GET запрос, обработать его и результат сразу в браузер? Ajax для выяснения этого и не нужен. |
Цитата:
|
Цитата:
И... про ошибку на сервере, сйечас пересоздал файл, сохранил в UTF-8, без BOM, чистый как слеза младенца, сам скрипт: if(isset($_POST['password'])) { function asd() { header('Content-type: application/json; charset: utf-8'); require 'functions.php'; require 'admin/functions.php'; $pass = $_POST['password']; $sql = mysqli_query($connect, "SELECT * FROM `users` WHERE `id` = '$pass'"); $res = mysql_fetch_array($sql); $data = array( "status" => 1, "id" => $pass, "name" => $res['name']); $data = json_encode($data); return $data; exit(); } echo asd(); } Крое этого в файле нет ничего лишнего! Вот вы мне не подскажете, где я тут мог ошибиться? |
Запрос к бд, без лишнего груза:
$sql = mysqli_query($connect, "SELECT * FROM `users` WHERE `id` = '1'"); if(mysqli_num_rows($sql) > 0) { $res = mysqli_fetch_array($sql); echo $res['name']; //Вывод: Петя } |
А вот попытка отправить GET
![]() |
А ведь всё-таки эта мозилла не показывает отправку моего пост запроса, вот что показал Response от Chrome:
![]() |
Цитата:
Цитата:
return $data; exit(); Как может произойти выход, если он объявлен после возврата из функции? Если после условия if(isset($_POST['password'])) {} есть вывод в браузер, то это как раз и породит смесь ежика с ключей проволокой - сперва отдали клиенту json, затем что-то еще, что в итоге не будет json. И это может быть причиной ошибки. Если этот скрипт обрабатывает только этот запрос и более ничего, нет кроме этого иных выводов в браузер, то exit не нужен. Что касается результата GET запроса, то либо вы не понимаете о чем вам говорят, либо я не знаю.... if(isset($_GET['password'])) { function asd() { //header('Content-type: application/json; charset: utf-8'); //лишнее, коли тип ожидаемых данных указан на клиенте require 'functions.php'; require 'admin/functions.php'; //$pass = $_POST['password']; $sql = mysqli_query($connect, "SELECT * FROM `users` WHERE `id` = '$_GET['password']'"); $res = mysql_fetch_array($sql); $data = array( "status" => 1, "id" => $pass, "name" => $res['name']); print_r($data); //это единственное что должно быть в браузере, если нет ошибок и иного вывода в браузер //$data = json_encode($data); //return $data; //exit(); } asd(); } На заголовки то чего смотреть? |
Спасибо всем за настоятельную помощь, благодарю вас за крики, психи и т.д. :) Причина всему была то, что в сам БД запрос, я присылал не существующий ID, от туда и танцы с бубном :write: Ну и соответственно сам вывод массива был не $res['name'] а $res['username']. Вывод: собственная не внимательность:yes: Ещё раз всем спасибо:)
|
Часовой пояс GMT +3, время: 10:25. |