了解XOR PHP

时间:2013-01-28 12:47:54

标签: php xor

我正在我的程序中编写部分来更新用户,并且有密码和确认密码。我不想对数据库中的密码字段做任何事情,除非他们填写了字段。

所以我有错误检查:

if(($sql['password']!="") && ($sql['cpassword']!=""))
            {
                if($sql['password'] == $sql['cpassword'])
                {
//update
}

}

但是,如果他们只填写其中一个密码字段,我想写一个快速行来抛出错误信息。所以我想:

if($sql['password'] ^ $sql['cpassword']) 
            {
                echo You must fill out <i>both</i> password fields and they <i>must</i> match.";
            }

会这样做,但它似乎没有。然后我添加了一个NOT运算符,!,这似乎运行良好,但是如果两个字段中都有 nothing ,我仍然会收到错误消息:(

从我可以从this回答中看到的逻辑来看,似乎简单的异或会起作用。但 但它没有,有人可以向我解释原因吗?

1 个答案:

答案 0 :(得分:3)

XOR肯定不是你想要的。

正如David所说,如果值不同,XOR将返回“true”结果,但是当你对两个字符串进行异或时,XOR操作只会在最短字符串的位置完成。

实施例

'AAAA' ^ 'AAAA'这会返回一个空字符串(假等价值),因为值相同。

'AAAA' ^ 'bbbb'这会返回一个非空字符串(true-equivalent value)..

'AAAA' ^ 'AAAAbbbb'这会返回一个空字符串(假等价值),即使字符串不同。这是因为操作的结果只考虑前4个字符。

在Sandy Lee的例子中(bool)$string并没有真正帮助。

(bool)'0' = false

(bool)'1' = true

这不会告诉您字符串是否为空。它只是给你字符串的布尔等价值。

根本不需要在这里使用XOR。它不适合这项工作。没有必要尝试做任何花哨的事情,简单的工具可以很好地工作。

$password = trim($password);
$confirm = trim($confirm);

if (!$password || !$confirm) {
    // One of the fields was not completed.
}
elseif ($password !== $confirm) {
    // Fields did not match
}
else {
    // Update password
}