4

我知道这是一个热门话题,但我还没有找到一个完全全面的答案。

我正在尝试为我们的“客户”创建一种简单的方法,以便在他们的网站上放置谷歌地图,该地图会在地图上绘制我们客户(或其子集)的位置。客户位于 MySQL 数据库中,该数据库由 PHP 脚本动态转换为 XML(根据 Google 的示例)。这在我的网站上运行良好,但是当我在另一个网站上尝试它时,不允许 xmlHTTPRequest 查看 PHP,因为它在另一个域上。

我可以通过在另一个域上编写另一个 PHP 文件来规避这个问题,该文件只是读取原始域上的 PHP 文件。但并非我们所有的客户都会在他们的服务器上运行 PHP。有什么方法可以使用 JavaScript 从我们的数据库返回 XML 结果?

几点:

  1. 生成 xmlHTTPRequest 的 JavaScript 仍然位于我们的服务器上——我们的客户端从脚本标记链接到它。我认为这可能就足够了,但“起源”(无论如何,根据 Chrome)仍然被视为域#2

  2. 这很棒:如果我在 xmlHTTPRequest 中使用绝对引用(例如 request.open('GET', 'http://mydomain.com/api/foo.php', true)),那么它将在 IE 中失败,但是如果我使用相对引用('/api/foo.php'),它将起作用。

  3. 我对此知之甚少,但我可以使用 JSON 吗?我见过:'script src="http://..../someData.js?callback=some_func"' 但不知道怎么做,我会让 'someData.js' 看起来像 JSON?(我在功能方面思考得很多,这可能是不正确的?)。

  4. 我尝试添加: header("Access-Control-Allow-Origin: *"); 到输出 XML 的 PHP 的顶部,但我可以说它并没有做太多事情!

  5. 如果我确实在客户端服务器上使用 PHP 包装器,那么使用 cURL 请求而不是简单的 file_get_contents 或 fopen 有什么好处?

对不起,很多问题,但任何指导将不胜感激。

万分感谢,

4

3 回答 3

6

解决此问题的一种简单方法是让您的 PHP 脚本返回如下内容:

callback_function(YOUR_DATA);

然后在客户端站点上包含的 JS 脚本中,您动态插入一个<script>指向src您的 PHP 脚本的代码:

(function() {
    var scriptElement   = document.createElement('script');
    scriptElement.type  = 'text/javascript';
    scriptElement.async = true;
    scriptElement.src   = 'http://example.org/yourScript.php?data=...';
    var container       = document.getElementsByTagName('script')[0];
    container.parentNode.insertBefore(scriptElement, container);
})();

这种技术称为JSONP,应该完全按照您的意愿行事;)

解决此问题的另一种方法是在内容安全策略中允许跨域 XMLHttpRequest。但我认为现在只有 Firefox 4 支持。

于 2010-10-27T16:57:23.063 回答
1

你能用 JSON 代替 XML 吗?如果是这样,您的选择 3) 可能是您最好的选择。这种方法存在安全风险,只能用于已知和受信任的来源。

更多阅读: http: //www.codeproject.com/KB/aspnet/JSONToJSONP.aspx

于 2010-10-27T16:59:57.393 回答
0

JavaScript 是客户端,但数据库不是。JavaScript 不能直接从 MySQL 数据库中提取。

于 2010-10-27T16:56:28.867 回答