当content-type设置为JSON UTF-8时,jQuery AJAX帖子为空

时间:2011-02-16 20:09:39

标签: php jquery json

我正在尝试使用jquery将一些非常简单的数据发布到php文件,然后获取json响应,但我似乎遇到了某个路障。这是我的jquery:

<script>
    $(function() {
        $('.resend-verify').click( function() {
            var userid = $(this).attr('rel');            
            $.ajax({
                type: "POST",
                url: "resend_verification.php",
                contentType: "application/json; charset=utf-8",
                data: "userid=" + userid,
                dataType: "json",
                success: function(data) {
                    console.log(data.response);
                    if(data.response == 'error') {
                        $('div.alert').addClass('error');
                    }
                    $('div.alert').html(data.comment);
                }

            });

        });       
    });
</script>

这是发布到

的php页面
<?php

if ($_SERVER['REQUEST_METHOD'] == "POST") { // Check For Post
    require '../../config.php'; // Site Settings
    require '../../connectors/mysqlConnector.php';
    include $DIR['php'] . 'functions.php'; // Common Functions

    //var_dump(json_decode($_POST));
    $UserID = $_POST['userid'];

    $userSQL = "SELECT p.user_firstname,p.user_lastname,a.user_email,a.user_salt FROM web_profiles p INNER JOIN web_accounts a ON p.user_id = a.user_id WHERE p.user_id ='" . $UserID . "'";
    $userQuery = mysql_query($userSQL);
    //var_dump($userSQL);
    $user = mysql_fetch_object($userQuery);

    if (!$user->user_email) {
        $response = array('response' => 'error', 'comment' => 'User not found');
    } else {
        // Send User Verification Email
        $sendmail = new sendMail();
        $message = createUserAuthEmail($user->user_firstname, $user->user_lastname, $user->user_salt, $Site['register_email_body']);

        $content['body'] = '<br /><br />' . $message . '<br /><br />DO NOT REPLY TO THIS EMAIL! IT IS ONLY AN AUTOMATED NOTIFICATION EMAIL!';
        $sendmail->set(to, $user->user_email);
        $sendmail->set(subject, 'Action Required to Activate Membership');
        $sendmail->set(from, 'no-reply@domain.com');
        $sendmail->set(html, true);
        $sendmail->getParams($content);
        $sendmail->parseBody();
        $sendmail->setHeaders();
        if ($sendmail->send()) {
            $response = array('response' => 'success', 'comment' => 'email sent');
        } else {
            $response = array('response' => 'error', 'comment' => 'Error sending email');
        }
    }
    echo json_encode($response);
}
?>

我遇到的问题是,如果我使用contentType:“application / json; charset = utf-8”,$ _POST总是为空。当我删除contentType:“application / json; charset = utf-8”时,$ _POST被填充但我无法获得json响应。我做错了什么?

3 个答案:

答案 0 :(得分:1)

您应该再次阅读jquery documentation,尤其是涵盖datadataType参数的部分。 data必须是键/值对象,即:

data: { 'userid': userid }

...对于dataType,允许的值是xml,html,text,json和jsonp。如果您的PHP脚本发送了一个合适的Content-type标题(例如header('Content-type: text/json');,那么您可以简单地将此参数保留为默认值('Intelligent guess')。jQuery将从其内容类型标题中推断响应类型。你应该发送标题,因为否则,服务器可能会假设你正在发送HTML并添加一个HTML内容类型标题本身,jQuery然后窒息。 在PHP脚本中设置internal encodingoutput encoding可能也是一个好主意,这样它就能正确理解请求并发送格式正确的UTF-8响应。

如需进一步调试,您可能需要:

  • 向PHP添加一些日志记录代码,例如,将$_POST数组和您发送的响应转储到服务器上的文本文件
  • 使用curl或wget之类的方法向PHP脚本发布测试请求,并查看响应是否符合预期
  • 将您的javascript帖子发送到一个虚拟脚本,该脚本只会记录请求并发送空响应;看看是否有效
  • 使用脚本调试程序(例如Firefox上的Firebug,或者内置于Chrom [e | ium]中的内容)逐步执行您的javascript;在成功处理程序中设置一个断点,看它是否被击中,如果是,那么响应包含什么

答案 1 :(得分:1)

我遇到同样问题的时间超过了我想承认的时间,然后我从PHP文档中读到了这个:

  

$ _ POST:传递给当前变量的关联变量数组   脚本通过HTTP POST方法使用    application / x-www-form-urlencoded multipart / form-data作为HTTP   请求中的Content-Type

我试图在没有jquery的情况下这样做,但是我构建了自己的xmlhttprequest对象。真正让我意识到$ _POST在查询是JSON格式时没有填充,或者以%编码类型以外的任何格式填充,当我最终放弃并尝试使用JQuery时,我查看了他们发送的原始帖子数据,毕竟它不是JSON,他们刚刚使用过&#34; application / x-www-form-urlencoded&#34;并在发送之前将我的JSON转换为urlencoded格式。 PHP然后愉快地用我的数据填充$ _POST数组,因为它是&#34;百分比编码&#34;而不是JSON数据。我认为$ _POST是一些神奇的东西,它会读取大多数内容类型并且神奇地填充,我认为这是原始数据,直到我记得$ HTTP_RAW_POST_DATA,但这是贬值的,人们现在使用&#34; php://输入& #34;并通过做这样的事情来阅读:

$rawPOST = file_get_contents('php://input');

所以应该能够在那里找到他们的JSON,但它不会被自动解析成单独的变量。

我希望至少我能帮助其他人,这篇文章已有4年历史了,但它说它被观看了7000多次。

答案 2 :(得分:0)

您应该尝试使用$.post并在必要时将其与事件绑定。 我做了一个mousemove事件:

$.fn.saveArray = function() { 
    var data = {data: selectednumbers};
    $.post('clickmap.php',{
        data:JSON.stringify(data)
        //contentType: 'application/json',
    });
};