Функция проверки данных полученных из формы 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. Но сначала надо научиться валидировать данные вручную