Получение, проверка и обработка данных на PHP

Данные переданные HTML-формой в PHP будут размещены в массивах $_GET, $_POST, $_REQUEST (подробнее PHP и методы передачи данных GET и POST). Форму будет заполнять пользователь, и не известно, что он может ввести в поля формы. Может пропустить одно или несколько полей, введет некорректные данные, например, нужно будет ввести число, а пользователь введет какой-нибудь текст. К получаемым данным нужно очень осторожно относиться, особенно, если информация сохраняется в базе данных, используется для работы с файловой системой, а так же отображается пользователям сайта (например, пользователь может отправить вредоносный скрипт, написанный на javascript, который в дальнейшем может быть загружен в браузер другого посетителя сайта и нанести вред его компьютеру). Для проверки и обработки данных в PHP есть специальные функции. Ознакомимся с ними.

 

Функция isset($имя_переменной) возвращает true, если переменная объявлена даже без присваивания значения. Пример использования
Код
if (isset($_GET["number"]))
{
//Переменная существует, выполняем нужные действия с ней
...
}
else
{
//Переменная не существует, поэтому выполнять действия с ней нельзя. Можно вывести предупреждение пользователю
echo ("Не указано значение number!");
...
}

 

Функция empty($имя_переменной) возвращает true, если значение переменной равно нулю или пустой строке либо переменная не объявлена. Пример использования функции
Код
if (empty($_POST["code"]))
{
//переменная не объявлена или ее значение равно нулю, сообщим об этом пользователю
echo ("Не указано значение поля Code!");
}
else
{
//переменная существует и ее значение не равно нулю
...
}

После проверки переменной на существование и ее значения можно проверить тип содержащегося в ней значения. Следующие функции проверяют тип переменной, и если переменная соответствует проверяемому типу, то функция возвращает true:
  • is_int($имя_переменной) - проверяет, является ли переменная целым числом (тип integer);
  • is_array($имя_переменной) - проверяет, является ли переменная массивом;
  • is_float($имя_переменной) - проверяет, является ли переменная числом с плавающей точкой;
  • is_null($имя_переменной) - проверяет, равно ли значение переменной нулю;
  • is_numeric($имя_переменной) - проверяет, является ли переменная числовой строкой;
  • is_string($имя_переменной) - проверяет, является ли переменная строкой (текстовой).

Полученные данные при необходимости можно и обработать: либо при сохранении в базе данных, либо при сохранении в файле, либо при выводе в браузер. Обработка заключается в вырезании каких-либо символов, или их замене.
Функция strip_tags() позволяет удалить из текста все дескрипторы (теги), но можно указать какие из них следует оставить. Так для удаления всех тегов нужно записать
Код
$text=strip_tags($text);

Если нужно какие-то теги оставить, то их нужно указать вторым параметром
Код
$text=strip_tags($text,"<a><b>");//оставим в тексте теги A и B.

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

Так же есть возможность указать, как обрабатывать одинарные и двойные кавычки. Для этого надо в качестве второго аргумента указать одну из следующих констант
  • ENT_COMPAT - функция преобразует двойные кавычки, одинарные кавычки не будут преобразованы;
  • ENT_QUOTES - функция преобразует и двойные и одинарные кавычки;
  • ENT_NOQUOTES - функция не будет преобразовывать ни одинарные ни двойные кавычки.

Если в функции htmlspecialchars() не будет указан второй аргумент, то по умолчанию будет использоваться режим ENT_COMPAT.
Например
Код
$text=htmlspecialchars($text);
$text=htmlspecialchars($text,ENT_QUOTES);

