ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Проверка ошибок. Проверка пароля и имени пользователя. Трансляция переменных окружения. Трансляция cookies

Проверка пароля и имени пользователя

Проверка ошибок

Обработка пользовательских данных дает осмысленный результат лишь в том случае, если данные имеют правильную структуру. Проверить достоверность введенных данных невозможно, однако вы можете проверить их целостность (например, убедиться в том, что адрес электронной почты соответствует стандартному шаблону). Хотя для проверки данных часто применяется технология 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, обнаруживали проблемы с защитой.