我正在我的程序中编写部分来更新用户,并且有密码和确认密码。我不想对数据库中的密码字段做任何事情,除非他们填写了字段。
所以我有错误检查:
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回答中看到的逻辑来看,似乎简单的异或会起作用。但 但它没有,有人可以向我解释原因吗?
答案 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
}