2011-10-17 48 views
0

我有驗證之後運行下面的PHP代碼:內容類型沒有正確地PHP腳本設定

try { 

    if (isset($filtered) && !isset($errors)){ 
     $p['email']=$filtered['email']; 

     # check if email exists 
     if ($user->userExists($p)){ 
      $msg['error'] = false; 
      $msg['msg'] = 'This email address is already in our database'; 
     } else { 
      # insert user data into database 
      $user->saveUser($filtered); 
      $msg['error'] = false; 
      $msg['msg'] = 'Successful! Go back to our homepage.'; 
     } 
    } else { 
     # echo errors back 
     foreach ($errors as $value) { 
      $msg['error'] = true; 
      $msg['msg'] = $value; 
     } 
    } 

我準備JSON數據如下:

 # header encode 
     header('Content-type: application/json'); 
     # return json encoded data 
     echo $encoded = json_encode($msg); 

的直接陣列像這樣的下面的工作正常。

header('Content-type: application/json'); 
$msg['error'] = true; 
$msg['msg'] = 'Please enter an email address.'; 
echo $encoded = json_encode($msg); 

我似乎無法弄清楚我的PHP邏輯的問題可能是什麼。請幫助。

+0

你得到的錯誤是什麼? – evasilchenko

+0

任何錯誤消息?什麼是內容類型設置?如果您查看網址會發生什麼? – Ryre

+0

這不是問題,但是'echo json_encode($ msg)'是'正確的'。或者在一行上進行分配,然後在另一行上回顯變量。 –

回答

0

我可以看到的唯一區別是在有效的版本中,您可以在之前撥打header()之前的任何其他內容。

嘗試移動

header('Content-type: application/json'); 

的try/catch語句以上。我懷疑你之所以會出現這個問題,是因爲你在創建它之前隱式地訪問了數組,它引發了一個E_NOTICE(或者它可能是E_STRICT,我不記得),並導致寫入內容到輸出緩衝區,所以標題被髮送,你不能再操縱它們 - 雖然如果這種情況下,我希望它會打破你的JSON以及...

無論如何,嘗試以上並報告返回。

+0

我試圖移動try/catch上方的'header()'部分,但仍然沒有運氣。我同意你的看法,似乎有一些隱式發送頭文件的代碼。我將文件包含在同一個腳本中。這可能是原因嗎? – gabeno

+0

你正在尋找的東西是導致輸出的東西 - 所以它可能是任何'回聲','print','print_r'等等將數據寫入輸出緩衝區的調用(還有許多其他功能也可以這樣做,像'system') - 它可能是導致錯誤的地方,錯誤信息被打印出來。你可以使用['headers_sent()'](http://php.net/manual/en/function.headers-sent.php)函數來確定頭部是否被髮送。 – DaveRandom

+0

我終於明白了。我在我的代碼中有一個條件,從來沒有評估允許json被返回。感謝您的洞察力。 – gabeno