如何从PHP的AJAX帖子返回数据?

时间:2011-08-18 21:55:42

标签: php javascript html ajax

我正在尝试从$.post返回值,但我无处可去。以下是代码段:

<!-- language: lang-js -->

$(document).ready(function(){
$('.d1').dblclick(function() {
    $(this).css("background-color","blue");
    var datas =  $(this).attr('id');

    $.post(

            "simpleData.php",
            {"chess":datas},
            {dataType: "JSON"},
            {async:false},
            {contentType: "application/json; charset=utf-8"},
              {success: function(msg){
                 alert(msg.d);
                 var resultAsString = msg.d;
                 document.write(resultAsString);
    }

          });       
    });

});

这是输出的划分。我这里没有收到任何输出:

<!-- language: lang-php -->    

<div id = "output">
<?php
echo "This is the default output <br />";


echo $_REQUEST['chess'];

?>                      

<?php

print_r($_REQUEST);

?> 

这是被调用的php程序(simpleData.php):

<!-- language: lang-php -->

<html>
<body
<?php
$move_from = $_REQUEST['chess'];
var_dump($_REQUEST);
echo "this is move_from  $move_from";
?>

</body>
</html>

我收到了正确的输出,但它从未出现在div中。此外,我没有从警报中收到任何输出。

请帮助和建议。

这是更新的代码,遗憾的是仍然无效。结果出现在div中,但它说的都是“未定义”。此外,页面上的棋盘也被删除了。

<script type="text/javascript">

$.ajaxSetup ({  
    cache: false  
});  

