使用AJAX方法和PHP

时间:2015-07-13 12:03:10

标签: php jquery ajax

我刚刚开始处理对不同服务器中存在的php文件的调用。我知道CORS对于跨域请求至关重要。我一直试图通过ajax方法调用这个文件,参考其他网站和教程,我已经看到讨论找到解决方案,但他们不适合我。请帮忙。

这是我的调用方法:

            $.ajax({
                    type: "GET",
                    url: "http://cs-server.usc.edu:27952/ResponseProg.php?callback=?", //Relative or absolute path to response.php file
                    datatype: "jsonp",
                    data: dataInput,
                    jsonp:'jsoncallback',
                    crossDomain:true,
                    success: function(data) 
                    {
                        JSONObj = jQuery.parseJSON(data);
                        contentProvider("#rtrn");
                        if(JSONObj.ack != "No results found")
                        {
                            var paginate=setPager(0);
                            $("#pgn").html(paginate);
                        }
                    },
                    error: function() {
                        $("#rtrn").html("Data not retrieved successfully");
                    }
                });

这是我的PHP代码片段:

<?php
#code for data processing...
$rsltjson = json_encode($result,JSON_UNESCAPED_SLASHES);
echo $_GET['jsoncallback']."(".$rsltjson.");";
?>

我试图通过使用JSONP来实现这一目标。我应该有任何标题吗? 我的代码中是否有任何错误?....我怎样才能做到这一点? dataInput是表单数据的序列化形式

1 个答案:

答案 0 :(得分:2)

CORS方式

您需要在PHP脚本中放置适当的标头并仅输出JSON:

<?php
    header('Access-Control-Allow-Origin: *');

    // rest of the code

    // output JSON only
    echo $rsltjson;
?>

然后使用XMLHttpRequest / ajax调用应该像JSON一样检索数据,而不需要使用JSONP。

Mozilla has plenty to read about it

JSONP方式

由于JSONP的重点是绕过跨域限制,使用XMLHttpRequest / ajax调用JSONP资源,完全应用跨域安全性(大概)的方法完全没用。

JSONP的工作原理是将代码直接注入到页面中,调用您定义的函数,这就是JSONP url接受参数的原因。因此,调用JSONP URL的正确方法是:

<script>
function myDataFunc(data) {
    JSONObj = jQuery.parseJSON(data);
    contentProvider("#rtrn");
    if(JSONObj.ack != "No results found") {
        var paginate=setPager(0);
        $("#pgn").html(paginate);
    }
}
</script>
<script src="http://cs-server.usc.edu:27952/ResponseProg.php?jsoncallback=myDataFunc"></script>

JSONP网址将返回如下内容:

myDataFunc({"a":"fhsfg","b":"qfdgers","c":"difgij"});

由于它是作为脚本包含的,因此它将直接在您的页面中执行,并调用您之前定义的函数myDataFunc()

另请注意,当您的javascript使用参数jsoncallback调用网址时,您的php文件会使用GET参数callback

最后,您使用jQuery.parseJSON(),它会从您的代码中产生此错误:

SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data

原因可以在jQuery docs

中找到
  

jQuery.parseJSON(json)
  描述:采用格式良好的JSON字符串并返回生成的JavaScript值   传入格式错误的JSON字符串会导致抛出JavaScript异常。

您的php脚本使用JSON对象提供回调

{"a":"fhsfg","b":"qfdgers","c":"difgij"}

而不是表示JSON对象的字符串

'{"a":"fhsfg","b":"qfdgers","c":"difgij"}'

请注意周围的引号,这会使此数据成为字符串。我们通过在数据周围添加引号来解决这个问题:

echo $_GET['jsoncallback']."('".$rsltjson."');";

显然,如果您的JSON数据包含单引号,则必须将它们转义。