同源策略 -- JavaScript 调用 PHP

4
我知道这是一个普遍的主题,但我还没有找到完全全面的答案。
我正在尝试创建一种简单的方法,让我们的“客户”在其网站上放置Google地图,该地图绘制了我们客户(或其子集)的位置。客户在MySQL数据库中,由PHP脚本即时转换为XML(根据Google的示例)。这在我的网站上很好用,但是当我在另一个网站上尝试时,xmlHTTPRequest不允许查看PHP,因为它在其他域上。
我可以通过在其他域上编写另一个PHP文件来规避此问题,该文件只需读取原始域上的PHP文件。但并非所有客户端都在其服务器上运行PHP。有没有办法使用JavaScript返回我们的数据库中的XML结果?
几个要点:
1.使xmlHTTPRequest的JavaScript仍位于我们的服务器上-我们的客户从脚本标记链接到它。我认为这可能足够了,但是据Chrome所说,“origin”仍被视为domain#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请求相比有什么优势?
抱歉,问题很多,但任何指导都将不胜感激。
巨大的感谢,
Mat

#3 被称为 JSONP,听起来这正是你需要的。 - StriplingWarrior
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支持。


是的,这就是做法。从您的域嵌入脚本,如果需要,将变量作为参数传递给 PHP。 - Paul McMillan
这看起来很不错。我觉得我需要一点时间来确切地弄清楚它,但是我大致上理解了这个想法。谢谢你,nikic。 - Mat
好的,由于脚本是异步加载的,当我尝试访问JSON数据时会抛出错误。我应该在什么时候才能访问它?或者说,在尝试访问之前如何等待它变得可用?此外,如果我这样做'callback_fn({mydata})',会提示'callback_fn'未定义。 - Mat
你必须先定义回调函数,然后再动态加载脚本 ;) - NikiC
太阳照在大理石头上。是的,现在开始掌握了!只用了一天时间...这个链接非常有帮助:http://www.ibm.com/developerworks/web/library/wa-aj-jsonp1/index.html。附言:再次感谢! - Mat

1

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接