Проверка ошибок
Обработка пользовательских данных дает осмысленный результат лишь в том случае, если данные имеют правильную структуру. Проверить достоверность введенных данных невозможно, однако вы можете проверить их целостность (например, убедиться в том, что адрес электронной почты соответствует стандартному шаблону). Хотя для проверки данных часто применяется технология JavaScript, могут возникнуть проблемы с несовместимостью браузеров. Поскольку код РНР выполняется на стороне сервера, вы всегда можете быть уверены в том, что проверка данных формы даст нужный результат (конечно, при условии правильности вашей программы).
При обнаружении ошибки в данных необходимо сообщить об этом пользователю и предложить внести исправления. Существует несколько возможных решений, в том числе простой вывод сообщения об ошибке и предложение альтернативных вариантов (например, если пользователь выбирает имя, которое уже было выбрано другим пользователем).
Проверка пароля. Проверка имени пользователя
Если посетитель уже зарегистрировался на вашем сайте то нужно проверить пароль, а затем предоставить дополнительные услуги на сайте.
Создадим форму для проверки пароля пользователя.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Проверка имени пользователя и пароля</title>
</head>
<body bgcolor="#CCFFFF">
<form action="96.php" method="post" name="myform">
<table width="261" border="0">
<tr>
<td width="95">Фамилия</td>
<td width="150"><input name="фамилия" type="text" size="25" maxlength="20"></td>
</tr>
<tr>
<td>Пароль</td>
<td>
<input type="text" name="пароль"size="25"></td>
</tr><tr>
<td> </td>
<td>
<input type="submit" name="button" id="button" value="Проверить">
</td>
</tr>
</table>
</form>
</body>
</html>
А теперь подготовим скрипт для проверки введенных данных.
<?php
echo "<pre>Уважаемый $фамилия! \n";
/*открываем для записи файл, имя которого совпадает с фамилией */
$rfile=fopen("$фамилия.txt","w");
//запись информации в файл
fwrite($rfile,$пароль);
//закрываем файл
fclose($rfile);
//открываем файл для чтения
$rfile=fopen("$фамилия.txt","r");
$data=file("$фамилия.txt"); //чтение файла
$newstr=strtok($data[0],"\n ");/*разбиваем строку на подстроки до первого указанного символа*/
if (strcmp($data[0], $пароль)==0){ //сравнение строк
echo "Пароль введен правильно, у Вас есть права зарегистрированного пользователя";
} else {
echo "Пароль введен неверно";
}
fclose($rfile);
?>
Рассмотрим фрагменты кода.
$newstr=strtok($data[0],"\n ")
— здесь функция strtok()
возвращает строку по частям. Синтаксис функции:
strtok(параметр1, параметр2)
Она возвращает часть строки параметр1
до разделителя параметр2. При последующих вызовах функции возвращается следующая часть до следующего разделителя, и так до конца строки. При первом вызове функция принимает два аргумента: исходную строку параметр1
и разделитель параметр2
. Обратите внимание, что при каждом последующем вызове параметр1 указывать не надо, иначе будет возвращаться первая часть строки.
strcmp($data[0], $пароль)= = 0 — функция strcmp()
сравнивает две строки.
Синтаксис функции:
strcmp(строка1, строка2)
Эта функция сравнения строк. Она сравнивает две строки и возвращает:
- 0 - если строки полностью совпадают;
- 1 - если, строка строка1 лексикографически больше строка2;
- 1 – если, наоборот, строка строка1 лексикографически меньше строка1
Функция является чувствительной к регистру, т.е. регистр символов влияет на результаты сравнений (поскольку сравнение происходит побайтово).
Рассмотрим еще пример, как пользователю передать имя и пароль. Для этого создадим еще одну форму.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Проверка пароля и имени пользователя</title>
</head>
<body bgcolor="#CCFFFF">
<p>Введите имя пользователя и пароль</p>
<form action="98.php" method="post" name="myform">
<table border="0">
<tr>
<td width="100">Логин</td>
<td width="154"><input name="login" type="text" size="25" maxlength="30"></td>
</tr>
<tr>
<td width="100">Пароль</td>
<td><input name="password" type="password" size="25" maxlength="30"></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" value="Отправить">
</td>
</tr>
</table>
</form>
</body>
</html>
Для извлечения $login
и $password
из строки параметров создадим скрипт 98.php.
<?php
if($_REQUEST['login']=="root"&& $_REQUEST['password']=="R45EC76UT4"){
echo"Доступ открыт для пользователя ". $_REQUEST['login'];
//Команда блокирования рабочей станции(работает в NT-системах)
system("rundll32.exe user32.dll,LockWorkStation");
}else{
echo "Доступ закрыт!";
}
?>
Рассмотрим скрипт.
Все данные из полей формы РНР помещает в глобальный массив $_REQUEST, который сам определяет какой метод был задействован POST
или GET
. В нашем случае значение поля login
будет храниться в $_REQUEST['login']
, значение поля password
— в $_REQUEST['password']
. То есть, не надо ничего ни откуда "получать"— все уже установлено и распаковано из URL-кодировки. Данный код работает быстрее ранее рассмотренных скриптов. Мы уже использовали массивы $_POST
и $_GET
в сценариях с формами. РНР заполняет их соответствующими значениями. Глобальный массив $_REQUEST
представляет собой объединение этих двух массивов. system("rundll32.exe user32.dll, LockWorkStation")
— функция запуска внешних программ, имя которой передано первым параметром rundll32.exe
user32.dll
. Выводит результат работы программы в выходной поток, т.е. в браузер. Последнее обстоятельство сильно ограничивает область применения функции. Второй параметр — переменная. В нее помещается код возврата вызванного процесса.
Открываем форму. Заполняем поля Логин
и Пароль
. Если пароль и логин введены правильно, то откроется вот такая страница.
Щелкаем имя пользователя. Откроется страница с подтверждением "Доступ открыт для пользователя root".
Усовершенствуем скрипт. Сделаем так, чтобы при запуске без параметров, сценарий выдавал документ с формой, а при нажатии кнопки выводил нужный текст. Самый простой способ определить, был ли сценарий запущен без параметров — проверить, существует ли переменная с именем, совпадающий с именем кнопки отправки. Если такая переменная существует, то очевидно пользователь запустил программу, нажав кнопку.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Проверка пароля и имени пользователя</title>
</head>
<body bgcolor="#CCFFFF">
<p>Введите имя пользователя и пароль</p>
<? if (!isset($_REQUEST['doGo'])){ ?>
<form action="<?= $_SERVER['SCRIPT_NANE']?>">
<table border="1">
<tr>
<td>Имя</td>
<td><input name="login" type="text" size="25" maxlength="30"></td>
</tr>
<tr>
<td>Пароль</td>
<td><input name="password" type="password" size="25" maxlength="30" value=""></td>
</tr>
<tr>
<td> </td>
<td><input name="doGo" type="submit" value="Нажмите кнопку"></td>
</tr>
</table>
</form>
<? } else {
if($_REQUEST['login']=="root"&& $_REQUEST['password']=="R45EC76UT4"){
echo"Доступ открыт для пользователя ". $_REQUEST['login'];
//Команда блокирования рабочей станции(работает в NT-системах
system("rundll32.exe user32.dll,LockWorkStation");
}else{
echo "Доступ закрыт!";
}
}
?>
</body>
</html>
В этом примере применена конструкция <?= выражение ?>
. Она является коротким обозначением для <?php= выражение ?>
, и предназначена для того, чтобы вставлять величины прямо в HTML-страницу. Конструкция <?=
применяется обычно, когда выгодно считать, что текст первичнее программы. В нашем примере кода на РНР мало, а страница в основном состоит из HTML-тегов.
В нашем примере, параметру action
тега <form>
не задали имя файла сценария, а извлекли его из еременной окружения SCRIPT_NANE
(которая, как и все переменные, хранится в массиве $_SERVER
). Это позволило нам не привязываться к имени файла, т.е. теперь мы можем его в любой момент переименовать без потери функциональности.
Исчезла необходимость и в промежуточном файле с формой. Код формы встроен в сценарий.
Трансляция переменных окружения
Переменные преобразуются не только в данные формы, но и переменные окружения(включая QUERY_STRING, CONTENT_LENGTH и другие).
Рассмотрим сценарий выводящий IP-адрес пользователя, который его запустил, а также тип его браузера(эти данные храняться в переменных окружения REMOTE_ADDR, HTTP_USER_AGENT
, доступных в скрипте через массив $_SERVER
)
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Трансляция переменных окружения</title>
</head>
<body>
Ваш IP-адрес: <?= $_SERVER['REMOTE_ADDR']?><br>
Ваш браузер:<?= $_SERVER['HTTP_USER_AGENT']?>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Узнать тип браузера можно также, если использовать следующий скрипт:
<?php
$data=getenv("HTTP_USER_AGENT");
if(strpos($data,"MSIE")){
echo " Вы используете IE";
}
else if(strpos($data, "Mozilla")){
echo "Вы используете Мozilla";
}else{
echo"Вы используете малораспространенный браузер";
}
?>
В окне веб-браузера это будет выглядеть ТАК.
Здесь также, для определения типа браузера используется переменная окружения HTTP_USER_AGENT
. Браузер Internet Explorer для своей идентификации использует подстроку MSIE
. Другой популярный браузер Nestcape Navigator использует подстроку Mozilla
. Для получения значения переменных используется функция getenv(имя_переменной)
.
Трансляция cookies
Все cookies
, пришедшие скрипту, попадают в массив $_COOKIES
. Рассмотрим пример, где скрипт считает, сколько раз его запустил текущий пользователь.
<?php
//В начале счетчик равен нулю
$count=0;
//Если в cookies что-то есть, берем счетчик оттуда
if(isset($_COOKIE['count'])) $count=$_COOKIE['count'];
$count++;
//Записываем в cookies новое значение
setcookie("count", $count, 0x7FFFFFFF, "/");
//Выводим счетчик
echo "Данную страницу посетили $count раз";
?>
В окне веб-браузера это будет выглядеть ТАК.
setcookie("count", $count, 0x7FFFFFFF, "/")
— функция установки cookies
, где count
— имя устанавливаемого cookie
, $count
—значение, хранящееся в cookie
с именем count, 0x7FFFFFFF
— директива, определяющая, доступен ли cookie
не по запросу HTPPS. По умолчанию эта директива имеет значение 0, что означает возможность доступа к cookie
по обычному запросу HTTP.
Диагностика
РНР, когда обрабатывает данные пришедшие из формы, создает массивы:
$_GET
— содержит GET-параметры, пришедшие скрипту через переменную окруженияQUERY_STRING
. Например,$_GET['login']
;$_POST
— данные формы пришедшие метордомPOST
;$_COOKIE
— всеcookies
, которые прислал браузер;$_REQUEST
— объединение трех перечисленных выше массивов. Именно эту переменную рекомендуется использовать в скриптах, потому что таким образом мы привязываемся жестко к типу принимаемых данных (GET
илиPOST
);$_SERVER
— содержит переменные окружения, переданные сервером.
Чтобы не запутаться в переменных, рассмотрим полезный прием, помогающий при отладке сценариев. Для вывода всех переменных в браузер воспользуемся скриптом:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Диагностика</title>
</head>
<body>
<!--Выводит все глобальные переменные -->
<pre>
<?php print_r($GLOBALS) ?>
</pre>
</body>
</html>
Глобальные переменные выводятся посредством встроенной функции print_r()
, через массив $GLOBALS
. Страница генерируемая сценарием поможет в дальнейшем в отладке сценариев.
О режиме register_globals
Режим работы register_globals
включает или отключает возможность регистрации EGPCS-переменных
как глобальных переменных и поддерживается РНР по сей день. В подавляющем большинстве случаев он по умолчанию оказывается выключенным в файле php.ini
. Разработчики РНР поступили так по соображениям безопастости: слишком часто скрипты, написанные в расчете на включенный register_globals
, обнаруживали проблемы с защитой.
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться