Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AJAX запрос. Почему срабатывает функция ошибки? Срабатывает функция ошибки хотя запрос у 
:(
    Опции темы
SanychBY
  Дата 4.6.2013, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Здравствуйте. Есть код
Код

$('#button_save').click(function()
    {
        
        var text = $('#text').val();
        $.ajax({type:"POST", dataType:"json", url:"articlejs.php", data:{text:text,a:a}, success: function (data)
        {
        
         $('#text').val('');
        alert(data);
        }, error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            $('#text').val('ERROR'+ XMLHttpRequest +" "+ errorThrown)
            alert(textStatus);},
        });
        
    });

Но по странным причинам срабатывает функция ошибки хотя сам запрос успешно передается(я уверен в это, потому что происходит запись в базу данных)
PM MAIL   Вверх
Arantir
Дата 4.6.2013, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 3
Всего: 55



Цитата(SanychBY @  4.6.2013,  17:55 Найти цитируемый пост)
я уверен в это, потому что происходит запись в базу данных

Запись в базу может происходить раньше той строки, на которой, например, скрипт вылетает с ошибкой 500.
Попробуйте запустить его без ajax (создайте тестовую форму) и посмотрите, что выводится в ответ.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
SanychBY
Дата 4.6.2013, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Цитата(Arantir @  4.6.2013,  19:35 Найти цитируемый пост)
Запись в базу может происходить раньше той строки, на которой, например, скрипт вылетает с ошибкой 500.
Попробуйте запустить его без ajax (создайте тестовую форму) и посмотрите, что выводится в ответ. 

Я раньше использовал этот северный код изменился код AJAX так что PHP точно рабочий

PM MAIL   Вверх
Arantir
Дата 4.6.2013, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 3
Всего: 55



Скажите тогда уж хотя бы что именно за ошибка возникает.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
SanychBY
Дата 5.6.2013, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Цитата(Arantir @  4.6.2013,  23:14 Найти цитируемый пост)
Скажите тогда уж хотя бы что именно за ошибка возникает. 

Я писал уже ребятам на другом форуме http://www.cyberforum.ru/javascript-jquery/thread891072.html буду благодарен если Вы посмотрите
PM MAIL   Вверх
Arantir
Дата 5.6.2013, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 3
Всего: 55



Там все верно говорят. 
Это не json:
Код
echo "{\"rez\": \"Успешно\"}";

потому что корректный json с кириллицей должен выглядеть вот так:
Код
{"rez":"\u0443\u0441\u043f\u0435\u0448\u043d\u043e"}
Без пробелов и без кириллицы.
Соответственно, ваш код падает уже на пробеле.

И обработчика JSON.parse() не нужно, ибо вы же сами указали 
Код
dataType:"json"

JQuery автоматически парсит полученный объект и передает его в первый аргумент колбэка success.



Это сообщение отредактировал(а) Arantir - 5.6.2013, 15:05


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
SanychBY
Дата 5.6.2013, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Цитата(Arantir @  5.6.2013,  15:03 Найти цитируемый пост)
Это не json:

Если это не json то как будет json?
PM MAIL   Вверх
ksnk
Дата 5.6.2013, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



Цитата(SanychBY @  5.6.2013,  15:49 Найти цитируемый пост)
Если это не json то как будет json? 


Цитата(Arantir @  5.6.2013,  15:03 Найти цитируемый пост)
{"rez":"\u0443\u0441\u043f\u0435\u0448\u043d\u043e"}

Вот так  smile 

json генерируется на стороне сервера специальной функцией json_encode.

Код

echo json_encode(array('rez'=>'Успешно'));


Это сообщение отредактировал(а) ksnk - 5.6.2013, 16:15


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SanychBY
Дата 5.6.2013, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Цитата(ksnk @  5.6.2013,  16:15 Найти цитируемый пост)
json генерируется на стороне сервера специальной функцией json_encode.

А просто echo нельзя? 
PM MAIL   Вверх
ksnk
Дата 5.6.2013, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



Можно.  smile Но при этом не работает функция декодирования.

Вообще, с моей точки зрения json слишком жесткий формат. Задумывалось это все явно в виде куска javascript, выдающего некую конструкцию. Со всеми языковыми тонкостями и вкусностями. А получилось как всегда. Вот так у меня обычно используется.
Код

