Приднестровская поддержка XOOPS
Создание формы регистрации пользователя
Рассмотрим форму регистрации пользователя с проверкой корректности введенных данных, а заодно и обработку данных в кодировке UTF-8 (листинг 70).
Листинг 70. Проверка корректности данных
<?php
// Файл в кодировке UTF-8 без BOM !!!
mb_internal_encoding('UTF-8'); // Установка кодировки
// Если форма отправлена
if (isset($_POST['go'])) {
// Создаем короткие имена переменных
if (isset($_POST['user'])) $user = $_POST['user'];
else $user = '';
if (isset($_POST['fam'])) $fam = $_POST['fam'];
else $fam = '';
if (isset($_POST['age'])) $age = $_POST['age'];
else $age = '';
if (isset($_POST['email'])) $email = $_POST['email'];
else $email = '';
if (isset($_POST['pass1'])) $pass1 = $_POST['pass1'];
else $pass1 = '';
if (isset($_POST['pass2'])) $pass2 = $_POST['pass2'];
else $pass2 = '';
// Если "магические" кавычки включены, то удаляем слэши
if (get_magic_quotes_gpc()) {
$user = stripslashes($user);
$fam = stripslashes($fam);
$age = stripslashes($age);
$email = stripslashes($email);
$pass1 = stripslashes($pass1);
$pass2 = stripslashes($pass2);
}
$age = intval($age);
// Создаем переменную для описания всех ошибок
$err = '';
// Проверяем корректность введенных данных
// Если произошла ошибка, присваиваем переменной $err описание ошибки
if (mb_strlen($user)>50 || mb_strlen($user)<2) {
$err .= 'Недопустимая длина поля Имя<br>';
}
if (mb_strlen($fam)>50 || mb_strlen($fam)<2) {
$err .= 'Недопустимая длина поля Фамилия<br>';
}
if (!preg_match('/^[0-9]{1,3}$/su', $age) || $age==0) {
$err .= 'Неверный возраст<br>';
}
if (!preg_match('/^[a-z0-9_.-]+@([a-z0-9-]+\.)+[a-z]{2,6}$/isu', $email)
|| mb_strlen($email)>50) {
$err .= 'Неверный адрес E-mail<br>';
}
if (!preg_match('/^[a-z0-9_.-]{6,16}$/isu', $pass1)) {
$err .= 'Неверный пароль<br>';
}
else {
if ($pass1 !== $pass2) {
$err .= 'Пароли должны совпадать<br>';
}
}
// Если ошибок нет, то переменная $err будет пустой
if ($err == '') {
// Добавляем данные в базу данных
// и отправляем подтверждение на E-mail
// Делаем авторедирект, чтобы очистить данные формы
header('Location: test.php?reg=ok');
exit(); // Завершаем работу скрипта
}
else { // Если возникли ошибки
// Заменяем все спецсимволы на HTML-эквиваленты
$user = htmlspecialchars($user, ENT_COMPAT, 'UTF-8');
$fam = htmlspecialchars($fam, ENT_COMPAT, 'UTF-8');
$age = htmlspecialchars($age, ENT_COMPAT, 'UTF-8');
$email = htmlspecialchars($email, ENT_COMPAT, 'UTF-8');
}
}
else { // Если форма не отправлена
$user = $fam = $age = $email = '';
}
header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Регистрация пользователя</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h2>Регистрация пользователя</h2>
<?php
if (isset($err)) {
echo '<div><span style="color:red">При заполнении формы были допущены ';
echo 'ошибки:</span><br><br>';
echo $err, "</div>\n";
}
if (isset($_GET['reg']) && $_GET['reg'] == 'ok') {
// Если регистрация прошла успешно, выводим подтверждение
echo '<div><b>Регистрация прошла успешно</b></div>';
}
?>
<form action="test.php" method="POST">
<div>
Имя:<br>
<input type="text" name="user" value="<?php echo $user; ?>"><br>
Фамилия:<br>
<input type="text" name="fam" value="<?php echo $fam; ?>"><br>
Возраст:<br>
<input type="text" name="age" value="<?php echo $age; ?>"><br>
E-mail:<br>
<input type="text" name="email" value="<?php echo $email; ?>"><br>
Пароль:<br>
<input type="password" name="pass1"><br>
Повторите пароль:<br>
<input type="password" name="pass2">
<br><br>
<input type="submit" name="go" value="Отправить">
</div>
</form>
</body>
</html>
Как видно из примера, все имена полей, заданные с помощью параметра name, доступны через переменную окружения $_POST. Если форма отправлена (переменная $_POST['go'] будет существовать), то создаем короткие имена переменных. Может возникнуть вопрос, почему просто не присвоить значения напрямую:
$user = $_POST['user'];
Все дело в том, что если переменная $_POST['user'] будет неопределена, то при включенном режиме вывода всех ошибок интепретатор выведет предупреждающее сообщение:
Notice: Undefined index: user
Избежать вывода таких сообщений можно, предварительно проверив существование переменной или выключив вывод предупреждающих сообщений.
Выключить вывод можно тремя способами:
□ в файле php.ini присвоить значение E_ALL & ~E_NOTICE директиве error_reporting:
error_reporting = E_ALL & ~E_NOTICE
□ в самом начале скрипта вставить функцию error_reporting():
error_reporting(E_ALL & ~E_NOTICE);
□ в самом начале скрипта вставить функцию ini_set():
ini_set('error_reporting', 6135); // в PHP 5.2
ini_set('error_reporting', 30711); // в PHP 5.3
Далее с помощью функции get_magic_quotes_gpc() мы проверяем значение директивы magic_quotes_gpc. Если директива имеет значение On, то функция вернет true. Как вы уже знаете, если директива включена, интепретатор автоматически добавит защитные слэши перед специальными символами. Нам это не нужно. По этой причине мы с помощью функции stripslashes() удаляем добавленные слэши.
Чтобы сохранить описания всех ошибок, сделанных пользователем при вводе, мы определяем переменную $err и присваиваем ей пустую строку. Затем проверяем корректность введенных данных. С помощью функции mb_strlen() проверяем длину строк, а с помощью регулярных выражений и функции preg_match() проверяем соответствие E-mail и возраста определенному шаблону. Если во время проверки возникли ошибки, то записываем их в переменную $err.
Если ошибок нет (переменная $err останется пустой) добавляем данные в базу и отсылаем подтверждение на E-mail.
Далее делаем авторедирект и завершаем работу скрипта:
header('Location: test.php?reg=ok');
exit();
Зачем нужен авторедирект? После отправки данных они сохраняются в кэше Web-браузера. Если нажать кнопку Обновить на панели инструментов Web-браузера, то данные повторно будут отправлены серверу. После авторедиректа нажатие кнопки Обновить не будет приводить к повторной отправке данных формы.
Если при проверке были выявлены ошибки, то необходимо заново отобразить форму, вывести сообщения об ошибках и заполнить все поля для редактирования. Так как данные могут содержать специальные символы, мы с помощью функции htmlspecialchars() заменяем их на HTML-эквиваленты.
После этого можно без опаски заполнить все поля, подставив значения в параметр value.
Если форма не была отправлена, то присваиваем переменным пустую строку и выводим форму. В этом случае параметр value в элементах формы будет равен пустой строке.
Чтобы документ был правильно обработан Web-браузером желательно с по-мощью функции header() указать MIME-тип и кодировку документа:
header('Content-Type: text/html; charset=utf-8');
Часто на хостингах встречается ситуация, когда сервер настроен на кодиров-ку windows-1251. В этом случае сервер автоматически отправит заголовок:
Content-Type: text/html; charset=windows-1251
Учитывая, что мы работаем с кодировкой UTF-8, Web-браузер может неправильно распознать кодировку и русские буквы будут искажены. По этой причине рекомендую всегда явно указывать кодировку, посылая соответствующий заголовок с помощью функции header().
Отправитель | Нити |
---|
4 пользователь(ей) активно (2 пользователь(ей) просматривают Инструкции)
Участников: 0 Гостей: 4 далее... |