如果使用ctype_alnum()或preg_match(),则跳过对空输入的验证

时间:2019-12-03 09:07:37

标签: php

我有这个验证码:

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()时,我不知道为什么以及如何使其不跳过空验证。

2 个答案:

答案 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;
}