2015-06-17 2 views
2

Я посылаю запрос на запись к PHP скрипт через AJAX, как так:Сравнение строк 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 не преобразовывает это '0' из ответа ajax в целое число. '0 ===" 0 "' false в JS, потому что типы не совпадают (строка v.s. integer). –

+1

Это потому, что '===' проверяет равенство по значению, но также и тип переменной. – D4V1D

+0

Что говорит 'console.log (response.length)' вам? –

ответ

1

Типичной причиной этой проблемы является то, что ответ содержит пробельные символы. Они не обязательно будут очевидны в консоли, но проверка response.length - это простой способ узнать.

Имейте в виду, что в ответ будут включены все, что находится за пределами разделителей <?php ... ?>, а также пробельные символы (например, разрывы строк).

Типичным способом предотвращения прокрутки символов пробелов является не закрытие ?>.


В то время как вы могли бы просто "trim" the response перед сравнением, лучшим решением является исправление на стороне сервера скрипт на самом деле просто отправить то, что вы хотите отправить.

0

Оператор строгого равенства сравнивает как значение, так и тип данных. Например, если вы сравниваете нуль как строку и ноль как число, он возвращает false. поэтому вы видите ложь. Убедитесь, что вы сравниваете 2 объекта с одним и тем же типом и данными, когда вы используете «Строгое равенство» (===), в противном случае используйте простой оператор Equality (==).

Смежные вопросы