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