$.ajax({
        url:'/personal/filter/filter.php',
        complete: function(xml,code){
            var data=xml.responseText;
            //console.log(data);
            try{
                eval('data='+data);
                if(data...
                }
            catch(e) { /* trigger error handler */;}
...

так можно вставлять внутрь html комментарии(я так от бедности вставляю отладочную информацию), не заботится об именах в двойных кавычках, и не в коем случае не иначе.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SanychBY
Дата 5.6.2013, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Цитата(ksnk @  5.6.2013,  16:45 Найти цитируемый пост)
Можно.   Но при этом не работает функция декодирования.

Вообще, с моей точки зрения json слишком жесткий формат. Задумывалось это все явно в виде куска javascript, выдающего некую конструкцию. Со всеми языковыми тонкостями и вкусностями. А получилось как всегда. Вот так у меня обычно используется.

Это я понял smile 


Цитата(ksnk @  5.6.2013,  16:45 Найти цитируемый пост)
код Javascript
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
$.ajax({
        url:'/personal/filter/filter.php',
        complete: function(xml,code){
            var data=xml.responseText;
            //console.log(data);
            try{
                eval('data='+data);
                if(data...
                }
            catch(e) { /* trigger error handler */;}
...

так можно вставлять внутрь html комментарии(я так от бедности вставляю отладочную информацию), не заботится об именах в двойных кавычках, и не в коем случае не иначе. 

Это нет  smile 

PM MAIL   Вверх
ksnk
Дата 5.6.2013, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



У сервера результат запрашивается не в виде json, а в виде обычного plain-html. 
Сервер выдает json. Во всяком случае - пытается. Или грохается странным образом с текстовым сообщением об ошибке. 
Получаемый от сервера результат пытаемся "привести к json" простым eval'ом. Если он не приводится - выводим в лог сообщение об ошибке и выписываем само сообщение, чтобы не искать потом его в панели отладки Хрома. 

Обработка ведется в методе complete, так как этот метод обязательно сработает при таймауте, аборте и ошибке. Хотя код староват и у меня зреет ощущение, что сейчас все ошибки с jQuery, которые им обходились, вроде уже исправлены.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Arantir
Дата 5.6.2013, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 3
Всего: 55



Цитата(SanychBY @  5.6.2013,  15:16 Найти цитируемый пост)
А просто echo нельзя?  

Можно, но Вы же не соблюдаете формат json в своем echo. Как минимум кириллица должна быть в виде "\u<код_символа>". Проблелы, возможно, убираются декодировщиком, но их тоже быть не должно. А у вас пробел после двоеточия.

Строка вроде "{rez: "Успешно"}" может быть разве что объектом в коде самого JS-скрипта. Так что, в принципе, ее можно превратить в объект с помощью eval (выполняет текст, как код), как это показал ksnk.

Однако eval надо использовать максимально осознанно. Если в data могут попасть данные, вводимые где-нибудь юзером (например, коммент к статье), то кто-то может сделать всем посетителям полный кавардак и грохнуть браузер бесконечным циклом, который просто вписал в коммент и который потом выполнился у всех, кто посмотрел страницу с комментом.


Цитата(ksnk @  5.6.2013,  15:15 Найти цитируемый пост)
echo json_encode(array('rez'=>'Успешно'));

Это вполне хорошее решение. И не намного сложнее чего-то типа "echo "{\"rez\": \"Успешно\"}";"


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
SanychBY
Дата 5.6.2013, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Цитата(ksnk @  5.6.2013,  17:00 Найти цитируемый пост)
У сервера результат запрашивается не в виде json, а в виде обычного plain-html. 
Сервер выдает json. Во всяком случае - пытается. Или грохается странным образом с текстовым сообщением об ошибке. 
Получаемый от сервера результат пытаемся "привести к json" простым eval'ом. Если он не приводится - выводим в лог сообщение об ошибке и выписываем само сообщение, чтобы не искать потом его в панели отладки Хрома. 

Обработка ведется в методе complete, так как этот метод обязательно сработает при таймауте, аборте и ошибке. Хотя код староват и у меня зреет ощущение, что сейчас все ошибки с jQuery, которые им обходились, вроде уже исправлены. 


Цитата(Arantir @  5.6.2013,  18:07 Найти цитируемый пост)
Можно, но Вы же не соблюдаете формат json в своем echo. Как минимум кириллица должна быть в виде "\u<код_символа>". Проблелы, возможно, убираются декодировщиком, но их тоже быть не должно. А у вас пробел после двоеточия.

Строка вроде "{rez: "Успешно"}" может быть разве что объектом в коде самого JS-скрипта. Так что, в принципе, ее можно превратить в объект с помощью eval (выполняет текст, как код), как это показал ksnk.

Однако eval надо использовать максимально осознанно. Если в data могут попасть данные, вводимые где-нибудь юзером (например, коммент к статье), то кто-то может сделать всем посетителям полный кавардак и грохнуть браузер бесконечным циклом, который просто вписал в коммент и который потом выполнился у всех, кто посмотрел страницу с комментом.

Ребята вот конечный код
Код

var a = location.search;
    
    $('#button_save').click(function()
    {
        
        var text = $('#text').val();
        $.ajax({type:"POST", dataType:"json", url:"articlejs.php", data:{text:text,a:a}, success: function (data)
        {
        
         $('#text').val('');
        alert(data.rez);
        }, error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            $('#text').val('ERROR'+ XMLHttpRequest +" "+ errorThrown)
            alert(textStatus);},
        });
        
    });

И все равно срабатывает функция ошибки
PHP
Код

header('content-type: application/x-javascript; charset=utf-8');
echo json_encode(array('rez'=>'done'));
    
    exit();

PM MAIL   Вверх
Arantir
Дата 5.6.2013, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 3
Всего: 55



Цитата(SanychBY @  5.6.2013,  21:01 Найти цитируемый пост)
header('content-type: application/x-javascript; charset=utf-8');

Правило №1: Не знаешь — не делай.

С чего это вдруг json стал javascript-приложением? о_О
Вообще-то json — это текст. Он может иметь MIME-тип text/plain. Или на худой конец text/html, так как это тоже, в принципе, текст.
Грубо говоря, json-ом его делает только то, что функция JSON.parse с ним не вызовет ошибки. То есть суть лишь в формате, но текст есть текст.

Отвлекитесь слегка от jQuery и поинтересуйтесь, как работает HTTP, JavaScript и AJAX. Чтобы меньше всякой алхимии было =)


У json, конечно, есть MIME-тип application/json, но суть в том, что JS парсит его из текста, который получает с запроса. 

Это сообщение отредактировал(а) Arantir - 5.6.2013, 23:15


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.