Четверг, 16.05.2024, 19:47
DigitalBox
Приветствую Вас Гость | RSS
Главная Получение информации Регистрация Вход
Меню сайта

Получение информации



В атрибуте action дескриптора <form> указывается имя сценария, который будет обрабатывать данные формы: action=" имя_сценария". Например, в листингах из прошлого раздела использовался сценарий action="processform.php". После щелчка на кнопке передачи данных введенная информация передается сценарию, указанному в атрибуте action.

Как говорилось ранее, переданные сценарию данные можно извлечь из встроенных массивов РНР. Если при передаче использовался метод POST, то данные будут размещены в массиве $_POST, а если метод GET — в массиве $_GET. Независимо от выбранного метода передачи данные можно получить также из массива $_REQUEST. При этом в качестве ключей этих массивов используются имена полей формы, а значениями являются пользовательские данные.

Рассмотрим пример, в котором информация передается с использованием метода POST, а в форме содержится следующее поле:

echo "<input type='text' name='firstName'>";

Поскольку именем поля является firstName, то для получения введенного значения можно воспользоваться выражением $_POST[ 'firstName']. Точно так же можно получить данные, которые были введены в форме с использованием раскрывающегося списка или переключателя. Если в форме содержатся флажки, пользователь может одновременно выбрать несколько значений. Поэтому соответствующий элемент массива $_POST тоже будет массивом (т.е. $_POST будет многомерным). Например, если перед обедом было выбрано оба возможных варианта, цыпленок и рыба (см. предыдущий раздел), то в сценарии РНР эти значения можно получить следующим образом:

$_POST['dinner'][0] = цыпленок
$_POST['dinner'][1] = рыба

Ниже приведены форма и сценарий, который позволяет отобразить значения всех полей данной формы.

‹?рhр
/* Script name:     displayFormFields
  * Description:      Сценарий, который выводит информацию,
  *                           введенную в полях формы.
  */
echo "<html>
          <head><title>Aдpec пoкyпaтeля</title></head>
          <body>";
foreach ($_POST as $field => $value)
{
     echo "$field = $value<br>";
}
?›
</body></html>


POST против GET

Для передачи данных формы можно использовать два метода: POST и GET. Каждый из этих методов имеет как преимущества, так и недостатки, а, кроме того, информация при использовании каждого из них передается по-разному.

  • Метод GET. При использовании этого метода данные формы передаются путем их добавления к URL-адресу вызываемого сценария, предназначенного для обработки информации, например processform.php?lname=Smith&fname=Goliath. Преимуществами этого метода являются его простота и скорость. Недостатки метода GET связаны с возможностью передачи лишь ограниченного количества данных, а также с отображением информации в браузере, что с точки зрения безопасности является весьма нежелательным.
  • Метод POST. При использовании метода POST данные формы передаются в области даннных передаваемых пакетов. Основные преимущества этого метода заключаются в возможности передачи неограниченного количества данных и их большей защищенности. К недостаткам следует отнести небольшую скорость и необходимость затраты дополнительных усилий разработчиков.

В CGI-программах, отличных от сценариев РНР, полученные из браузера данные необходимо преобразовать и разместить в переменных. В этом случае гораздо проще воспользоваться методом GET. Именно поэтому большинство разработчиков его и применяют. Однако в языке РНР все требуемые действия выполняются автоматически. В языке РНР одинаково просто применять оба метода, и GET и POST. Поэтому с учетом преимуществ метода POST (неограниченное количество данных и большая безопасность) в языке РНР лучше использовать именно его.


Проверка данных

Перед тем как использовать введенную информацию в сценарии, ее необходимо проверить и удостовериться в том, что получены именно те данные, которые ожидались. Например, пользователь может оставить незаполненным обязательное поле, ошибиться при вводе, так что данные не будут иметь никакого смысла, или ввести информацию, которая может нанести ущерб Web-узлу. Поэтому никогда не стоит доверять информации, введенной пользователями в форме. Ее всегда необходимо проверять.


Контроль данных

