【问题标题】:No data when attempting to get JSONP data from cross domain PHP script尝试从跨域 PHP 脚本获取 JSONP 数据时没有数据
【发布时间】:2011-05-28 14:53:00
【问题描述】:

我正在尝试使用单个 id 字符串从不同域上的另一台服务器中提取纬度和经度值。我对 JQuery 不是很熟悉,但它似乎是解决同源问题的最简单方法。我无法使用 iframe,也无法在运行此 javascript 的服务器上安装 PHP,这迫使我不得不这样做。

我的查询似乎正常进行,但我没有得到任何结果。我希望这里有人可能有一个可以提供帮助的想法,因为我可能无法识别这里最明显的错误。

我的javascript函数是:

var surl = "http://...omitted.../pull.php";
var idnum = 5a; //in practice this is defined above

alert("BEFORE");

$.ajax({
    url: surl,
    data: {id: idnum},
    dataType: "jsonp",
    jsonp : "callback",
    jsonp: "jsonpcallback",
    success: function (rdata) {
        alert(rdata.lat + ", " + rdata.lon);
    }
});

alert("BETWEEN");

function jsonpcallback(rtndata) {
    alert("CALLED");
    alert(rtndata.lat + ", " + rtndata.lon);
}

    alert("AFTER");

当我的 javascript 运行时,会显示 BEFORE、BETWEEN 和 AFTER 警报。未显示 CALLED 和其他 jsonpcallback 警报。

还有其他方法可以判断jsoncallback函数是否被调用?

下面是我在第二台服务器上运行的 PHP 代码。我将计数表添加到我的数据库中,以便我可以知道该脚本何时运行。每次我调用 javascript 时,count 都会插入一个额外的项目,并且 id 号是正确的。

<?php

    header("content-type: application/json");

if (isset($_GET['id']) || isset($_POST['id'])){

    $db_handle = mysql_connect($server, $username, $password);
    if (!$db_handle)
    {
        die('Could not connect: ' . mysql_error());
    }

    $db_found = mysql_select_db($database, $db_handle);
    if ($db_found)
    {
        if (isset($_POST['id'])){
            $SQL = sprintf("SELECT * FROM %s WHERE loc_id='%s'", $loctable, mysql_real_escape_string($_POST['id']));
        } 
        if (isset($_GET['id'])){
            $SQL = sprintf("SELECT * FROM %s WHERE loc_id='%s'", $loctable, mysql_real_escape_string($_GET['id']));
        }
        $result = mysql_query($SQL, $db_handle);
        $db_field = mysql_fetch_assoc($result);

        $rtnjsonobj -> lat = $db_field["lat"];
        $rtnjsonobj -> lon = $db_field["lon"];

        if (isset($_POST['id'])){
            echo $_POST['jsonpcallback']. '('. json_encode($rtnjsonobj) . ')';
        } 
        if (isset($_GET['id'])){
            echo $_GET['jsonpcallback']. '('. json_encode($rtnjsonobj) . ')';
        }

        $SQL = sprintf("INSERT INTO count (bullshit) VALUES ('%s')", $_GET['id']);
        $result = mysql_query($SQL, $db_handle);
        $db_field = mysql_fetch_assoc($result);
    }

    mysql_close($db_handle);
} else {
    $rtnjsonobj -> lat = 404;
    $rtnjsonobj -> lon = 404;
    echo $_GET['jsonpcallback']. '('. json_encode($rtnjsonobj) . ')';
}?>

我不完全确定这个 PHP 返回的 jsonp 是否正确。当我直接进入 PHP 脚本而不包含任何参数时,我确实得到了以下内容。

 ({"lat":404,"lon":404})

回调函数不包括在内,但是当它不包括在原始调用中时,可以预期这么多。

有人知道这里可能出了什么问题吗?

提前致谢!

【问题讨论】:

  • 我不确定我是否理解正确,但是您不能使用 $.ajax 函数进行跨域请求。
  • @Christian Joudrey:你可以,jsonp
  • @zerkms 我的错,没有注意到他设置了jsonp。在这种情况下,您可能需要检查资源控制台(即 Firebug Net 选项卡)以查看您的 PHP 脚本返回的内容以及是否调用了正确的 URL。
  • 我以前从未使用过firebug,但尝试一下似乎告诉我我的问题出在哪里。谢谢!它在应该是 jsonp 的末尾附加了一条 PHP 错误消息,但这些警告来自 count(bullshit) 表,这是无关的。删除它,我仍然发现从未调用过jsonpcallback,而是调用了成功。
  • 我仍然无法让 jsonpcallback 函数运行,或者整个函数运行不止一次。不过,我已经能够恢复一个纬度,经度对。这是一个好的开始。谢谢。

标签: php jquery jsonp


【解决方案1】:

修改这部分代码

jsonp: "jsonpcallback",

与:

jsonpCallback : "jsonpcallback",

【讨论】:

  • 我尝试了您的建议,但似乎不起作用。进行该更改实际上会阻止调用我的成功函数,并且最终不会调用 jsoncallback。我想解释一下这种变化会做什么可能会有所帮助。
  • 基本上你的PHP应该输出jsonpcallback({"lat":404,"lon":404}),我不确定你需要覆盖jsonpcallback参数...
猜你喜欢
  • 2016-04-28
  • 2013-12-28
  • 1970-01-01
  • 2012-11-05
  • 2011-07-27
  • 1970-01-01
  • 2019-12-19
  • 2011-02-02
  • 2019-09-06
相关资源
最近更新 更多