Я пытаюсь практиковать ООП при регистрации пользователей, поэтому я начал делать валидацию и вставку. проблема в том, что когда я вызываю функцию проверки непосредственно из класса, она выполняет свою работу нормально, но когда я вызываю функцию вставки, которая вызывает проверку, кажется, что проверка не выполняется, а просто переходит к вставке.
<?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);






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; в зависимости от допустимости параметров.
Все это говорит о том, что вам нужно фактически остановить запуск кода вставки, когда ввод недействителен!
Когда вы вызываете метод validateUser(), он имеет возвращаемое значение, которое является заголовком. Когда вы вызываете метод setUSER(), он вызывает метод validateUser(), но ничего не делает с результатом. Таким образом, даже если validateUser() возвращает заголовок (и да, этот заголовок будет составлять часть ответа страницы, именно так работает функция PHP header()), он все равно продолжит выполнение оставшейся части метода setUser(), поскольку он не указывает, что выполнение нужно сломать.
Я бы предложил переместить блок кода в validateUser(), чтобы он был встроен в метод setUSER().
Я бы посоветовал следовать совету Ниета по использованию исключений.
P.S. Реквизит для интереса к ООП. Я не думаю, что ваш код попадает в точку, но вам нужно принять участие, чтобы научиться правильно использовать методы ООП. В вашем случае вам, вероятно, понадобится объект User, представляющий пользователя, и UserService, который обрабатывает такие вещи, как проверка новых свойств пользователя и создание новых пользователей.
спасибо, и да, я уверен, что я не реализовал все, как должно быть, и уверен, что когда я найду руки, я получу больше. Я учту ваш совет, спасибо
Хорошая добавленная стоимость за исключением