2010-05-17 2 views
10

У меня жалкое время отладки одной маленькой функции в моем новом проекте.Каков наилучший способ отладки AJAX для вызовов PHP?

По сути, у меня есть пользователь, который выходил из системы через вызов AJAX для моего сценария выхода на моем сервере под названием «userfFunctions.php». Я использую AJAX, так что у меня нет головной боли при написании большего количества регулярных выражений соответствуют моим mod_rewrites. В любом случае, каждый так часто кажется, что мои данные Post просто плоские, и поскольку PHP работает за кулисами, я чувствую, что у меня нет способа узнать, где поток данных нарушен. BTW Эта функция работает 19 часов дня.

Вот Javascript функция:

function logOut(){ 
    var data = new Object; 
    data.log_out = true; 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.mydomain.com/User_Validator', //<-- redirects to userFunctions.php 
     data: data, 
     success: function(data) { 
     alert(data); // <-- a response is triggered but with no response data! 
     } 
    }); 
} 

РНР сторона:

if(isset($_POST['log_out'])){ 
    echo 'alert this!'; 
} 

вот мой удивительный ответ: alt text http://img517.imageshack.us/img517/6520/screenshot20100517at443.png

ответ

8

FirePHP:

FirePHP позволяет вам войти в свой Firebug консоли с помощью простого PHP вызова метода.

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

FirePHP идеально подходит для разработки AJAX , где требуются чистые JSON и XML .

Вот минималистичный реализация я писал:

function FirePHP($message, $label = null, $type = 'LOG') 
{ 
    static $i = 0; 

    if (headers_sent() === false) 
    { 
     $type = (in_array($type, array('LOG', 'INFO', 'WARN', 'ERROR')) === false) ? 'LOG' : $type; 

     if (($_SERVER['HTTP_HOST'] == 'localhost') && (strpos($_SERVER['HTTP_USER_AGENT'], 'FirePHP') !== false)) 
     { 
      $message = json_encode(array(array('Type' => $type, 'Label' => $label), $message)); 

      if ($i == 0) 
      { 
       header('X-Wf-Protocol-1: http://meta.wildfirehq.org/Protocol/JsonStream/0.2'); 
       header('X-Wf-1-Plugin-1: http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'); 
       header('X-Wf-1-Structure-1: http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'); 
      } 

      header('X-Wf-1-1-1-' . ++$i . ': ' . strlen($message) . '|' . $message . '|'); 
     } 
    } 
} 

Я написал его так, что он работает только на локальном хосте (по соображениям безопасности), но вы можете легко изменить, что, заменяя следующий код:

if (($_SERVER['HTTP_HOST'] == 'localhost') && (strpos($_SERVER['HTTP_USER_AGENT'], 'FirePHP') !== false)) 

С:

if (strpos($_SERVER['HTTP_USER_AGENT'], 'FirePHP') !== false) 
+0

Большое вам спасибо за это! Великий подход. –

+0

@Jascha: Нет проблем, в функции, которую я предоставил, была опечатка - теперь она исправлена. знак равно –

8

Попробуйте использовать что-то вроде FireBug плагин для Firefox, или Инструменты разработчика в Chrome, чтобы просмотреть отправленный запрос.

+3

в дополнение to firePHP, чтобы вы могли отлаживать php-код в том же окне firebug – Jacob

+2

Firebug + FirePHP - это потрясающе http://firephp.org/ – Shiki

+0

Я не совсем уверен, что искать в запросе заголовка ... что-нибудь в частности? –

2

Вы пробовали установить dataType на "text"?

function logOut(){ 
    var data = { 
     "log_out" : true 
    }; 
    $.ajax({ 
     type: 'POST', 
     url: 'http://www.mydomain.com/User_Validator', 
     data: data, 
     success: function(data) { 
      alert(data); 
     }, 
     dataType : 'text' 
    }); 
} 

Кроме того, я хотел бы изменить свой PHP на это:

print_r($_POST); 
+0

Я пробовал это, правда, я не просто ищу текстовый ответ, я просто использую ответ как способ отладки, в php-функции я фактически исключаю cookie и session_destroy, а затем на успех обновите страницу с помощью javascript. –

0

Я заметил:

//<-- redirects to userFunctions.php 

Когда вы делаете перенаправлять (заголовок ("Location:");) вы потеряете данные $ _POST и $ _GET. (Если вы имеете в виду URL переписать (с mod_rewrite), вы должны получить данные.)

Но это не объясняет 19hr симптом.

+0

Благодарю вас за ваш ответ, это на самом деле переписывание, а не перенаправление. –

0

Вы могли бы попытаться проверить сам массив $ _POST, с чем-то вроде этого:

var_dump($_POST); 

Смотрите, если массив даже заселяется на всех, а затем работать оттуда. Используя firebug, вы также можете подтвердить, действительно ли сообщение AJAX отправляет данные (проверьте вкладки консоли или сети).