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