1

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

所以我有错误检查:

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 运算符!,这似乎工作得很好,但是如果两个字段都没有,我仍然会收到错误消息:(

从我可以从这个答案中看到的逻辑来看,简单的 XOR 似乎可以工作。但它没有,有人可以向我解释为什么吗?

4

1 回答 1

3

XOR 当然不是你想要的。

正如大卫所说,如果值不同,异或将返回“真”结果,但是当您对两个字符串进行异或运算时,异或运算仅在最短字符串的位置完成。

例子

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

'AAAA' ^ 'bbbb'这将返回一个非空字符串(真等效值)..

'AAAA' ^ 'AAAAbbbb'这将返回一个空字符串(假等效值),即使字符串不同。这是因为运算结果只考虑了前 4 个字符。

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

(bool)'0'=假

(bool)'1'= 真

这不会告诉您字符串是否为空。它只是为您提供字符串的布尔等效值。

这里根本不需要使用 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
}
于 2013-01-28T13:32:32.533 回答