为什么插入方法会跳过验证?

时间:2018-07-18 08:45:05

标签: php oop

我正在尝试在注册用户时练习OOP,所以我已经开始进行验证和插入。问题是,当我直接从类中调用验证函数时,它可以正常工作,但是当我调用调用验证的插入函数时,似乎没有验证发生,只是跳到了插入。

    <?php
require_once('../dbconnection.php');
class USERS {
    const usersTable = TABLE_PREIX.'-users';
    public $username, $firstname, $lastname, $email, $password, $error,$_connection;
    public function __construct(){
        //Create DB connection
        $this->_connection= DB_CONN::getInstance()->getConnection();
    }

    //Set user
    public function setUSER($username, $email, $firstname = "", $lastname = ""){
        $this->username = $username;
        $this->email = $email;
        $this->firstname = $firstname;
        $this->lastname = $lastname;

        $this->validateUser($this->username,$this->email,$this->firstname,$this->lastname);

        $sql = "INSERT INTO xjk-users (username, email, firstname, lastname)
                VALUES ($this->username, $this->email, $this->firstname, $this->lastname)";

                if ($this->_connection->query($sql) === TRUE) {
                    header('Location: '.SITE_URL.'?message=user_inserted');
                    exit();
                } else {
                    $this->error[] = 'insert_user_error';
                    header('Location:'.SITE_URL.'?errors='.implode(',',$this->error));
                    exit();
                }

    }

    public function validateUser($username, $email, $firstname , $lastname ){
        if(empty($username) || empty($email)){
            return header('Location:'.SITE_URL.'?errors=empty_fields');
        }

        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return header('Location:'.SITE_URL.'?errors=invalid_email');
        }
    }

}

if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['registration'])){
    $username = $_POST['register-username'];
    $email = $_POST['register-email'];
}
$user = new USERS();
$user->setUSER($username,$email);

2 个答案:

答案 0 :(得分:1)

调用方法validateUser()时,它具有一个返回值,即标头。当您调用方法setUSER()时,它将调用validateUser()方法,但对结果不执行任何操作。因此,即使validateUser()返回一个标头(是的,该标头将构成页面响应的一部分,这就是PHP header()函数的工作方式),它仍将继续执行{ {1}}方法,因为它没有指示执行需要中断。

我建议将setUser()中的代码块移到validateUser()方法中。

我建议按照Niet的建议使用Exceptions。


P.S。对OOP感兴趣的道具。我不认为您的代码触手可及,但您需要参与其中才能学习如何正确利用OOP技术。在您的情况下,您可能需要一个setUSER()对象来代表用户,并需要一个User处理诸如验证新用户属性和创建新用户之类的事情。

答案 1 :(得分:0)

header不会立即停止代码。它只是设置一个标题。

您的validateUser应该返回某些内容,或者您​​可以使用异常模型并将其抛出无效输入。

public function validateUser($username, $email, $firstname, $lastname) {
    if( empty($username) || empty($email)) {
        throw new BadFunctionCallException("Missing name/email");
    }
    if( !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        throw new UnexpectedValueException("Invalid email");
    }
}

然后,您可以在调用此函数以捕获验证错误时使用try..catch

或者,仅根据参数的有效性使用函数return true;return false;

所有这些说明,当输入无效时,您实际上需要停止运行插入代码!