2010-10-27 51 views
4

我知道這是一個熱門話題,但我還沒有找到完全全面的答案。相同來源政策 - JavaScript調用PHP

我試圖爲建立一個簡單的方法,我們的「客戶」放置一個谷歌地圖在其網站上,其繪出了廣大客戶的地圖上的位置(或其子集)。客戶處於一個MySQL數據庫中,該數據庫通過PHP腳本實時轉換爲XML(按照Google的示例)。這在我的網站上正常工作,但是當我在另一個網站上嘗試時,xmlHTTPRequest不允許查看PHP,因爲它在另一個域上。

我可以通過簡單地讀取原始域的PHP文件中的其他域寫另一個PHP文件繞過這一點。但並不是所有的客戶都會在他們的服務器上運行PHP。有什麼方法可以使用JavaScript從我們的數據庫返回XML結果?

幾個要點:

  1. ,使得XMLHttpRequest對象仍然坐在我們服務器上的JavaScript的 - 我們的客戶從腳本標籤鏈接到它。我認爲這可能就夠了,但是'起源'仍然被視爲域#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?

對不起,很多的問題,但任何指導將不勝感激。

大規模的感謝,

+0

#3被稱爲JSONP,那聽起來像什麼您這裏需要。 – StriplingWarrior 2010-10-27 16:59:08

回答

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支持這個功能。

+0

是的,這是做到這一點的方法。從您的域中嵌入腳本,並且如果需要,請將變量作爲參數傳遞給php。 – 2010-10-27 17:04:46

+0

這看起來不錯。我認爲這需要一段時間才能完全弄清楚,但我[想我!]廣泛地理解了這個想法。謝謝你nikic。 – Mat 2010-10-28 09:59:06

+0

好吧,因爲腳本異步加載,所以當我嘗試訪問json數據時會拋出錯誤。什麼時候它變得可用/我如何等待,直到它可用,然後再嘗試訪問它?另外,如果我做的是'callback_fn({mydata})',我會被告知'callback_fn'沒有被定義。 – Mat 2010-10-28 15:38:18

0

JavaScript是客戶端,但是數據庫是沒有的。 JavaScript無法直接從MySQL數據庫中提取。