我有这个验证码:
public function validate() {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach ($this->required as $field) {
if (empty($_POST[$field])) {
$this->error = $this->message['required'];
}
}
if (!ctype_alnum($_POST['text'])) {
$this->error = $this->message['text']['alphanum'];
}
if (strlen($_POST['text']) > 3) {
$this->error = $this->message['text']['length'];
}
}
return $this->error;
}
问题在于,即使'text'
输入为空,它也会跳过if (empty($_POST[$field]))
语句并转到if (!ctype_alnum($_POST['text']))
语句,显示其错误。
如果我注释掉if (!ctype_alnum($_POST['text']))
语句,那么如果提交的“文本”输入为空,它将正常工作并显示“此字段为必填”错误。
如果我将语句从foreach循环中取出并使用elseif
,它也将起作用,如下所示:
if (empty($_POST['text'])) {
$this->error = $this->message['required'];
} elseif (!ctype_alnum($_POST['text'])) {
$this->error = $this->message['text']['alphanum'];
}
但是我想使用循环而不使用elseif,尤其是因为我将有很多必填字段需要验证。
我也尝试过:
if (empty($_POST[$field]))
语句,并将其添加为其他语句:if (empty($_POST['text']))
; $_POST['text'] == ''
代替empty()
; strlen($_POST['text']) == 0
代替empty()
; preg_match()
代替ctype_alnum
。这显示了当我使用var_dump($_POST['text'])
并使用空输入提交时:
/home/vagrant/code/test/index.php:13:string '' (length=0)
使用ctype_alnum()或preg_match()时,我不知道为什么以及如何使其不跳过空验证。
答案 0 :(得分:2)
问题是,如果满足以下条件$this->error
,则您将覆盖true
,即,如果下一个条件$this->message['required']
为真,并且您将无法获得!ctype_alnum($_POST['text'])
,并且用其消息覆盖$this->error
。
因此,您需要在每个条件内返回$this->message
。
public function validate() {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach ($this->required as $field) {
if (empty($_POST[$field])) {
$this->error = $this->message['required'];
return $this->error;
}
}
if (!empty($_POST['text']) {
if (!ctype_alnum($_POST['text'])) {
$this->error = $this->message['text']['alphanum'];
return $this->error;
}
if (strlen($_POST['text']) > 3) {
$this->error = $this->message['text']['length'];
return $this->error;
}
}
}
return $this->error;
}
答案 1 :(得分:1)
我建议只检查“文本”字段是否为空,然后再检查其他任何条件,如下所示:
public function validate() {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach ($this->required as $field) {
if (empty($_POST[$field])) {
$this->error = $this->message['required'];
}
}
if (!empty($_POST['text']) {
if (!ctype_alnum($_POST['text'])) {
$this->error = $this->message['text']['alphanum'];
}
if (strlen($_POST['text']) > 3) {
$this->error = $this->message['text']['length'];
}
}
}
return $this->error;
}