Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не понятки с JSON (https://javascript.ru/forum/jquery/61036-ne-ponyatki-s-json.html)

sergei1094 01.02.2016 20:24

Не понятки с 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. Куда копать?

laimas 01.02.2016 21:02

Цитата:

Сообщение от sergei1094
$pass = $_POST['password']; // Без всяких пока обработок

Почему или просто как пример?

sergei1094 01.02.2016 21:05

Покопал, проблему не решил. Дело в том что в том примере хоть что то приходит от сервера клиенту. А у меня что самое интересное, если открыть фаирбаг -> Сеть, и отправить данные, то во вкладке "Сеть" не отображается отправленный мой ПОСТ запрос, но и алерт срабатывает у меня после SUCCESS, который считывает err=0 в файле test.php. Может сказанное мною сейчас и тупо, но оно и есть так. Я даже не понимаю сейчас как прочитать хотя бы то что сервер якобы отправляет клиенту.

sergei1094 01.02.2016 21:07

Цитата:

Сообщение от laimas (Сообщение 405961)
Почему или просто как пример?

Просто как пример. Я с JSON только начинаю работать, по этому не углубляюсь сейчас безопасностью своего тестового скрипта

sergei1094 01.02.2016 21:19

Сейчас снёс инклуды, и в фаирбаге теперь наблюдаю успешную отправку своего ПОСТ запроса. Но при этом конечно же нарушается подключение к БД и одно из полей в ответе отображается как NULL, ну не суть. Интересно то, что при подключении инклудов, скрипт всё равно выполняется, но в каком то не понятном фоном режиме так сказать...Т.е. если в файле test.php в масииве $data => err, указать к примеру 555, затем вернутся в броузер и сделать рефрэш странички, а затем отправить снова данные ( при подключённых includ'ах ), то в фаирбаге нету отправленного пост запроса в сторону test.php, а алет со значением 555 срабатывает, значит данные всё же отправляются...и...в общем я запутался

laimas 01.02.2016 21:19

А что там сложного в mysqli с обработкой, плейсхолер в запрос подставить.

Но если алерт срабатывает у меня после SUCCESS, который считывает err=0, значит JSON корректный возвращается. Если не работает при запросах и подключении, то есть ошибки на сервере, которые возвращаются, парсер JQ при этом не выдаст ошибки "не валидно".

sergei1094 01.02.2016 21:27

Цитата:

Сообщение от Rise (Сообщение 405967)
sergei1094, до конца читать не пробовал, чем всё закончилось смотрел?

Я ведь вроде доступно вам выразил что с кодировками у меня всё нормально, я и пересоздавал файлы, и пересохранял играясь с кодировками и тему я ту тоже всю прочитал что вы мне посоветовали, не нашёл я в той теме ответа на свой вопрос. У меня есть и по мимо этого всего файл функций с php скриптами, довольно-таки глобальный, используемый в одном из своих реальных сетевых проектов, этот файл чист как слеза, без всяких тому BOM и тому прочих, пробовал отправлять и на него JSON, и всё равно беда обламывается на том что как только я пытаюсь с коннектироватся к БД или подключаю инклуд, либо вообще ничего не отправляется и не приходят никакие ответы, либо "как то там в фоновом режиме отправляется", то чего я не вижу...но и ответ в виде алерта долетает с фиксированным значением, указанным в массиве $data

sergei1094 01.02.2016 21:29

Цитата:

Сообщение от laimas (Сообщение 405969)
А что там сложного в mysqli с обработкой, плейсхолер в запрос подставить.

Но если алерт срабатывает у меня после SUCCESS, который считывает err=0, значит JSON корректный возвращается. Если не работает при запросах и подключении, то есть ошибки на сервере, которые возвращаются, парсер JQ при этом не выдаст ошибки "не валидно".

Как он может корректно возвращаться, если я его не вижу в фаирбаге? Как мне отслеживать тогда то, что я отправляю!?

laimas 01.02.2016 21:46

Тип принимаемых данных в запросе изменить на text, запрос парсить средствами JS - JSON.parse с обработкой исключительных ситуаций. Уверен, что будет ошибка.

В каком браузере отладка?

sergei1094 01.02.2016 21:48

Цитата:

Сообщение от Rise (Сообщение 405973)
sergei1094, включаемые файлы могут включать другие файлы, другие файлы могут включать также другие файлы и тд, следовательно все цепочки файлов подлежат проверке на предмет 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(); 
    }  
}


Со включёнными инклудами, JSON отдаёт результат, но стоит раскоментировать выборку к БД, то вообще на глухо молчит. Без выборки возвращает NULL и всё то что я его прошу, с выборкой же всё глушится на тихо

sergei1094 01.02.2016 21:50

Цитата:

Сообщение от laimas (Сообщение 405974)
Тип принимаемых данных в запросе изменить на text, запрос парсить средствами JS - JSON.parse с обработкой исключительных ситуаций. Уверен, что будет ошибка.

В каком браузере отладка?

Mozilla FireFox -> делаю отладку тут. А по поводу JSON.parse, на сколько я знаю что не обязательно использовать данную функцию, если в параметрах отправки указать dataType: 'json'

