我知道这是一个热门话题,但我还没有找到一个完全全面的答案。
我正在尝试为我们的“客户”创建一种简单的方法,在他们的网站上放置Google地图,在地图上绘制客户(或其子集)的位置。客户在MySQL数据库中,通过PHP脚本(根据Google的示例)即时转换为XML。这在我的网站上工作正常,但是当我在另一个网站上尝试时,xmlHTTPRequest不允许查看PHP,因为它在另一个域上。
我可以通过在另一个域上编写另一个PHP文件来解决这个问题,该文件只是读取原始域上的PHP文件。但并非所有客户都会在其服务器上运行PHP。有什么方法可以使用JavaScript从我们的数据库返回XML结果吗?
有几点:
使xmlHTTPRequest的JavaScript仍然位于我们的服务器上 - 我们的客户端从脚本标记链接到它。我认为这可能就够了,但“起源”(根据Chrome,无论如何)仍被视为域#2
这很棒:如果我在xmlHTTPRequest中使用绝对引用(例如request.open('GET','http://mydomain.com/api/foo.php',true))那么它将在IE中失败,但如果我使用相对引用('/api/foo.php')它将起作用。
我对此知之甚少,但我可以使用JSON吗?我见过: 'script src =“http://..../someData.js?callback = some_func”' 但不知道如何,我会让'someData.js'看起来像JSON? (我在功能方面非常考虑,这可能是不正确的?)。
我尝试过添加: header(“Access-Control-Allow-Origin:*”); 到输出XML的PHP的顶部,但我说的并不是真的很多!
如果我在客户端服务器上使用PHP包装器,那么使用cURL请求有什么好处,而不是简单的file_get_contents或fopen?
很抱歉,很多问题,但任何指导都将不胜感激。
非常感谢,
垫
答案 0 :(得分: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支持它。
答案 1 :(得分:1)
您可以使用JSON而不是XML吗?如果是这样,你的选择3)可能是你最好的选择。这种方法存在安全风险,它只应用于已知和可靠的来源。
答案 2 :(得分:0)
JavaScript是客户端,但数据库不是。 JavaScript无法直接从MySQL数据库中提取。