Белый экран при отправке данных(отображение ошибок включено в php.ini
Вот сам файл регистрации register.php:
// запуск сессии
session_start();
// если пользователь уже вошел в аккаунт, перенаправляем его на главную страницу
if(isset($_SESSION['user'])) {
$new_url = "http://localhost:8080/learnphp.xyz/";
header("Location: " . $new_url);
}
// если пользователь отправил форму
$data = $_POST;
if(isset($data['do__register'])) {
// удаление спецсимволов
$username = filter_var(
trim($data['username']),
FILTER_SANITIZE_STRING
);
// удаление спецсимволов
$password = filter_var(
trim($data['password']),
FILTER_SANITIZE_STRING
);
$i = 0;
// проверка корректности данных
if(strlen($username) < 3) {
$errors[] = $i++;
exit();
}
if(strlen($username) > 20) {
$errors[] = $i++;
exit();
}
if(strlen($password) < 8) {
$errors[] = $i++;
exit();
}
if(strlen($password) > 33) {
$errors[] = $i++;
exit();
}
// хэширование пароля
$password = md5($password);
// проверка email на валидность, если email указан неверно, сообщаем об ошибке
$email = $data['email'];
if(filter_var($email, FILTER_SANITIZE_EMAIL)) {
return 0;
} else {
$errors[] = $i++;
exit();
}
// подключение к БД
require "blocks/connection.php";
// проверяем, существует ли уже пользователь с таким именем пользователя или email, если существует выдаем ошибку
$result1 = $mysql->query("SELECT * FROM `users` WHERE `username` = '$username'");
$row1 = $result1->fetch_assoc();
if($row1 != null) {
$errors[] = $i++;
exit();
}
$result2 = $mysql->query("SELECT * FROM `users` WHERE `email` = '$email'");
$row2 = $result2->fetch_assoc();
if($row2 != null) {
$errors[] = $i++;
exit();
}
// если нет ошибок, записываем данные пользователя и выводим сообщение об успешной регистрации
$mysql->query("INSERT INTO `users` (`username`, `password`, `email`) VALUES('$username', '$password', '$email')");
session_start();
$_SESSION['successfully__register'] = $username;
$mysql->close();
}
?>
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="style/style.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Encode+Sans+SC&display=swap" rel="stylesheet">
<title>Регистрация</title>
</head>
<body>
<div class="wrapper">
<header>
<div class="header">
<p class="header__header">Learn php</p>
</div>
</header>
<div class="header__burger">
<span></span>
</div>
<nav class="header__nav">
<ul class="menu header__menu">
<li><a href="http://localhost:8080/learnphp.xyz/" class="menu__item">Главная</a></li>
<li><a href="http://localhost:8080/learnphp.xyz/functions.php" class="menu__item">Функции PHP</a></li>
<?php if(!isset($_SESSION['user'])): ?>
<li><a href="http://localhost:8080/learnphp.xyz/login.php" class="menu__item">Вход</a></li>
<li><a href="http://localhost:8080/learnphp.xyz/register.php" class="menu__item">Регистрация</a></li>
<li><a href="#" class="menu__item">Забыли пароль?</a></li>
<?php else: ?>
<li><a href="#" class="menu__item">Профиль</a></li>
<li><a href="#" class="menu__item">Создать запись</a></li>
<li><a href="#" class="menu__item">Выход</a></li>
<?php endif; ?>
</ul>
</nav>
<?php if(isset($_SESSION['successfully__register'])): ?>
<div class="register__successfully">
<p>Вы успешно зарегистрировались, перейдите <a href="http://localhost:8080/learnphp.xyz/login.php">сюда</a> чтобы войти на свой аккаунт</p>
</div>
<?php endif; ?>
<?php if(isset($errors)): ?>
<div class="register__errors">
<?php if(isset($row1)): ?>
<?php if($row1 != null): ?>
<p>Пользователь с таким именем уже существует</p>
<?php endif; ?>
<?php endif; ?>
<?php if(isset($row2)): ?>
<?php if($row2 != null): ?>
<p>Пользователь с таким E-Mail уже существует</p>
<?php endif; ?>
<?php endif; ?>
<?php if(strlen($username) < 3): ?>
<p>Ваше имя пользователя не должно быть меньше трёх символов</p>
<?php endif; ?>
<?php if(strlen($username) > 20): ?>
<p>Ваше имя пользователя не должно быть больше двадцати символов</p>
<?php endif; ?>
<?php if(strlen($password) < 8): ?>
<p>Ваш пароль должен содержать минимум 8 символов</p>
<?php endif; ?>
<?php if(strlen($password) > 33): ?>
<p>Ваш пароль не может быть больше 33 символов</p>
<?php endif; ?>
</div>
<?php endif; ?>
<?php if(!isset($_SESSION['successfully__register'])): ?>
<div class="form__register">
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="POST">
<input class="register__username" type="text" name="username" placeholder="Имя пользователя" required>
<br>
<input class="register__email" type="text" name="email" placeholder="Электронная почта" required>
<br>
<input class="register__password" type="password" name="password" placeholder="Пароль" required>
<br>
<input class="register__submit" type="submit" value="Зарегистрироваться" name="do__register">
</form>
</div>
<?php endif; ?>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>
Если в регистрации есть какая-то ошибка, то сценарий должен выводить ошибку в теге div с классом register__errors, но я ввел все правильно, нажимаю отправить, но вместо текста "Вы успешно зарегистрировались", со страницы все пропадает, а остается лишь белый экран, а в базе данных, данных которые я ввел, нет(
вот файл подключения к самой базе данных connection.php:
$mysql = new mysqli("localhost", "username", "password", "database");
нет, отображение ошибок у меня включено, или может я чего-то не выкупаю, объясните пожалуйста
Ответы (1 шт):
Ошибка в том, что Вы везде вызываете exit() в случае невалидных данных, что обрывает ваш скрипт и выводит пустую страницу. Но даже если данные валидны, то вот этот блок:
// проверка email на валидность, если email указан неверно, сообщаем об ошибке
$email = $data['email'];
if(filter_var($email, FILTER_SANITIZE_EMAIL)) {
return 0;
} else {
$errors[] = $i++;
exit();
}
оборвет ваш скрипт в любом случае, поскольку и exit и return оборвут выполнение скрипта.
Если вызывается из глобальной области видимости, выполнение текущего файла скрипта прекращается.
Вывести сообщение и прекратить выполнение текущего скрипта