Не понятки с 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, время: 17:40. |