Обычно проверка данных (validating information), введенных в форме, связана с проверкой на наличие незаполненных полей и на соответствие введенных данных заданному формату.

  • Проверка пустых полей. Можно потребовать, чтобы некоторую информацию пользователь ввел обязательно, например свое имя и адрес электронной почты. Если соответствующее поле формы оказалось все же незаполненным, то форму можно отобразить повторно и сообщить пользователю о том, что в обязательное поле не было введено никакой информации.
  • Проверка на соответствие заданному формату. Обычно пользователь должен ввести данные, которые бы соответствовали определенному формату. Например, почтовый индекс всегда должен содержать пять цифр. Поэтому, если полученные данные не удовлетворяют заданному формату, пользователю необходимо указать на допущенные ошибки и сообщить о том, что их нужно ввести повторно. Например, строку аЬЗ&*хх вряд ли можно использовать в качестве почтового индекса.

Для того чтобы проверить, было ли заполнено определенное поле, можно воспользоваться функцией empty() со следующим синтаксисом:

empty($_POST[имя_поля]);

Например, в сценарий можно добавить следующий код:

if(empty($_POST['имя_поля']))
{
     echo "Поле не заполнено";
     // повторное отображение формы
}

Проверка введенной информации поможет определить ее соответствие нужному формату. Например, если в качестве почтового индекса (zip) пользователь введет строку 8899776, это будет явной ошибкой. Она слишком длинна для индекса (содержит больше пяти знаков) и слишком коротка для формата zip+4 знака (т.е. девять знаков).

Проверка формата данных формы поможет также предотвратить ввод нежелательной информации, которая может нанести ущерб Web-узлу или базе данных, или кражу информации у других посетителей. Например, очень нежелательно разрешать ввод дескрипторов HTML, поскольку это может привести к непредсказуемым результатам при их передаче браузеру других пользователей. (Особенно опасным является дескриптор <script>.)

Проверка данных, введенных в каждом поле формы, поможет избежать многих проблем. Однако ее следует выполнять с умом. Необходимо стремиться к выявлению как можно большего количества некорректной информации, однако при этом нужно обеспечить и возможность прохождения легитимных данных. Например, при проверке правильности телефонного номера следует контролировать длину введенного числового значения. Тут может возникать проблема, связанная с тем, что такие номера, как 555-5555 и (888) 555-5555, также являются допустимыми. Поэтому длину телефонного номера придется увеличить до 14 символов и разрешить ввод дефисов, скобок и пробелов. Как видите, не все так просто, как казалось на первый взгляд. Одним словом, можно дать один следующий совет: хорошенько подумайте о том, какую информацию вы намерены разрешить вводить пользователям.


Использование регулярных выражений для проверки пользовательской информации

Для проверки введенной в полях формы информации можно воспользоваться регулярными выражениями, которые уже рассматривались ранее. В этом случае полученные данные проверяются на соответствие заданному шаблону. Если данные шаблону не соответствуют, значит, пользователь ввел некорректную информацию и ему придется ввести ее еще раз.

Например, нужно проверить корректность ввода пользователем в поле формы своей фамилии. При этом вполне логично предположить, что имя может содержать буквы (но не числа), а также символ апострофа (О'Хара), дефис (Смит-Джонс) и пробел (Ван Дайк). Кроме того, достаточно трудно представить себе фамилию, состоящую более чем из 50 символов. Поэтому для проверки введенной строки можно воспользоваться следующим кодом:

$last_name = trim($_POST['last_name']);
if (!ereg("[А-Яа-яА-Za-z' -]{1,50}", $last_name))
{
     сообщение о необходимости повторного ввода фамилии
}

В приведенном фрагменте для удаления ненужных пробелов в начале и в конце строки используется функция trim(). Затем для проверки соответствия введенной строки заданному шаблону (регулярному выражению) используется оператор if. Обратите внимание на операцию ! в условии этого оператора: если введенная строка не соответствует шаблону, то выполняется последовательность команд в фигурных скобках.

Если в список допустимых символов регулярного выражения, ограниченный квадратными скобками ([ ]), необходимо добавить дефис (-), его следует разместить либо в начале, либо в конце этого списка. В противном случае (т.е. при размещении между двумя символами) дефис будет интерпретироваться как специальный символ, который используется для задания диапазона.


Использование РНР для создания, отображения формы и проверки ее полей

Сценарий из листинга ниже, позволяет проверить данные, которые были введены в полях формы. При его первом вызове отображается форма с пустыми полями. После заполнения полей формы и щелчка на кнопке Отправить данные введенные данные передаются этому же сценарию, который выполняет проверку на наличие пустых и неправильно заполненныx полей. Если в процессе проверки были обнаружены ошибки, то отобразится соответствующее сообщение и форма выведется повторно. Если все данные были введены правильно, отобразится имя пользователя и его адрес.

В сценарии подключаются два дополнительных файла. Один из них предназначен для создания массива, который будет использоваться для построения формы (листинг А). Второй файл обеспечивает ее отображение (листинг Б).

‹?php
/* Имя файла:      validateForm
  * Описание:         Отображает форму и проверяет
  *                              введенную информацию.
  */
include("info.inc");                                                                                 #6
##################
## Вывод пустой формы ##
##################
if(!isset($_POST['Submit']))                                                                  #10

     include("addressForm.inc");
}
#############################################
## Проверка данных, введенных в форме. Создается      ##
## массив пустых или некорректно заполненных              ##
## полей. Если при заполнении формы были допущены    ##
## ошибки, выводится соответствующее сообщение и       ##
## форма отображается повторно. В противном случае    ##
## отображается введенная информация.                          ##
#############################################
else                                                                                                         #21