$(document).ready(function(){
    $('.d1').dblclick(function() {
        $(this).css("background-color","blue");
        var datas =  $(this).attr('id');

$.post("simpleData.php", {
            data: {"chess":datas},
            dataType: "json",
            async:false,
            contentType: "application/json; charset=utf-8",
            header: "HTTP/1.1 200 OK",
            success: function(html){
               var resultAsString = html;
               $("#output").html(resultAsString);      
              document.write(resultAsString);
            }    
});


</script>

以下是名为[simpleData.php]的程序:

<html>
<body

 <?php
$move_from = $_REQUEST['chess'];
var_dump($_REQUEST);
echo "this is move_from  $move_from";

?>

</body>
</html>

以下是Firebug的html输出:

Notice: Undefined index: chess in /var/www/simpleData.php on line 12 array(6) { ["data"]=> array(1) { ["chess"]=> string(2) "e8" } ["dataType"]=> string(4) "json" ["async"]=> string(5) "false" ["contentType"]=> string(31) "application/json; charset=utf-8" ["header"]=> string(15) "HTTP/1.1 200 OK" ["success"]=> string(9) "undefined" } this is move_from

请帮助和建议。 感谢

这是最新的代码:

<script type="text/javascript">

$.ajaxSetup ({  
cache: false  
});  

$(document).ready(function(){
$('.d1').dblclick(function() {
    $(this).css("background-color","blue");
    var datas =  $(this).attr('id');

$.post("simpleData.php", {
        data: {"chess":datas},
        dataType: "json",
        async:false,
        contentType: "application/json; charset=utf-8",
        header: "HTTP/1.1 200 OK",
        success: function(html){
           newProcessData(html);
        }

        });

    }); 
});

function newProcessData(html){
    var resultAsString = html;
    $("#output").html(resultAsString);
    document.write(resultAsString);
    alert("yippee");
}

以下是调用的程序(simpleData.php)[它有更改]

<html>
 <body>
<?php
$move_from = $_REQUEST['chess'];
var_dump($_REQUEST);
echo "this is move_from  $move_from";
?>

</body>
</html>

我知道代码到达函数newProcessData,因为显示了警告。

以下是Firebug的输出:

接头:

Date    Mon, 22 Aug 2011 04:01:42 GMT
Server  Apache/2.2.19 (Debian)
X-Powered-By    PHP/5.3.7-1
Vary    Accept-Encoding
Content-Encoding    gzip
Content-Length  401
Keep-Alive  timeout=15, max=99
Connection  Keep-Alive
Content-Type    text/html
Request Headersview source
Host    localhost
User-Agent  Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0 Iceweasel/6.0
Accept  */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection  keep-alive
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With    XMLHttpRequest
Referer http://localhost/jq3_test.php
Content-Length  137
Pragma  no-cache
Cache-Control   no-cache

POST:

async   false
contentType application/json; charset=utf-8
dataType    json
data[chess] e8
header  HTTP/1.1 200 OK
success undefined
Source
data%5Bchess%5D=e8&dataType=json&async=false&contentType=application%2Fjson%3B+charset%3Dutf-8&header=HTTP%2F1.1+200+OK&success=undefined

HTML:

Notice: Undefined index: datas in /var/www/simpleData.php on line 13 array(6) { ["data"]=> array(1) { ["chess"]=> string(2) "e8" } ["dataType"]=> string(4) "json" ["async"]=> string(5) "false" ["contentType"]=> string(31) "application/json; charset=utf-8" ["header"]=> string(15) "HTTP/1.1 200 OK" ["success"]=> string(9) "undefined" } this is move_from

任何可以呈现的帮助都将受到高度赞赏 感谢

5 个答案:

答案 0 :(得分:2)

这可能不是完全的原因,但是当jQuery要求dataType:'json'时,手册显示为小写,而不是大写(不确定是否重要) - PHP需要识别输出为带有标题的json(并且还返回OK状态),如下所示:

header("HTTP/1.1 200 OK");
header('Content-type: application/json');
在回显任何数据之前

也不要返回html标签,只需调用json头,echo输出,然后退出()。

哦,数组需要编码为JSON:

echo json_encode($_REQUEST['chess']);

<强>编辑: 我想你可能会把一些建议放在错误的地方 - 试试这个。 你的simpleData.php从头到尾,应该看起来像这样返回JSON数据:

<?php
header("HTTP/1.1 200 OK");
header('Content-type: application/json');
echo json_encode($_REQUEST);
exit();
?>

请注意缺少周围的HTML标记或php标记之外的任何内容。你不能两种方式,一个返回HTML进行调试的脚本和一个返回不会破坏jQuery帖子的正确JSON的脚本。

如果你想在查看发布帖子的HTML页面时看到simpleData.php的JSON响应,请安装类似firefox的firebug插件的工具,并观察NET面板以便能够准确地检查发生了什么帖子。

现在,从您的javascript中删除标题内容类型内容,这是在错误的位置添加的:

$.post("simpleData.php", {
        data: {"chess":datas},
        dataType: "json",
        async:false,
        contentType: "application/json; charset=utf-8",
        header: "HTTP/1.1 200 OK",
        success: function(html){
           newProcessData(html);
        }

        });

应该成为:

$.post("simpleData.php", {
        data: {"chess":datas},
        dataType: "json",
        async:false,
        success: function(html){
           newProcessData(html);
        }

        });

答案 1 :(得分:2)

您可以参考官方的jquery文档,了解发布到php和更新div的简单示例:

http://api.jquery.com/jQuery.post/

如:

$.post('ajax/test.html', function(data) {
  $('.result').html(data);
});

答案 2 :(得分:0)

$.post("simpleData.php", {
            data: {chess:datas},
            dataType: "html",
            async:false,
            success: function(html){
               alert(html);
               var resultAsString = html;
               document.write(resultAsString);
            }    
});

你的语法有点奇怪,试试上面的版本(虽然说实话,不应该正常使用document.write)。

答案 3 :(得分:0)

我认为你需要在原始文件中,而不是.php文件。

{success: function(msg){
                 alert(msg.d);
                 var resultAsString = msg.d;
                 //document.write(resultAsString);
                 $("#output").html(resultAsString); //this will add it to the div
    }

答案 4 :(得分:0)

我不是PHP程序员,但基于您提供的以下输出


["data"]=> array(1) { ["chess"]=> string(2) "e8" } 

看起来“国际象棋”数据仍然在$ _REQUEST中的“数据”中。您应该尝试使用$ _REQUEST ['data'] ['chess']来查看是否可行。