2015-08-26 101 views
0

我創造了非常非常簡單的PHP程序從數據庫和結構一個PHP數組中獲取數據,然後將其轉換成JSON:XMLHttpRequest不喜歡我的JSON?

$i = 0; 
while($row = mysqli_fetch_array($result)) { 
    $output[$i] = array(); 

    $output[$i]["tag"] = $row["tag"]; 
    $output[$i]["desc"] = htmlspecialchars($row["desc"]); 

    if ($row["content"] != "") { 
    $output[$i]["content"] = $row["content"]; 
    } 

    if ($row["href"] != NULL) { 
    $output[$i]["params"]["href"] = $row["href"]; 
    } 

    $i++; 
} 

header('Content-Type: application/json; charset=utf-8'); 

echo json_encode($output, JSON_FORCE_OBJECT); 

我希望利用這個codepen內,此處鏈接:http://codepen.io/mrcarter7/pen/pJMxzr

在這種codepen我有以下的JavaScript(從一個教程這裏找到:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest):

function reqListener() { 
    console.log(this.responseText); 
    console.log(this.status); 
} 

var url = "http://millenix.com/api/html"; 
// tutorial url: https://api.github.com/repos/mozilla/kuma/contributors 

var oReq = new XMLHttpRequest(); 
oReq.addEventListener('load', reqListener); 
oReq.open("get", url, true); 
oReq.send(); 

我想將它映射到由下面的邏輯中使用javascript對象在JavaScript中,但遇到了問題,所以我想我會保持簡單,只是試圖讓它在控制檯輸出,你會看到它不會,但如果你用網址替換url變量值上面鏈接的教程(對不起,我不能發佈兩個以上的鏈接),它工作正常!

我的php/json有什麼問題嗎?還是有一種替代的方式從外部源獲取json並將其存儲爲本地JavaScript對象以進行處理。

BONUS:另外,爲什麼我的json格式不像教程的json?

回答

0

首先,您需要爲您的API添加'Access-Control-Allow-Origin:*'標題,否則無法從其他網站(如Codepen)訪問它。 Enable-cors向你展示瞭如何用各種不同的語言來做到這一點。

你提供的代碼的另一個主要問題是它引用了'html'變量 - 我期望它是從你的JSON派生的對象 - 但它看起來並沒有在例。爲了得到'html'變量,你必須解析XMLHTTPRequest「load」事件處理程序的響應 - 並且將現有代碼移入該閉包中,因爲此代碼是異步執行的。

您的JSON並非以'漂亮'的方式佈置 - 但這很好,意味着您不會浪費帶寬來處理用戶可能永遠看不到的格式。但是,它是有效的JSON - 您可以通過將輸出粘貼到JSONLint來驗證。

+1

CORS正是我正在尋找讓我真正在codepen中獲得JSON。奇怪的是,我還不得不在Javascript中的URL變量中添加尾隨的「/」以使其起作用。你對html變量是正確的。我現在正在處理這個問題。一旦我有工作,我會批准你的答案。支持。再次感謝您指引我走向CORS。 – mrcarter7

+1

好吧,在我的URL變量中添加CORS和尾部的斜線後,我所要做的就是將我的邏輯移動到加載事件處理程序中,就像您說的那樣,因爲它的執行是異步的。之後,我只需聲明我的html變量併爲其分配JSON.parse(this.response)的值。 (因爲響應返回一個字符串,而不是一個對象) 可以看到它在codepen上工作:http://codepen.io/mrcarter7/pen/pJMxzr – mrcarter7