我做了個簡單的html登陸表單,點擊提交按鈕,非同步提交驗證。php檔案串連資料庫驗證使用者名稱密碼,對則echo一個字串‘true’,錯了則無輸出值。返給html後,做判斷,再做響應動作。可我測試時發現,不管輸錯輸對,頁面均是輸對的動作。php部分是正確的,可以根據表單提交資料輸出響應的值,我覺得bug在用戶端部分,怎麼改都不對,望各位大神幫幫忙。以下是用戶端指令碼:
回複討論(解決方案)
輸錯時,控制台輸出data是什嗎?
輸錯時,無輸出。這是我php代碼部分:
$name_login=$_POST['name_login'];
$psw_login=$_POST['psw_login'];
$url = "127.0.0.1";
//帳號
$user = "root";
//密碼
$password = "";
//串連
$con = mysql_connect($url,$user,$password);
if (!$con){
die('Could not connect: ' . mysql_error());
}
//設定編碼機
mysql_query("set names utf8");
//串連資料庫
mysql_select_db("yang");
$sql = "select * from plane where username='$name_login'";
$result=mysql_query($sql,$con);
$re=mysql_fetch_assoc($result);
if($re) {
if($re['psw']==$psw_login) {
echo "true";
}
}
?>
輸錯時,控制台輸出data是什嗎?
輸錯時,無輸出。這是我php代碼部分:
$name_login=$_POST['name_login'];
$psw_login=$_POST['psw_login'];
$url = "127.0.0.1";
//帳號
$user = "root";
//密碼
$password = "";
//串連
$con = mysql_connect($url,$user,$password);
if (!$con){
die('Could not connect: ' . mysql_error());
}
//設定編碼機
mysql_query("set names utf8");
//串連資料庫
mysql_select_db("yang");
$sql = "select * from plane where username='$name_login'";
$result=mysql_query($sql,$con);
$re=mysql_fetch_assoc($result);
if($re) {
if($re['psw']==$psw_login) {
echo "true";
}
}
?>
我是說輸錯時
console.log(data+' '+typeof data);
console.log(data=='true');
這兩句輸出什嗎?
我是說輸錯時
console.log(data+' '+typeof data);
console.log(data=='true');
這兩句輸出什嗎?
test.html:38 string
test.html:39 false
看看你的表單
看看你的表單
謝大神幫我分析,以下是html內容
Document
看看你的表單
這個js指令碼是我改成了直接使用jq的ajax()方法非同步提交,想看看是不是ajaxsubmit外掛程式出了問題。結果還是一樣,用戶端根本不識別php返回來的字串。
這樣測試
$(function() { //最好這樣包起來,以防 jq 載入太慢 $('#btn').click(function () { $.ajax({ url:'plane/login.php', type:'post', data:{ 'name_login':'fengjie', 'psw_login':'123123', }, success:function(data) { alert(data); //直接查看返回的資料,如果 php 有問題,一樣能看到 } }) })})
這樣測試
$(function() { //最好這樣包起來,以防 jq 載入太慢 $('#btn').click(function () { $.ajax({ url:'plane/login.php', type:'post', data:{ 'name_login':'fengjie', 'psw_login':'123123', }, success:function(data) { alert(data); //直接查看返回的資料,如果 php 有問題,一樣能看到 } }) })})
測試了,如果使用者名稱密碼寫對了,彈窗提示‘true’,若果錯的,彈窗為空白。我現在的問題是,如果php返回’true‘,js指令碼這邊的判斷句data==‘true’的結果是false,怎麼可能是false???php返回的就是字串類型的‘true’啊!
alert(data.length); //看一下返回資料的長度
alert(data.length); //看一下返回資料的長度
輸對了,長度是5,輸錯了長度是1。奇怪了,返回空的怎麼還有長度?
因為長度不同,所以 dada == 'true' 不會成立
你可以進一步看一下多出來的字元的內碼是多少
alert(data.charCodeAt(0));
如果小於等於 32,就表示你的程式多輸出了 空格、定位字元、斷行符號、換行
如果大於 255,就表示你的程式檔案有 BOM 頭
看來,經過這一折騰,你已經具有處理 ajax 隱性問題的能力了
因為長度不同,所以 dada == 'true' 不會成立
你可以進一步看一下多出來的字元的內碼是多少
alert(data.charCodeAt(0));
如果小於等於 32,就表示你的程式多輸出了 空格、定位字元、斷行符號、換行
如果大於 255,就表示你的程式檔案有 BOM 頭
看來,經過這一折騰,你已經具有處理 ajax 隱性問題的能力了
我測試了,輸對了內碼顯示是116,輸錯了內碼顯示9。怎麼還不一樣呢?
因為長度不同,所以 dada == 'true' 不會成立
你可以進一步看一下多出來的字元的內碼是多少
alert(data.charCodeAt(0));
如果小於等於 32,就表示你的程式多輸出了 空格、定位字元、斷行符號、換行
如果大於 255,就表示你的程式檔案有 BOM 頭
看來,經過這一折騰,你已經具有處理 ajax 隱性問題的能力了
我測試了,輸對了內碼顯示是116,輸錯了內碼顯示9。怎麼還不一樣呢?
如果輸對了,charcodeat(4)就是9,這個跟輸錯時,charcodeat(0)相同,看來確實我以為php返回為空白,其實是返回了一個編碼為9的字元。
因為長度不同,所以 dada == 'true' 不會成立
你可以進一步看一下多出來的字元的內碼是多少
alert(data.charCodeAt(0));
如果小於等於 32,就表示你的程式多輸出了 空格、定位字元、斷行符號、換行
如果大於 255,就表示你的程式檔案有 BOM 頭
看來,經過這一折騰,你已經具有處理 ajax 隱性問題的能力了
我測試了,輸對了內碼顯示是116,輸錯了內碼顯示9。怎麼還不一樣呢?
如果輸對了,charcodeat(4)就是9,這個跟輸錯時,charcodeat(0)相同,看來確實我以為php返回為空白,其實是返回了一個編碼為9的字元。
我php那邊無論輸出‘true’還是‘false’甚至無輸出時,js指令碼這邊接收的data字串的最後都自動加了編碼為9的字元,好奇怪!
你把程式檔案的 bom 頭去掉就行了
你把程式檔案的 bom 頭去掉就行了
謝大神,我用了trim,整個程式就正常了。但這樣治標不治本,我還沒弄清這個bom頭是怎麼加進去的,網上有說是編輯器的原因,我用的editplus,看來得換個編輯器試試。
儲存檔案時選擇 utf-8 無 bom
儲存檔案時選擇 utf-8 無 bom
我看了editplus的喜好設定,預設儲存就是utf-8無bom
那還要看 標記外是否有空格、空行之類的
那還要看 標記外是否有空格、空行之類的
我查了php檔案,果然是標記外有個定位字元,哎,剛學php,埋了太多雷啊,膜拜大神!