我正在尝试在注册用户时练习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);
答案 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;
。
所有这些说明,当输入无效时,您实际上需要停止运行插入代码!