Функция проверки данных полученных из формы PHP

Задание: полученные данные из формы проверить и если они проходят по всем критериям, добавить в базу данных. Вопрос: куда в обработчике мне впихнуть мою функцию чтобы всё заработало? Заранее спасибо за предложения и критику

function dataValidation()

{
    $received_data = $_POST;
    $user = $received_data['user'];
    $message_text = $received_data['message_text'];
    $allowed_symbols = "/^[a-zA-Z0-9\-_]+$/"; // допустимые символы
    $user_max_length = 30; // макс кол-во символов для имени
    $message_text_max_length = 1000; // макс кол-во символов для поля сообщения
    try {
        if (empty($received_data)) {
            throw new Exception("Данные не были переданы");
        }
        if ($_SERVER["REQUEST_METHOD"] !== "POST" && $_SERVER['HTTP_REFERER'] !== "http://localhost/myproject/form.php") {
            throw new Exception("Некорректная передача данных");
        }
        if (empty($user) || empty($message_text)) {
            throw new Exception("Заполните все поля");
        }
        if (mb_strlen($user) > $user_max_length){
            throw new Exception("Превышено допустимое количество символов в поле имени");
        }
        if (mb_strlen($message_text) > ($message_text_max_length)) {
            throw new Exception ("Превышено допустимое количество символов в поле сообщения");
        }
        if ((!(preg_match($allowed_symbols, $user))) && (!(preg_match($allowed_symbols, $message_text)))){
            throw new Exception("Введены неправильные символы");
        }
    } catch (Throwable $b)
    {
        $error = $b->getMessage();
        $back_to_form = "<br> <br> <a href = 'form.php'> Вернуться к форме</a>";
        echo $error;
        echo $back_to_form;
    }
} ```

Дальше обработка 

try {
    $received_data = $_POST;
    $user = $received_data['user'];
    $message_text = $received_data['message_text'];
    $mysqli = new mysqli(SERVER, USERNAME, PASSWORD, DBNAME);
    if ($mysqli->connect_errno) {
        throw new Exception($mysqli->connect_error);
    }
    $user_check = htmlspecialchars($user);
    $message_text_check = htmlspecialchars($message_text);
    $data_uploading = "INSERT INTO `message` (user, message_text) VALUES ('$user_check', '$message_text_check')";
    if (!($result = $mysqli->query($data_uploading))) {
        throw new Exception($mysqli->error);
    }
    $mysqli->close();
} catch (Throwable $e) {
    $error = $e->getMessage();
    echo $error;
    exit();
}
    header("Location: index.php"); ```

Ответы (1 шт):

Автор решения: Ипатьев

Функция здесь не нужна. Как и исключения. Кормить пользователя по одной ошибке сложечки - это садизм. Ошибки надо показывать все сразу. И разумеется надо сразу выводить заполненную форму, а не ссылку на неё. Не стоит издеваться над пользователями.

Также надо выкинуть какое-то дурацкое дублирование кода, плюс варварские способы работы с БД заменить на нормальные

Общая структура проверок должна быть такой

  • проверяем форму, добавляя ошибки в массив
  • если массив пустой, то записываем в БД и делаем редирект
  • показываем форму
    • если есть, показываем ошибки
    • если есть заполняем введённые данные

то есть как-то так

$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST')
{
    if (mb_strlen($user) > $user_max_length){
       $errors['user'] = "Превышено допустимое количество символов в поле имени";
    }
    // и так далее

    if (count($errors) === 0) {
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        $mysqli = new mysqli(SERVER, USERNAME, PASSWORD, DBNAME);
        $db->set_charset('utf8mb4');

        $sql = "INSERT INTO `message` (user, message_text) VALUES (?,?)";
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param("ss", $user_check, $message_text_check)
        $stmt->execute();
        header("Location: index.php");
        exit;
    }
}
?>
<form>
показываем ошибки, форму, и заполняем введённые данные, 
<input type="text" name="user" value="<?= htmlspecialchars($user) ?>">

Если же хочется сделать универсальную функцию для проверки данных, то это оне так просто. Лучше взять готовую, например класс Validator из фрейморка Laravel. Но сначала надо научиться валидировать данные вручную

→ Ссылка