Почему метод вставки пропускает проверку?

Я пытаюсь практиковать ООП при регистрации пользователей, поэтому я начал делать валидацию и вставку. проблема в том, что когда я вызываю функцию проверки непосредственно из класса, она выполняет свою работу нормально, но когда я вызываю функцию вставки, которая вызывает проверку, кажется, что проверка не выполняется, а просто переходит к вставке.

    <?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);
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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; в зависимости от допустимости параметров.

Все это говорит о том, что вам нужно фактически остановить запуск кода вставки, когда ввод недействителен!

Хорошая добавленная стоимость за исключением

e_i_pi 18.07.2018 10:54

Когда вы вызываете метод validateUser(), он имеет возвращаемое значение, которое является заголовком. Когда вы вызываете метод setUSER(), он вызывает метод validateUser(), но ничего не делает с результатом. Таким образом, даже если validateUser() возвращает заголовок (и да, этот заголовок будет составлять часть ответа страницы, именно так работает функция PHP header()), он все равно продолжит выполнение оставшейся части метода setUser(), поскольку он не указывает, что выполнение нужно сломать.

Я бы предложил переместить блок кода в validateUser(), чтобы он был встроен в метод setUSER().

Я бы посоветовал следовать совету Ниета по использованию исключений.


P.S. Реквизит для интереса к ООП. Я не думаю, что ваш код попадает в точку, но вам нужно принять участие, чтобы научиться правильно использовать методы ООП. В вашем случае вам, вероятно, понадобится объект User, представляющий пользователя, и UserService, который обрабатывает такие вещи, как проверка новых свойств пользователя и создание новых пользователей.

спасибо, и да, я уверен, что я не реализовал все, как должно быть, и уверен, что когда я найду руки, я получу больше. Я учту ваш совет, спасибо

Mohamed Omar 18.07.2018 11:14

Другие вопросы по теме