{
     foreach($_POST as $field=>$value)                                                 #23
     { 
          if(empty($_POST[$field]))                                                           #25
          {
               if($field != "midName")
               {
                    $blanks[$field] = "blank";                                                  #29
               }
          }
          else                                                                                                #33
          {
               $value = trim($value);
               if($field != "zipcode")
               {
                    if (!ereg("^[А-Яа-яА-Zа-z0-9' .-] {1,65}$", $value) )
                    {
                         $formats[$field] = "bad";
                    }
               }
               elseif($field == "zipcode")
               {
                     if(!ereg("^[0-9]{5}(\-[0-9]{4})?", $value))
                     {
                          $formats[$field] = "bad";
                     }
                }
           }
     }                                                                                                          #51
### если хотя бы в одном поле допущена ошибка,      ###
### выводится соответствующее сообщение и форма ###
### отображается заново                                               ###
     if (@sizeof($blanks) > 0 or @sizeof($formats) > 0)                         #54
     {
          if (@sizeof($blanks) > 0)
          {
               echo "<b>Вы не заполнили одно или несколько
                           обязательных полей. Необходимо
                           заполнить следующие поля: </b><br>"
               foreach($blanks as $field => $value)
               {
                     echo "&nbsp;&nbsp;&nbsp;{$labels[$field]}<br>";
               }
          }
          if (@sizeof($formats) > 0)
          {
                echo "<b>B одном или нескольких полях содержатся
                                    некорректные данные. Исправьте
                                    информацию в следующих полях:
</b><br>";
               foreach($formats as $field => $value)
               {
                     echo "&nbsp;&nbsp;&nbsp;{$labels[$field]}<br>";
               }
          }
          echo "<hr>";
          include("addressForm.inc");
     }
     else                                                                                                       #78
     {
### если ошибок не обнаружено, отображаются ###
### введенные имя и адрес .                                  ###
          echo "<html><head><title>Имя и адрес
                      </title></head><body>\n" ;
          foreach($_POST as $field=>$value)
          {
               if($field != "Submit")
               {
                    echo "{$labels[$field]} $value<br>\n";
               }
          }
          echo "</bodyx/html>" ;
     }
}
?›

