PHP做爲後端時,前端js使用ajax技術進行相互信息傳送時,常常會出錯誤,對於新手來講有些手足無措。總結錯誤、經驗,之後隨時回顧。 php
第一個問題,當前端無錯誤的狀況下,頁面調試也顯示沒有問題,可是ajax獲取不到後端php文件發送過來的信息: html
前端代碼以下:前端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$.ajax({
url:
'1.php'
,
//目的php文件
data:{
"age"
:12,
"name"
:
'zh'
},
//傳送的數據
type:‘post',
//方式post/get
dataType:
'json'
,
//數據傳送格式
success:
function
(response)
{
console.log(response);
},
error:
function
(response)
{
console.log(response);
console.log(
"錯誤"
);
}
});
|
php後端代碼以下:ajax
1
2
3
4
|
$postAge
=
$_POST
[
'age'
];
$postName
=
$_POST
[
'name'
];
echo
$postAge
;
echo
$postName
;
|
頁面出現後,F12調試查看以下所示: json
狀態碼都沒問題,status是200,responseReady是4,說明在html發送給php文件信息過程是沒有問題的。並且php也返回了信息。但是爲何程序走了error而沒有走success呢? 後端
這時須要當心!因爲php後端多個echo沒有把數據整理爲json格式。也就是說php返回的是一個字符串不是json格式的數據。有人說加上json_encode()呢?這樣也是不行的,由於json_encode()的函數做用沒搞清,百度仔細看下。json_encode()與json_decode()是一對。 數組
json_encode(json),把json整理爲json格式的數據。在上例中,就算php後端代碼改寫爲:echo json_encode(postAge);和echojsonencode(postName);也是不對的。由於這樣僅僅是把單個postAge和postName整理爲了json格式,可是因爲是2個返回,既是2個response,在瀏覽器調試頁面也能夠看到1個post回來2個response。這樣致使2個json格式的數據返回給前端是就再也不是json格式的數據(我理解爲json污染,方便理解)。也就是單個數據是json格式可是多個json格式數據「胡亂」結合在一塊兒不按照json格式合併在一塊兒就會產生「污染」。致使總體數據格式混亂沒法被識別,這種狀況者數據處理和傳輸時隨時都見獲得。
瀏覽器
json_decode(json,true/false)函數是把json整理爲數組或者object(理解爲類)。true是強制裝換爲(關聯)數組,false是默認的會轉換爲object形式的數據。 服務器
回到本文提出的例子上。 函數
既然傳送回來的數據再也不是json格式的數據,那麼就是dataType的問題了。
dataType是告訴瀏覽器檢查傳送的數據格式。若是不寫,瀏覽器不會去檢查數據格式,寫了就必定檢查並且必須知足格式要求。本例中,因爲寫了爲json格式,可是傳回來時不是json格式,因此瀏覽器認爲傳輸過程當中出現了錯誤,因此走了error而沒有走success。
這時最好的方式是修改php代碼,將echo的內容改成一個數組,用數組的信形式把總體數據整理爲json格式進行傳送(json_encode),避免發生錯誤。
固然也能夠使用另外一種方法,相似做弊的方法,直接註釋掉(或者不寫)dataType,這樣瀏覽器就不會去檢查數據的形式而是根據數據的形式智能的判斷,相似矇混過關。
如下是dataType的W3school解釋:
值得注意的是,後端php文件中多個echo輸出後,數據返回確是一塊兒返回的,既是修改正確後,前端獲得的數據是2個數據合爲一個字符串的形式數據。本例子中獲得的數據是12zh。
固然還有不少細節問題了,好比php後端只能用echo或者die(),不能用return,這是由於return是隻在服務器端中返回數據使用,而echo是打印數據,將數據從服務器端打印出來,給前端。return只能在服務器端,或者前端單一的返回。而die()的強大就不提了,直接終止後端php程序的形式返回數據。
還有好比在$,ajax({});中每一行既是一個參數,參數之間是逗號隔開,多個數據是在{}內,隔開是用逗號等等。