2015-05-30 3 views
3

Это прослушивало меня в течение последних нескольких часов, и я пробовал различные поиски, но не нашел точно эту проблему с ответом. Может быть, попросить и показать какой-то код поможет мне понять это.PHP JSON Encoded Object вызывает ошибку Ajax

Я использую ajax для создания сообщения на PHP, которое я хочу просто дать уведомление, чтобы я мог обновить div на странице. В этом случае мне просто нужен PHP, чтобы сказать что-то вроде «Cfail», которое javascript будет использовать для обновления содержимого страницы.

Первоначально, я собирался попробовать только текстовые ответы. Итак, мой PHP, например, будет выглядеть так:

<?php 
session_start(); //Because have an encoded captcha answer. 
if(empty($_POST['captinput']) || md5($_POST['captinput']) !== $_SESSION['captchacode']){ 
    echo 'Cfail'; 
} 
?> 

Javascript будет:

$(document).ready(function(){ 

    $('form#Contact').submit(function(e){ 
     e.preventDefault(); 
     var $form = $(this); 
     var formdata = $form.serialize(); 
     var myurl = $form.attr('action'); 
     $('#loader').stop(true).fadeTo(300,1); 

     $.ajax({ 
      url: myurl, 
      dataType: 'text', 
      cache: 'false', 
      type: 'POST', 
      data: formdata, 
      success: function(returned){ 
       $('#loader').stop(true).fadeTo(300,0); 
       if(returned=='Cfail'){ 
        alert("I read it right!"); 
       } 
      } 
     }); 
    }); 
}); 

Он будет проходить через сценарий просто отлично, но результат не был бы то, что я просил , Предупреждение показало коррективный текст, однако исследования показали, что проблема с этим была, по-видимому, добавлением белого пространства. Общим ответом было кодирование ответа JSON. Итак, я попробовал это.

Обновлено PHP:

<?php 
    sesson_start(); // Captcha Stored in Session 
    header('Content-type: application/json'); 
    if(empty($_POST['captinput']) || md5($_POST['captinput']) !== $_SESSION['captchacode']){ 
     $result = array('result' => 'Cfail'); 
     echo json_encode($result); 
     exit; 
    } 
?> 

Обновлено Javascript:

$(document).ready(function(){ 

    $('form#Contact').submit(function(e){ 
     e.preventDefault(); 
     var $form = $(this); 
     var formdata = $form.serialize(); 
     var myurl = $form.attr('action'); 
     $('#loader').stop(true).fadeTo(300,1); 

     $.ajax({ 
      url: myurl, 
      dataType: 'json', 
      cache: 'false', 
      type: 'POST', 
      data: formdata, 
      success: function(returned){ 
       $('#loader').stop(true).fadeTo(300,0); 
       if(returned.result=='Cfail'){ 
        alert("I read it right!"); 
       } 
      } 
     }); 
    }); 
}); 

который теперь больше не работает успешно. Предупреждение не появляется, и объект загрузчика остается видимым (что указывает на то, что успех никогда не проходит). Я попытался помещать блок ошибок в ajax, и он действительно уволил это. Тем не менее, я понятия не имел, как разобрать или даже выяснить, что такое ошибка. Самое большее, что я пытался получить, это то, что выводил PHP, что было {"result": "Cfail"} .... Что я буду EXPECT PHP, чтобы дать мне.

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

EDIT:

мне удалось выяснить, что проблема была в моем случае. У меня было требование («config.php»); между началом сеанса и оператором json_encode if. По какой-то причине добавление внешнего файла, который был только мне, установил пару переменных для дальнейшего кода, некоторый скрытый символ был добавлен до первого {объекта JSON.

Не знаю, почему. Как я уже сказал, это всего лишь $ var = 'stuff'; ситуация в требовании, но, видимо, это вызвало проблемы. :/

+0

что ответ вы получили в опции сети вашего отладчика? –

+0

Глядя на консоль javascript в Chrome, единственные прямые ответы, которые я вижу, - это ответ xhr от php, дающий то, что я ожидаю: {"result": "Cfail"} ... Если мне не хватает вкладки, чтобы посмотреть в? – ABarr

+0

просто посмотрите на выходной отклик, когда вы нажимаете на сетевой URL-адрес, который отображается, когда вы делаете вызов ajax. –

ответ

1

использовать код, приведенный ниже, в вызове успеха назад, первый синтаксический кодированный объект JSON, что вы ПОЛУЧАТЬ от заднего конца и получить доступ к свойству result объекта проверить его значение

success: function(returned){ 
       returned = JSON.parse(returned); 
       $('#loader').stop(true).fadeTo(300,0); 
       if(returned.result=='Cfail'){ 
        alert("I read it right!"); 
       } 
+0

Это не решает проблему вообще, поскольку аспект «успеха» никогда не срабатывает. Он не доходит до возвращаемого значения = JSON.parse (возвращается); ... JSON заставляет ajax отвечать по ошибке, при этом добавление опции ошибки к вызову действительно срабатывает там. Однако единственной ошибкой ответа является {"result": "Cfail"}, что и должно быть вызвано успешным вызовом PHP. Как я уже указывал выше, при просмотре ответа в консоли была красная «пуля» или «точка» перед первым {. Это нормально или PHP добавляет больше, чем нужно в ответ? – ABarr

+0

ОК, поэтому на консоли вы видите какую-либо ошибку jquery, есть вероятность, что до того, как обратный вызов успеха срабатывает, некоторая ошибка jquery перестает идти дальше. {}, который вы видите, является нормальным, это кодированная json нотация –

+0

Я обновил свой вопрос, чтобы показать, что я решил его решить. PHP по какой-то причине помещал пустой пробел/скрытый символ перед первой скобкой. Я просто переместил мое требование конфигурации дальше в код, и все в порядке. – ABarr

2

Используйте эту как

<?php 
     sesson_start(); // Captcha Stored in Session 
     header('Content-type: application/json'); 
     if(empty($_POST['captinput']) || md5($_POST['captinput']) !== $_SESSION['captchacode']){ 
      //$result = array('result' => 'Cfail'); 
      $data['result'] = 'Cfail'; 
      echo json_encode($data); 
      exit; 
     } 
    ?> 

Это работает для JavaScript

+0

Это специально не сработало, но мне просто удалось решить это, попробовав что-то наугад. По-видимому, потому, что я требовал, чтобы php-файл «config» устанавливал некоторые переменные перед выполнением json-кодирования, php помещал «что-то» перед первой скобкой. Объект с пробелом или что-то еще. Действительно странно. :/Собираюсь обновить свой оригинальный вопрос, чтобы указать. – ABarr

Смежные вопросы