Некоторые строки этого сценария были пронумерованы, чтобы можно бьло сделать акцент на ряде следующих важных моментов:

  • Строка 6. Это выражение подключает файл info.inc, который создает массив $labels, который в сценарии будет использоваться позже. Исходный код включаемого файла приведен в листинге А.
  • Строка 10. Оператор if проверяет, существует ли в массиве $_POST элемент с индексом Submit. Дело в том, что кнопка, после щелчка на которой данные полей формы передаются серверному сценарию, имеет имя Submit. Поэтому после щелчка на этой кнопке в массив $_POST будет помещено соответствующее значение. Именно этот факт и проверяется в условии оператора if. Если условное выражение оказалось истинным (т.е. элемента Submit не существует), выполняется блок, в котором подключается файл addressForm.inc (см. листинг В), предназначенный для вывода формы. Блок оператора if выполняется при первом вызове основного сценария, что приводит к отображению формы с пустыми полями.
  • Строка 21. С этой строки начинается выполнение else-блока (т.е. если в массиве $_POST имеется элемент Submit). В этом блоке введенные данные проверяются на корректность.
  • Строка 23. В этой строке с помощью цикла foreach выполняется проход по всем элементам массива $_POST.
  • Строка 25. В этой строке с использованием оператора if каждое поле проверяется на пустоту. Если поле оказалось заполненным, управление передается в строку 33, с которой начинается проверка формата введенных данных.
  • Строка 29. В этой строке в массив $blanks добавляются элементы, соответствующие незаполненным полям (кроме поля Второе Имя, которое является необязательным и, следовательно, может оставаться пустым).
  • Строка 33. В этой строке начинается блок else, в котором выполняется проверка формата значений, введенных в полях формы. Все поля, кроме почтового индекса, проверяются на наличие запрещенных символов. При этом допустимыми считаются буквы, числа, апостроф, пробел, точка и дефис. Корректность почтового индекса проверяется в отдельном блоке, поскольку он должен в точности соответствовать заданному шаблону. Если оказалось, что в каком-то из полей формы была введена неверная информация, соответствующий элемент добавляется в массив $formats.
  • Строка 51. В этой строке завершается проверка правильности заполнения полей формы. В этот момент в сценарии существуют два массива, $blanks и $ formats, в которых содержится информация о результатах проведенной проверки. Если никаких ошибок обнаружено не было, то массивы $blanks и $formats не создаются.
  • Строка 54. В этой строке с использованием оператора if проверяется, были ли при вводе данных в поля формы допущены какие-либо ошибки. Для этого проверяется, существуют ли массивы $blanks и $formats. Если хотя бы один из этих массивов был создан, выводится сообщение об ошибке и форма отображается повторно.
  • Строка 78. Этот блок else выполняется в том случае, если при вводе данных не было допущено ошибок. В результате его выполнения отобразится вся информация, введенная пользователем в форме.

Обратите внимание, что приведённый выше сценарий является достаточно гибким и позволяет обрабатывать информацию, введенную в любой форме (за исключением проверки данных в строках 33-50). Однако эти строки можно без особых проблем модифицировать. Остальная же часть сценария останется без изменений.

В листинге А приведен исходный код первого файла, включаемого в рассматриваемый сценарий. В этом сценарии создается массив, используемый для отображения формы и сообщений об ошибках.

‹?php
/* Имя файла:    info.inc
  * Описание:      создает массив имен для использования
  *                        в форме.
  */
$labels = array( "firstName"=>"Имя: ",
                            "midName"=>"Второе имя:",
                            "lastName"=>"Фамилия:",
                            "street"=>"Улица: " ,
                            "city"=>"Город:",
                            "state"=>"Штат:",
                            "zipcode"=>"Почтовый индекс:");
?›

В листинге В приведен исходный код сценария, предназначенного для отображения формы.

‹?php
/* Имя файла:    addressForm.inc
  * Описание:       Сценарий для отображения формы.
  */
     echo "<html>
                 <head><title>Aдpec покупателя</title></head>
                 <body>";
     echo "<p align='center'>
                 <form action='validateForm.php' method='POST'>
                 <table width='95%' border='0' cellspacing='0'
                               cellpadding='2'>\n";
     foreach($labels as $field=>$value)
     {
          if(isset($_POST[$field]))                                       #13
          {
               $value = $_POST[$field];
          }
          else
          {
               $value = "";
          }
          echo "<tr><td align= ' right' >{$labels [$field] }</br></td>
                      <td><input type= ' text' name='$field' size='65'
                                              maxlength='65'
                                              value='$value'> </td> </tr>";
     }
     echo "</table>
                 <div align='center'>
                 <p><input type='Submit' name= ' Submit
                                       value= ' Отправить данные ' ></p></div>
                 </form>";
?›
</body></html>

Обратите внимание на блок if-else, который начинается в строке 13. В нем устанавливаются значения, отображаемые в полях формы. При первом отображении формы массив $_POST еще не существует, поэтому переменной $value присваивается пустое значение. В противном случае этой переменной присваивается значение, которое ранее было введено пользователем в соответствующем поле формы. Это значение используется при повторном выводе формы.

Обратите внимание на строку, в которой создается кнопка Submit:

<p><input type= 'Submit' name= 'Submit'
                  value= 'Отправить данные'></p></div>

