Каков наилучший способ отладки AJAX для PHP?

У меня жалкое время отладки одной маленькой функции в моем новом проекте.

По сути, у меня есть выход пользователя из системы через вызов AJAX для моего выхода из системы script на моем сервере под названием "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!
        }
    });
}

сторона php:

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

вот мой замечательный ответ: alt text http://img517.imageshack.us/img517/6520/screenshot20100517at443.png

Ответ 1

FirePHP:

FirePHP позволяет вам регистрироваться на вашем Firebug Console с использованием простого 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 . '|');
        }
    }
}

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

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

С

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

Ответ 2

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

Ответ 3

Вы пытались установить 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);

Ответ 4

Я заметил:

//<-- redirects to userFunctions.php

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

Но это не объясняет 19-часовой симптом.

Ответ 5

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

var_dump($_POST);

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