以下是我的php代码。 我正在尝试进行注册的表单验证,当我提交表单而不填写所有字段时,一切似乎都很好。当我尝试填满所有内容(但故意使密码不匹配)时,它仍然可以使我成功注册。
if (isset($_POST['submitted']))
{
if (empty($_POST['useremail']))
$newemailerr = "Email is required!";
else
$newemail = ($_POST['useremail']);
if (empty($_POST['userid']))
$newiderr = "Username is required!";
else
$newid = ($_POST['userid']);
if (empty($_POST['userpass']))
$newpasserr = "Password is required!";
else
$newpass = ($_POST['userpass']);
if (empty($_POST['confirmpass'] && $_POST['confirmpass'] != $_POST['userpass']))
$newconfirmpasserr = "Both passwords do not match!";
else
$newconfirmpass = ($_POST['confirmpass']);
}
答案 0 :(得分:4)
// meh:
for (int* n : {&a, &b, &c}) {
*n = 0;
}
// meh:
using intRef = std::reference_wrapper<int>;
for (int& n : {intRef (a), intRef (b), intRef (c)}) {
n = 0;
}
}
您应在此处使用OR
if (isset($_POST['submitted']))
{
if (empty($_POST['useremail']))
$newemailerr = "Email is required!";
else
$newemail = ($_POST['useremail']);
if (empty($_POST['userid']))
$newiderr = "Username is required!";
else
$newid = ($_POST['userid']);
if (empty($_POST['userpass']))
$newpasserr = "Password is required!";
else
$newpass = ($_POST['userpass']);
if (empty($_POST['confirmpass']) || $_POST['confirmpass'] != $_POST['userpass']) $newconfirmpasserr = "Both passwords do not match!";
else
$newconfirmpass = ($_POST['confirmpass']);
}
答案 1 :(得分:0)
假设您的PHP版本支持简体(DRY)-您可以推送错误,并且仅在需要时返回一次
$newemail = $_POST['useremail'] ?? "";
$newid = $_POST['userid'] ?? "";
$newpass = $_POST['userpass'] ?? "";
$newconfirmpass = $_POST['confirmpass'] ?? "";
if (trim($newemail) == "") { echo "Email is required!"; die(0); }
if (trim($newid) == "") { echo "Username is required!"; die(0); }
if (trim($newpass == "") { echo "Password is required!"; die(0); }
if (trim($newconfirmpass) == "") { echo "New password is required!"; die(0); }
if ($newpass != $newconfirmpass ) { echo "Passwords do not match!"; die(0); }
答案 2 :(得分:0)
在最后一个if函数中,您有一个错误的假设。如果在进入功能后(满足功能条件后)使用&&
,则应该$ newconfirmpass = ($ _POST ['confirmpass']
为$ newconfirmpasserr = "Both passwords do not match!";
(将功能中的操作与功能外部交换)。当然,此解决方案在整个函数的结构逻辑上会有缺陷,因为您在任何条件函数的主体中都有一条消息。我建议将&&
替换为||
(and
上的or
)。这样可以解决问题。
该代码不验证输入数据。我知道这是在代码的另一部分(控制器)或前端应用程序中-在html级别和/或javascript上进行验证。
值得一提的是,这样的构造(主要功能)违反了 DRY 和打开/关闭的原理,变量的命名违反了 PSR1 -良好的软件开发原则。在 DRY 的第一种情况下,您可以使用@mplungjan用户提出的解决方案。 打开/关闭-而是需要对对象样式进行重构。 PSR1 -我建议使用camelCase。
该代码显示了过程编程的趋势,这使该代码的进一步工作变得复杂。我建议您将这段代码重构为对象模型。
也不建议在一个变量中传递参数或消息。一个好的解决方案是使用两个关联数组(也可以是集合或对象)–一个用于变量,另一个用于发送消息。这将使代码保持顺序-在此阶段以及将来的开发。