2015-06-17 44 views
2

我通過AJAX發送POST請求的PHP腳本像這樣:JQuery字符串比較返回不正確的值?

$.post("login.php", {u: username,p: password}) 
    .done(function(response){ 
     console.debug(response); 
     if (response === "0") { 
      $("#loginMessage").html("Invalid Username or Password"); 
     } else { 
      $.mobile.changePage("#homePage"); 
     } 
}) 

而且login.php片段。如果登錄憑證失敗,我回復"0"。我相信這將輸出一個字符串,因爲它是在引號,而不是echo 0;

if ($stmt->num_rows > 0 && password_verify($password,$hashedPassword)) { 
     $_SESSION["uid"] = $uid; 
    } else { 
     echo "0"; 
    } 

然而,當我輸入無效憑證比較response === "0"正在恢復FALSE,雖然當我使用console.debug(response),它表明這是確實是0

經過我自己的一些小竅門,我發現如果我將response === "0"更改爲response == 0,它會正確評估爲true

response === 0也評估爲FALSE,這使我更加困惑。

有人可以爲我解釋這一點嗎?

+1

請確保(無論出於何種原因),js不會將ajax響應中的'0'轉換爲整數。在JS中,0 ===「0」是錯誤的,因爲類型不匹配(string v.s. integer)。 –

+1

這是因爲'==='檢查值是否相等,但是也檢查變量的類型。 – D4V1D

+0

'console.log(response.length)'告訴你什麼? –

回答

1

此問題的典型原因是響應包含空白字符。他們不一定會在控制檯中顯而易見,但檢查response.length是一個很容易找到的方法。

請記住,除了<?php ... ?>分隔符之外的任何內容,也包括空格字符(例如換行符)都將包含在響應中。

防止尾隨空格字符的典型方法是根本沒有關閉?>


雖然你可以簡單地"trim" the response比較之前,更好的解決方法是修復服務器端腳本來真的只是送你想送什麼。

0

嚴格相等運算符比較值和數據類型。例如,如果您將零作爲字符串並將零作爲數字進行比較,則返回false。所以這就是爲什麼你看錯了。當你使用「嚴格平等」(===)時,確保你比較了具有相同類型和數據的2個對象,否則使用簡單的平等運算符(==)。