Проверка формы PHP с несколькими функциями

Я создал форму регистрации и в целях безопасности хочу проверить вводимые пользователем данные.

Я создал несколько функций, показанных ниже.

Я просто не уверен, как правильно их реализовать. Вкладываю ли я операторы if? Я просто сохраню это так, как сейчас?

Как мне остановить мой сценарий, если что-то не так? Чтобы предотвратить попытку вставки, когда что-то не так.

Любая помощь приветствуется.


function validateLength($stringToValidate, $minimumLength) {
    if (strlen($stringToValidate) < $minimumLength) {
        return [
            'error' => 'Minimum length is 8 charachters',
            'class' => 'alert alert-danger',
        ];
    } else {
        return true;
    }
}

function validateEmail($emailToVerify) {
    if (filter_var($emailToVerify, FILTER_VALIDATE_EMAIL)) {
        return true
    } else {
        return [
            'error' => '<strong>Error:</strong> That is not a valid email address',
            'class' => 'alert alert-danger'
        ];
    }
}

function formIsFilledIn(array $formInputs = []) {
    foreach ($formInput as $inputField) {
        if (empty($inputField)) {
            return [
                'error' => '<strong>Error: </strong> Fill in all fields.',
                'class' => 'alert alert-danger',
            ];
        }
    }
    return null;
}

Теперь я использую все функции таким образом.

$formErrors = formIsFilledIn($_POST);

if ($formErrors !== null) {
   // Something is not filled in
}

$formErrors = validateLength($_POST['username'], 8);

if ($formErrors !== true) {
   // Username doesn't have enough characters
}

$formErrors = validateLength($_POST['password'], 8);

if ($formErrors !== true) {
   // Password doesn't have enough characters
}

Для полноты картины это вставка (работает исправно)

$stmt = $connect->prepare('INSERT INTO `users` (user_name, user_password, user_email, user_perms, user_created_at) VALUES (?, ?, ?, ?, ?)');

if ($stmt) {
    $username = $_POST['username'];
    $password = hashPassword($_POST['password']);
    $email = $_POST['email'];
    $date = date('Y-m-d H:i:s');
    $perms = "Gebruiker";

    $stmt->bind_param('sssss', $username, $password, $email, $perms, $date);

    if ($stmt->execute()) {
        $err = "<strong>Success: </strong> The account has been created";
        $class = "alert alert-success";
    } else {
        $err = "<strong>Error:</strong> Something went wrong";
        $class = "alert alert-danger";
    }
}

вы можете использовать exit() и определять номера ошибок, относящиеся к каждому случаю; аналогично тому, как веб-браузеры возвращают ошибку 404, если страница не может быть найдена

bowl0stu 24.05.2018 21:29

Что именно вы подразумеваете под номерами ошибок? Не могли бы вы уточнить?

user028938293 24.05.2018 21:36

например if ($formErrors !== true) { exit('9');}. это прервет скрипт и вернет строку '9', которую вы можете проверить, используя свой интерфейс.

bowl0stu 24.05.2018 21:36

Должен ли я затем использовать эти числа для отображения ошибок соответственно или они для чего-то другого? Поскольку мои функции выдают ошибки в массиве, который я затем могу отобразить с помощью $formErrors['error'];

user028938293 24.05.2018 21:39
Стоит ли изучать 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 и хотите разрабатывать...
1
4
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы действительно можете связать if, используя elseif. Однако я бы предложил некоторые изменения в functions. Вместо того, чтобы позволить им проверять и возвращать массив, содержащий некоторые ошибки, вам нужно только позволить им проверять и возвращать либо true, либо false.

Это выглядело бы примерно так:

function validateLength($stringToValidate, $minimumLength) {
    if (strlen($stringToValidate) < $minimumLength) {
        return false;
    } else {
        return true;
    }
}

function validateEmail($emailToVerify) {
    if (filter_var($emailToVerify, FILTER_VALIDATE_EMAIL)) {
        return true;
    } else {
        return false;
    }
}

function formIsFilledIn(array $formInputs = []) {
    foreach ($formInputs as $inputField) {
        if (empty($inputField)) {
            return false;
        }
    }
    return true;
}

Это означает, что вы можете делать следующее:

if (!formIsFilledIn($_POST)) {
    $error = [
        'error' => '<strong>Error: </strong> Fill in all fields.',
        'class' => 'alert alert-danger',
    ];

} elseif (!validateLength($_POST['username'], 8) || !validateLength($_POST['password'], 8)) {
    $error = [
        'error' => 'Minimum length is 8 charachters',
        'class' => 'alert alert-danger',
    ];
}

elseif (!validateEmail($_POST['email'])) {
    $error = [
        'error' => '<strong>Error:</strong> That is not a valid email address',
        'class' => 'alert alert-danger'
    ];
}

else {
// now you can call a function that starts to insert stuff, everything has been validated
}

Конечно, чем длиннее будет форма, тем длиннее она будет. Другой вариант - перебрать сообщение и проверить, все ли поля имеют допустимую длину. Когда это будет сделано, вы можете проверить электронную почту и все другие специальные поля.

Таким образом, я мог бы повторить это сообщение об ошибке где-нибудь еще на моей странице, используя echo $error['error'];. Я вижу и понимаю, что вы здесь сделали, но это то, что я пытался предотвратить изначально. Я хочу выполнять централизованную обработку ошибок, поэтому мне нужно изменить ее только в одном месте, если мне нужно что-то изменить в будущем. Каковы преимущества этого способа и есть ли / есть ли альтернативы?

user028938293 24.05.2018 21:51

Преимущество этого способа состоит в том, что функции делают именно то, что они говорят, проверяют и ничего больше. Это означает, что вы можете использовать функции в других местах. Это также означает, что у вас есть одно место или функция (если вы поместите проверяющую часть в функцию), где вы должны изменить сообщения об ошибках. И последнее, но не менее важное: если первый if завершился неудачно, остальные if и else не будут выполнены.

Jelmergu 25.05.2018 09:36

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