laimas 01.02.2016 21:50

Оригинальный код - а где вызов функции?

laimas 01.02.2016 21:52

Цитата:

Сообщение от sergei1094
А по поводу JSON.parse, на сколько я знаю что не обязательно использовать данную функцию, если в параметрах отправки указать dataType: 'json'

А вы читаете что вам пишут? JQ вообще тупо промолчит, если самому не побеспокоится, в случае, если парсинг json завершится ошибкой.

sergei1094 01.02.2016 21:55

Цитата:

Сообщение от laimas (Сообщение 405979)
Оригинальный код - а где вызов функции?

Вызов функции висит на onclick по ссылке, вот оригинальный код:

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);
                
            }
        });    
    }
}

laimas 01.02.2016 22:02

А причем тут событие? Действие по умолчанию блокируется, если что-то да есть, и ладно, а так это не важно.

Значит так - не получить объект как результат обработки json в JQ можно либо когда ответа нет (null от сервера), либо данные невалидный json. Как можно проверить написано выше. В FF в отладчике отлично видно и запросы, и ответы сервера, а если их не видим, то их и нет.

sergei1094 01.02.2016 22:03

Изменил на JSON.parse(data); При всём текущем положении, теперь в отладке показывается отправка данных, но ответ приходит пустым


....
type: 'json',
            success: function (data) {
                
                var result = JSON.parse(data);
                alert(result.name);
                console.log(result.name); // распарсим JSON
                
            }

sergei1094 01.02.2016 22:04

Цитата:

Сообщение от laimas (Сообщение 405983)
А причем тут событие? Действие по умолчанию блокируется, если что-то да есть, и ладно, а так это не важно.

Значит так - не получить объект как результат обработки json в JQ можно либо когда ответа нет (null от сервера), либо данные невалидный json. Как можно проверить написано выше. В FF в отладчике отлично видно и запросы, и ответы сервера, а если их не видим, то их и нет.

Но ведь алерты долетали до меня :)

sergei1094 01.02.2016 22:06

oops :-? Глянул сейчас в консоль, а там вот это:
JSON.parse: unexpected character at line 1 column 1 of the JSON data


т.е. ругается на вот эту строку получается

var result = JSON.parse(data);


Я как то не правильно сделал, да?

laimas 01.02.2016 22:16

Да что вы зациклились на клиенте - ошибку надо искать на сервере, там она 100%. Ну сколько можно в ступе толочь - проверять и анализировать ответы сервера всеми доступными способами.
С этим затруднения, так что мешает на время сделать обычный GET запрос, обработать его и результат сразу в браузер? Ajax для выяснения этого и не нужен.

laimas 01.02.2016 22:18

Цитата:

Сообщение от sergei1094
JSON.parse: unexpected character at line 1 column 1 of the JSON data

Сервер отдает не json, а смесь ежика с колючей проволокой. Вам об этом не раз говорилось - ошибки на сервере, ищите.

sergei1094 01.02.2016 22:27

Цитата:

Сообщение от sergei1094 (Сообщение 405964)
Просто как пример. Я с JSON только начинаю работать, по этому не углубляюсь сейчас безопасностью своего тестового скрипта

Вы уж меня простите, но свою позицию я как бы изначально вам выразил. Смесь ёжика с колючкой, по моему мнению, ни как не относится к программированию. Вместо того что бы "ходить во круг до около" с вашими подвохами, могли бы и помочь с написанием JS.

И... про ошибку на сервере, сйечас пересоздал файл, сохранил в 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(); 
}


Крое этого в файле нет ничего лишнего! Вот вы мне не подскажете, где я тут мог ошибиться?

sergei1094 01.02.2016 22:30

Запрос к бд, без лишнего груза:

$sql = mysqli_query($connect, "SELECT * FROM `users` WHERE `id` = '1'");

if(mysqli_num_rows($sql) > 0) {

    $res = mysqli_fetch_array($sql);

    echo $res['name'];

   //Вывод: Петя
}

sergei1094 01.02.2016 22:39

А вот попытка отправить GET


sergei1094 01.02.2016 22:49

А ведь всё-таки эта мозилла не показывает отправку моего пост запроса, вот что показал Response от Chrome:


laimas 01.02.2016 22:54

Цитата:

Сообщение от sergei1094
могли бы и помочь с написанием JS.

Еще раз - в методе $.ajax, то бишь с написанием JS проблем как раз нет. А то что не получается в нем чего вам надо, наконец-то вы смогли увидеть. И причиной этому не JS, а код на сервере. И чему учить?

Цитата:

Сообщение от sergei1094
Вот вы мне не подскажете, где я тут мог ошибиться?

В синтаксисе нет, а о результате его работы это вам разбираться. Но что единственное бросается в глаза, так это

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();
}



На заголовки то чего смотреть?

sergei1094 01.02.2016 23:04

Спасибо всем за настоятельную помощь, благодарю вас за крики, психи и т.д. :) Причина всему была то, что в сам БД запрос, я присылал не существующий ID, от туда и танцы с бубном :write: Ну и соответственно сам вывод массива был не $res['name'] а $res['username']. Вывод: собственная не внимательность:yes: Ещё раз всем спасибо:)


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