Функция addslashes() экранирует строку обратными слэшами. Эту функцию нужно использовать при использовании данных при запросах к базе данных и тому подобных случаях. Эта функция возвращает строку с обратными слэшами перед символами: одинарная кавычка ('), двойная кавычка ("), обратный слэш (). Например
Код
$text=addslashes($text);

Для удаления экранирующих обратных слэшей нужно использовать функцию stripslashes (). Эта функция удалит экранирующие обратные слэши (например, "текст и текст" преобразуется в "текст и текст"), двойные обратные слэши станут одинарными.
Код
$text=stripslashes ($text);

 

Очень часто пользователи в начале или в конце строки случайно вводят пробелы. Эти пробелы практически не нужны, и поэтому их можно удалить. Удалить эти пробелы поможет функция trim(). Например
Код
$text=trim($text);

 


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

 

Код
<html>
<head>
<title>Получение, проверка и обработка данных на PHP</title>
</head>
<body>

<?php

$t="";
$nic="";
$num="";

$error=false;
$on_submit=false;
$pol="";

$pol_m="";
$pol_j="";
$pol_x="";
$mas_pol=array ("m"=>"мужской","j"=>"женский","x"=>"еще не поняло");
$selected=" selected='selected' ";

$coment="";

if (!empty($_POST["onsubmit"]))
{
//форма была отправлена, проверим данные
$on_submit=true;
if (empty($_POST["nic"]))
{
$t.="<div>Вы не указали свое имя или ник!</div>";
$error=true;
}
else
$nic=$_POST["nic"];
if (empty($_POST["number"]))
{
$t.="<div>Вы не указали свой возраст!</div>";
$error=true;
}
else
{
$num=$_POST["number"];
if (!is_numeric($num))
{
$t.="<div>Возраст нужно написать цифрами!</div>";
$error=true;
}

}
if (empty($_POST["pol"]) || $_POST["pol"]=="none")
{
$t.="<div>Укажите свой пол!</div>";
$error=true;
}
else
{
$pol=$_POST["pol"];
switch ($pol)
{
case ("m"):$pol_m=$selected;break;
case ("j"):$pol_j=$selected;break;
case ("x"):$pol_x=$selected;break;
}
}
if (empty($_POST["coment"]))
{
$t.="<div>Вы не написали комментарий!</div>";
$error=true;
}
else
$coment=$_POST["coment"];
}

if ($on_submit && !$error)
{
//если форма была отправлена и ошибок при заполнении нет, то отображаем поученные данные
$t.="Получены следующие данные<br/>Ваше имя: ".htmlspecialchars($nic,ENT_QUOTES);
$t.="<br/>Ваш возраст: ".htmlspecialchars($num,ENT_QUOTES);
$t.="<br/>Ваш пол: ".$mas_pol[$pol];
$t.="<br/>Комментарий: ".htmlspecialchars($coment,ENT_QUOTES);
}
else
{
//если форма не отправлялась или была отправлена, но при заполнении полей были допущены ошибки, то выводим форму
//причем, если форма была отправлена (с некорректным заполнением полей), то выводим ее с теми данными, которые ввел пользователь
$t.="<form action='text.php' method='post'>

Ваше имя или ник<br/>
<input type='text' name='nic' value='".htmlspecialchars($nic,ENT_QUOTES)."'><br/>
Сколько вам лет (цифрами)<br/>
<input type='text' name='number' value='".htmlspecialchars($num,ENT_QUOTES)."'>
<br/>
Ваш пол<br/>
<select name='pol'>
<option value='none'>выберите...</option>
<option value='m' ".$pol_m.">мужской</option>
<option value='j' ".$pol_j.">женский</option>
<option value='x' ".$pol_x.">еще не поняло</option>
</select>
<br/>
Напишите комментарий<br/>
<textarea name='coment'>".htmlspecialchars($coment,ENT_QUOTES)."</textarea>
<br/>
<input type='submit' value='Отправить'>
<input type='hidden' name='onsubmit' value='on'>
</form>
";
}
echo ($t);

?>

</body>
</html>

 

При правильном заполнении формы, данные будут отображены в браузере без HTML-формы. Если же форма будет заполнена некорректно, то будет выведено соответствующее сообщение об ошибке.
Опубликовано 15 июня 2009 г.
Комментарии к публикации
Всего комментариев: 10
прохожий: Гость | 15.02.2010, 21:01 #
Прикольно работает.. главное понятно! особенно прикол с выбором пола понравился)))))
Надо было еще поставить "крашенный"
прохожий: David | 18.02.2010, 22:48 #
otlichnaya statya dolgo v neter iskal
прохожий: Ri | 02.03.2010, 03:52 #
В какую папку записываются данные пользователя с формы text.php ?
Суперадмин: | 10.03.2010, 06:52 #
Данные формы никуда не копируются, а просто выводятся на сайте пользователю. Попробуйте, сами сохранить их в файл! :)
прохожий: Ri | 02.03.2010, 04:31 #
а как добавить капчу в скрипт формы text.php ?
Суперадмин: | 10.03.2010, 06:53 #
Это вопрос отдельной статьи.
прохожий: Евгений | 26.05.2011, 01:26 #
Поясните как организуется выбор пола с учетом массива: $mas_Sex=array ("m"=>"мужской","j"=>"женский","x"=>"не знаю");. Для чего там оператор switch и массив! И еще не понятная одна строчка: $selected=" selected='selected' "; - смысл наверно такой что выбранный пол заносится в переменную селект и принимает свойство выбранное из выподающего списка при обнавлении страницы?
Прошу раздуплить меня плис пояснение как выбор пола организуется??
Суперадмин: | 26.05.2011, 03:13 #
Массив со списком "полов" просто для удобства, чтобы еще раз не делать список условий, при отображении выбранного значения, а вывести $mas_pol[$pol].
По остальному. Форма на странице может содержать очень большое количество полей - текстовые поля, селекты и другие. Пользователь может ошибиться и, к примеру, не заполнить одно поле, а остальные заполнит. И если после отправки формы ему вывести сообщение об ошибке с пустой формой, то он может не захотеть набирать заново все поля и уйдет с этого сайта. Поэтому в этом примере приводиться пример проверки формы и при ошибке поля заполненные пользователем будут с тем содержимым, что он заполнил до отправки. Для этого и нужен switch и переменная $select. Вообще-то вовсе не обязательно использовать переменную $select, можно просто вместо переменной писать " selected='selected' ", но мне так лично удобнее.
прохожий: Евгений | 26.05.2011, 19:33 #
C selected все понятно он нам оставляет выбранные данные в поле пол! А массив полов можно обойти? Можно же когда возоащается значение c формы $pol= значению m или j или x. Можно потом этим значениям присваевать m=Мужской j=женский x=средний в зависимости от возращаемого значения в переменной $pol а потом выводить на экран?? Напишите как можно это сделать и можно ли так вообще?Массивом конечно удобно но хочеться всестаронне подойти к вопросу ))
Суперадмин: | 27.05.2011, 07:07 #
Ну так уберите массив - да и все :). Вы уже и сами написали на половину правильный ответ. Можно определить новую переменную
$name_pol - значение выбранного пола, то есть Мужской, Женский и Оно;
и при проверке в существующем switch присвоить этой переменной нужное значение:
$name_pol = "";
switch ($pol)
{
case ("m"):$pol_m=$selected;$name_pol = "Мужской";break;
case ("j"):$pol_j=$selected;$name_pol = "Женский";break;
case ("x"):$pol_x=$selected;$name_pol = "Оно";break;
}
Вход в аккаунт
Новости сайта