0

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

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"); ```

  • вы бы лучше про передачу параметров в запрос прочитали, чем про проверки всякие – teran Sep 13 '21 at 23:03
  • а выбрасывать исключение и ловить его тут же это какой-то нездоровый подход – teran Sep 13 '21 at 23:05
  • Ну если это прям функция функция, то стоит запихнуть ее в отдельный файл, ну или на крайняк, в начало пхп файла. Да и странно, что вы сделали ее без параметров. Может стоило сделать function dataValidation($array = array()), ну а в теле функции использовать $received_data = $array;? – Сергей Махнёв Sep 14 '21 at 05:46

1 Answers1

0

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

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

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

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

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

$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-&gt;set_charset('utf8mb4');

    $sql = &quot;INSERT INTO `message` (user, message_text) VALUES (?,?)&quot;;
    $stmt = $mysqli-&gt;prepare($sql);
    $stmt-&gt;bind_param(&quot;ss&quot;, $user_check, $message_text_check)
    $stmt-&gt;execute();
    header(&quot;Location: index.php&quot;);
    exit;
}

} ?> <form> показываем ошибки, форму, и заполняем введённые данные, <input type="text" name="user" value="<?= htmlspecialchars($user) ?>">

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