При передаче данных сценарию значение value будет добавлено в массив $_POST. В форме можно использовать две таких кнопки, с одинаковыми именами, но разными значениями, и выполнять действия в зависимости от того, на какой кнопке щелкнул пользователь. В этом случае пригодится оператор if следующего вида:

if($_POST['Submit'] == "Отправить данные")

На рисунке ниже показана форма, в которой пользователь случайно ввел свое имя во второе поле и указал несуществующий почтовый индекс. При этом на Web-странице выведены два сообщения об ошибке. Первая ошибка связана с оставшимся пустым полем для ввода имени, а вторая свидетельствует о вводе неправильного почтового индекса.


Очистка данных

Тщательной проверки данных зачастую бывает вполне достаточно, чтобы предотвратить ввод нежелательной (опасной) информации. Можно проверить формат введенных данных (например, почтового индекса или телефонного номера) или ограничить список допустимых символов буквами и числами. Однако иногда необходимо предоставить возможность ввода всех символов из числа возможных, включая математические символы или HTML-код. Например, сценарий для доски объявлений должен разрешать пользователям оставлять сообщения любого вида.

Если жестких ограничений на пользовательские данные установить нельзя, злонамеренные взломщики смогут ввести в поля формы опасную информацию. Например, с использованием дескриптора <script> можно передать на сервер исполняемый сценарий. От того, как эта информация будет обработана, зависит, сможет ли злоумышленник запустить свой сценарий или загрузить его на компьютеры других посетителей Web-узла. Для удаления опасной информации в языке РНР предназначены две полезных функции:

  1. strip_tags(). Эта функция позволяет удалить из текста все дескрипторы, хотя можно указать, какие из них следует оставить.
  2. htmlspecialchars(). Эта функция позволяет преобразовать некоторое специальные символы HTML в другой формат. При этом они будут отображаться без учета их специального назначения. Например:
  • < преобразовывается в &lt;
  • > преобразовывается в &gt;
  • & преобразовывается в &аmp.

Удаление из полученной информации всех дескрипторов позволит существенно повысить безопасность. Например, для удаления всех дескрипторов можно воспользоваться выражением:

$last_name = strip_tags($last_name);

При вызове функции strip_tags() интерпретатор РНР выполнит поиск в строке $last_name символа начала дескриптора < и удалит все символы, вплоть до символа > или конца строки. При этом можно указать, какие дескрипторы удалять не следует:

$last_name = strip_tags($last_name, "<b><i>");

В этом случае в строке $last_name будут удалены все дескрипторы, кроме <b> и <i>. Однако в некоторых случаях символы < и > не нужно связывать с дескрипторами, например при их использовании в качестве символов математических операций. Их можно преобразовать в такие символы, которые не будут интерпретироваться как дескрипторы HTML. Для этого необходимо воспользоваться следующей функцией htmlspecialchars():

$message = htmlspecialchars($message);

Теперь нужно разобраться, чем же отличаются друг от друга функции strip_tags() и htmlspecialchars(). Пусть имеется переменная $message, в которой содержится следующее значение:

Используйте дескрипторы ‹?php ?› для размещения операторов РНР.

Для удаления ненужных дескрипторов воспользуемся функцией strip_tags():

$message = strip_tags($message);
echo $message;

В результате получим:

Используйте дескрипторы для размещения операторов РНР.

Однако для достижения этой же цели можно воспользоваться и функцией htmlspecialchars():

$message = htmlspecialchars($message);
echo $message;

В этом случае получим следующий результат:

Используйте дескрипторы &lt;?php ?&gt; для размещения операторов РНР.

Причем в браузере эта строка отобразится следующим образом:

Используйте дескрипторы ‹?php ?› для размещения операторов РНР.

т.е. исходная строка будет отображаться без ошибок. Это связано с тем, что символы < и > не интерпретируются как относящиеся к дескрипторам, и соответственно код РНР не выполняется.

Для удаления ненужной информации можно воспользоваться также функцией trim(). Зачастую в начале или в конце строки пользователи случайно вводят пробелы. Позже такие данные могут быть неправильно обработаны, например при сравнении с заданным шаблоном. Для удаления ненужных пробелов как раз и предназначена функция trim(), которую можно вызвать следующим образом:

$last_name = trim($last_name);

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz