【问题标题】:What's the best way to debug AJAX to PHP calls?调试 AJAX 到 PHP 调用的最佳方法是什么?
【发布时间】:2010-05-17 23:46:04
【问题描述】:

在我的新项目中调试一个小功能时,我感到很痛苦。

基本上,我让用户通过 AJAX 调用注销我的服务器上名为“userfFunctions.php”的注销脚本我的 mod_rewrites。无论如何,每隔一段时间,似乎我的 Post 数据就完全消失了,而且由于 PHP 在幕后运行,我觉得我无法找出数据流在哪里被中断。顺便说一句,此功能一天 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

【问题讨论】:

    标签: php javascript ajax


    【解决方案1】:

    FirePHP

    FirePHP 使您能够登录到您的 使用简单 PHP 的 Firebug 控制台 方法调用。

    所有数据都通过响应头发送 并且不会干扰 您页面上的内容。

    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)
    

    【讨论】:

    • 非常感谢您!很好的方法。
    • @Jascha:没问题,我提供的函数中有错字 - 现在已修复。 =)
    【解决方案2】:

    尝试使用类似 Firefox 的 FireBug 插件或 Chrome 中的开发者工具来查看发出的请求。

    【讨论】:

    • 除了firePHP,你可以在同一个firebug窗口中调试php代码
    • 我不太确定要在标头请求中查找什么...特别是什么?
    • 不要查看标头 - 查看 POST 变量是否实际上被正确传递,以及返回的结果是否正确。然后,您可以将问题缩小到客户端或服务器端的问题。
    • 原谅我的天真,但我在调试器中哪里可以找到它们?...找到了!它以前没有出现,但现在它是......我没有改变任何东西(grumble grumble)......谢谢你的意见。
    【解决方案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);
    

    【讨论】:

    • 我试过了,事实是,我并不是真的只是在寻找文本响应,我只是将响应用作调试的一种方式,在 php 函数中我实际上是无效的cookie 和 session_destroy,然后在成功时使用 javascript 刷新页面。
    【解决方案4】:

    我注意到了:

    //<-- redirects to userFunctions.php
    

    当您执行 redirect ( header("Location: "); ) 时,您将丢失 $_POST 和 $_GET 数据。 (如果您指的是 url rewrite(使用 mod_rewrite),您应该会收到数据。)

    但这并不能解释 19 小时的症状。

    【讨论】:

    • 感谢您的回复,这实际上是重写而不是重定向。
    【解决方案5】:

    您可以尝试检查 $_POST 数组本身,如下所示:

    var_dump($_POST);
    

    查看数组是否被填充,然后从那里开始工作。 使用 firebug,您还可以确认 AJAX 帖子是否真正发送数据(检查控制台或网络选项卡)。

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2010-11-23
      • 2014-07-18
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多