通过!==进行比较时,相同的值被视为不同

时间:2016-11-19 23:02:52

标签: php

Jquery通过AJAX捕获字段输入和POST到.php。这些字段是'密码'和' confirmmpassword'

PHP将使用$ _POST ['密码']和$ _POST [' confirmmpassword']作为参数调用对象的方法

该方法具有以下检查:

} else if ($password !== $confirmPassword){
        $response = 'Passwords do not match';
        return $response;

        } 

无视我输入的内容,总是"密码与#34;不匹配。

我将值打印到error_log()只是为了安全起见,它们是相同的,即不会发生修改。

有没有人知道这种行为是什么?

UPD 1

我做了一些测试,似乎!==检查工作正常BEFORE变量作为参数传递给对象的方法。但是,在我将这些值作为参数传递给一个类(通过' require'添加到页面)后,发生了一些可怕的事情......

UPD 2

以下是完整代码:

a)Jquery

var signupRegister = function(){
    var username  = $('#signup-username').val();
    var email  = $('#signup-email').val();
    var password  = $('#signup-password').val();
    var confirmPassword  = $('#signup-confirmpassword').val();

    console.log(password);
    console.log(confirmPassword);
    var data = {action:'signup', username:username, email:email, password:password, confirmPassword:confirmPassword};

$.ajax({
    url: 'php/ajaxhandler.php',
    dataType: 'json',
    type: 'post',
    data: data,
    success: function(response){
        console.log(response.msg);
    }
}); 

};

b)Ajax处理程序(注意注释掉的代码可以工作!)

if(isset($_POST['action']) && $_POST['action'] === 'signup'){   //REQUEST 1: validate client input and add player to DB
    $player = new Player();
    $db = new Database();

/*
    if($_POST['password'] !== $_POST['confirmPassword']){
        $json['msg'] = 'mismatch';
        echo json_encode($json);
    } else {
        $json['msg'] = 'match';
        echo json_encode($json);

    }

*/


    $result = $player -> validateAndSignup($db, $_POST['username'], $_POST['email'], $_POST['password'], $_POST['confirmPassword']);
    if ($result){
        $json['msg'] = $result;
        echo json_encode($json);
    } else {
        error_log('Error in $player -> validateAndSignup()');
    }

c)Player类的实际方法

public function validateAndSignup($db, $username, $email, $password, $confirmPassword){     
    error_log($password);
    error_log($confirmPassword);
    if($username === "" || $email == "" || $password = "" || $confirmPassword === ""){
        $response = 'Username, email or password missing';
        return $response;       

        } else if (strcmp($password, $confirmPassword) !== 0){
        $response = 'Passwords do not match';
        return $response;

        } else if(preg_match("/[^A-Za-z0-9]/", $username)){
            $response = 'Invalid characters in username';
            return $response;

        }


}

2 个答案:

答案 0 :(得分:2)

添加完整代码后,问题很明显:

在这一行

if($username === "" || $email == "" || $password = "" || $confirmPassword === ""){

您将$password设置为""

检查$confirmedPassword的空字符串不匹配。

<强>加成: 使用isset()检查字符串是否为空而不是===。 (Explanation here

答案 1 :(得分:1)

不应该直接检查字符串,而是可以使用strcmp()来比较两个字符串。 strcmp()是二进制安全的。

  1. strcmp("StackOverflow", "StackOverflow")将返回0,因为字符串相等。

  2. 如果第一个参数小于第二个参数,则
  3. strcmp("stackoverflow", "StackOverflow")将返回<0;如果第二个参数更大,则返回>0

  4. 在你的情况下,你会想要做这样的事情:

    if(strcmp($password, $confirmedPassword) === 0) {
        echo "Password are equal!";
    }