Передача данных формы в PHP | PC vlog

Передача данных формы в PHP

Передача данных формы в PHP

Привет! Давайте в этом уроке разберем с вами, как сервер принимает данные от пользователя или передача данных в PHP. Чтобы сервер принимал данные, ему их нужно передать. А как мы можем ему передать эти данные? Конечно с помощью веб формы.

Создадим простенькую форму отправки данных:


<form action=”<?=$_SERVER[‘PHP_SELF’]?>” method=”get” >
Как тебя зову:
<input type= “text” name=”name”><br> 
Сколько тебе лет:
<input type= “text” name=”age”><br> 
<input type=”submit” value="Отправить запрос">
</form>

Итак, форму мы создали, теперь давайте разберем из чего она состоит. Начнем с атрибута action. Атрибут action говорит о том, куда отправлять данные. То есть в нем указывается файл скрипт, который будет эти данные обрабатывать, например файл form.php или какой либо другой. Хорошо, а если этот атрибут будет пустым, то тогда что? Тогда данные уйдут на этот же файл, в котором расположена форма. Однако, оставлять пустым этот атрибут не рекомендуется, поэтому в нем надо всегда что-то указать. В PHP есть встроенный массив $_SERVER[‘PHP_SELF’], он как раз и указывает на то, что данные будут отправлены на тот же файл, где находится форма.

Следующий атрибут это method – указывает, каким способом мы будем отправлять данные. В данном случае мы используем метод POST. А если атрибут method будет пустым? Тогда в этом случае, по умолчанию, будет метод GET. А далее у нас идут обычные текстовые поля для ввода данных.

Дальше у нас пользователь вбивает в нашу форму свое имя и свой возраст и готовится отправить нам эти данные. Что делает в это время сервер? Сервер «пробегается» по нашей форме и составляет строку, которая выглядит таким образом: имя поля name и значение, которое туда ввели, например John. С точки зрения сервера это выглядит так: name=John. Если полей много, то они разделяются амперсандом (&amp;). Пробелов там быть не может. Например: name=John&amp;age=35. Теперь, как полностью будет выглядеть строка:

GET [пробел]/ form.php?name=John&age=35

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

Такая строка называется QUERY_STRING. И если вы в адресной строке видите знак вопроса и вот все что идет после него и называется QUERY_STRING.

У метода GET есть три недостатка:

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

Итак, для того, чтобы обойти эти недостатки или просто назовем их неудобства, существует метод POST. Что делает сервер при этом методе? А делает он ровно все тоже самое, только с одним исключением. Он также формирует строку запроса, однако в этой строке он уже пишет — метод POST, потом то, что нашел в атрибуте action и все. Вот так может выглядеть строка запроса при методе POST:

POST[пробел]/action.php

Далее при передаче данных в PHP сервер отправляет заголовки запроса. После этого идет пустая строка. А вот уже после этого идут те самые параметры, которые при методе GET передаются после знака вопроса:

POST[пробел]/action.php

Заголовки, которые отправляет сервер:

Host: www.phpblog.su
Accept: */*
Accept-Language: ru
Referer: http://yandex.ru/yandsearch?text=Rehc
User-Agent: Mozilla 4.0 (compatible; MSIE 6.1…)
Content-Length: 20
name=John&age=35

Далее опять идет пустая строка. Она говорит о том, что все данные переданы, и сервер может их обрабатывать.

Давайте теперь разберемся с тем, как нам, серверным разработчикам, получить эти данные. Вот, например, у нас есть наша строка с данными name=John&age=35. Как бы мы могли ее разобрать? Конечно, мы могли бы использовать функции по разбору строк, отделить одну часть строки от другой в том месте, где находится амперсанд, потом с помощью регулярных выражений выделить те данные, которые нам необходимы и т.д. Однако это не очень удобно и так заморачиваться не стоит. Давайте посмотрим, как мы могли бы это сделать гораздо проще.

У нас есть встроенный массив, называется $_GET[] (если мы передаем данные методом GET, а если мы передаем методом POST, тогда массив называется $_POST[]), куда записываются наши данные, т.е наши имена текстовых полей:

<?php
echo “Тебя зовут: ”.$_GET[‘name’];
echo “Тебе: ”.$_GET[‘age’]." лет";
?>

Это был метод GET.

Для того, чтобы было более понятнее, давайте посмотрим, что будет, если мы передадим данные в PHP методом POST:

<form action=”<?=$_SERVER[‘PHP_SELF’]?>” method=”post” >
Как тебя зовут:
<input type= “text” name=”name”><br> 
Сколько тебе лет:
<input type= “text” name=”age”><br> 
<input type=”submit” value="Отправить запрос">
</form>
<?php
echo “Тебя зовут: ”.$_POST[‘name’];
echo “Тебе: ”.$_POST[‘age’]." лет";
?>

Теперь все наши данные попадают в массив POST, так как в форме мы использовали метод POST. Думаю здесь понятно. Еще раз – в массив GET попадают данные, если мы их посылаем методом GET. В массив POST попадают данные переданные методом POST.

Давайте еще раз разберем, как нам принимать данные от пользователя. Посмотрите на этот код и никогда так не пишите:

<?php
echo “Тебя зовут: ”.$_POST[‘name’];
echo “Тебе: ”.$_POST[‘age’]." лет";
?>

Потому как это не просто дырка для злоумышленника, а целая открытая дверь, хотя нет – это называется двери нет. 90% взломов сайтов происходят именно из-за такого кода. Однако, взломом эту ситуацию назвать нельзя. Взлом – это когда дверь ломают, а здесь ее просто нет. Поэтому, чтобы этого избежать, нужно делать следующее: все данные, которые приходят от пользователей необходимо фильтровать. То, как я использовал массивы GET и POST напрямую, делать не следует. Для начала их надо присвоить переменным.

<?php
$name = $_POST[‘name’];
$age = $_POST[‘age’];
echo “Тебя зовут: ”.$ name;
echo “Тебе: ”.$ age. " лет";
?>

После того как мы присвоили переменным значения массива, дальше нужно отфильтровать полученные данные. Проверок много не бывает. Здесь все зависит от вашей фантазии. Нужно вам прогнать полученные данные через 20 функций, значит прогоняете. Считаете нужным обрезать начальные и концевые пробелы, значит обрезаете. Количество проверок зависит только от вашей фантазии.


Однако, есть некий минимум, который необходимо использовать при фильтрации данных. И вот этот минимум: первая бяка которая нас может поджидать это HTML тэги, которые может прислать нам пользователь. И первая функция, которая нам необходима – это функция strip_tags(). Эта функция удаляет HTML тэги. Следующая нехорошая вещь, которая может нас поджидать – это пробелы. Что я имею ввиду? Например мы хотим получить при регистрации от пользователя логин и пароль. А он взял да и поставил в конце логина и пароля по пробелу (может случайно). То в следующий раз он к нам на сайт не войдет. В следующий раз он будет писать логин и пароль нормально (без пробелов), а у нас этот логин и пароль с пробелом (так мы его получили в первый раз), мы же будем их сверять. В этом случае нам необходимо воспользоваться функцией обрезания пробелов как начальных, так и концевых – это функция trim(). Напоминаю, что у нас в PHP есть аж три функции обрезания пробелов: rtrim() – удаляет только концевые пробелы, ltrim() – удаляет только начальные пробелы и trim() – удаляет как начальные, так и концевые пробелы. Какую из этих трех функций использовать решать вам. Это мы разобрали функции для строковых типов данных.

Теперь давайте разберем функции фильтрации для числовых данных. Вот здесь начинается самое интересное. В данном примере нам вторым параметром приходит возраст. Назревает вопрос – может ли нам пользователь прислать отрицательный возраст? Может! Значит нужно отследить минус. А вместо нуля, например 20, он может написать букву «0»? Может! Тем более, что они там рядом. Вообще, заморачиваться можно долго. Здесь нужно исходить не из того, что может прислать пользователь, а из того, что мы хотим получить. Здесь мы хотим получить число, желательно положительное и целое (без плавающей точки). Первое что мы сделаем, это приведем его к целому числу с помощью приведения типов int (integer). Для того чтобы сделать число положительным, воспользуемся функцией abs().

Давайте посмотрим, как будет выглядеть код фильтрации данных полностью:

<form action=”<?=$_SERVER[‘PHP_SELF’]?>” method=”post” >
Как тебя зовут:
<input type= “text” name=”name”><br> 
Сколько тебе лет:
<input type= “text” name=”age”><br> 
<input type=”submit” value="Отправить запрос">
</form>
<?php
$name = trim(strip_tags($_POST['name']));
$age = abs((int)$_POST['age']);
echo "Тебя зовут: ".$name."<br>";
echo "Ваш возраст: ".$age." лет";
?>

Теперь, исходя из выше сказанного, можно сделать вывод – если пользователь введет что-то не то, что нужно, то это его проблемы.

Далее давайте посмотрим вот на что – при входе на сайт пользователь видит форму для входа и автоматически вставленные заготовки (ваше имя и ваш возраст), куда будут подставляться полученные данные.

Согласитесь это не очень красиво. Если мы посылаем запрос методом POST, мы можем сделать следующую вещь: проверить, был ли отправлен запрос методом POST и если он был отправлен методом POST, тогда уже и отфильтровывать данные (то же самое касается метода GET):

<form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
Как тебя зовут:
<input type="text" name="name"><br> 
Сколько тебе лет:
<input type="text" name="age"><br> 
<input type="submit" value="Отправить запрос">
</form>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
	$name = trim(strip_tags($_POST['name']));
	$age = abs((int)$_POST['age']);
	echo "Тебя зовут: ".$name."<br>";
	echo "Тебе: ".$age." лет";
}
?>

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

Дело в том, что мы сначала отдаем форму пользователю, а потом только проверяем полученные данные. Давайте сделаем наоборот. Сначала мы примем полученные данные до формы, потом сделаем условие – если пользователь ничего не ввел, тогда мы не будем показывать ему его имя и возраст. Ну а поскольку у нас данные уже есть, то мы, для того чтобы эти данные запоминались в полях формы, воспользуемся атрибутом value в текстовых полях:

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
	$name = trim(strip_tags($_POST['name']));
	$age = abs((int)$_POST['age']);
}
?>
<form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
Как тебя зовут:
<input type="text" name="name" value='<?=$name?>'><br> 
Сколько тебе лет:
<input type="text" name="age" value='<?=$age?>'><br> 
<input type="submit" value="Отправить запрос">
</form>
<?php
if($name and $age){
	echo "Тебя зовут: ".$name."<br>";
	echo "Тебе: ".$age." лет";
}
?>

Вот таким не хитрым способом мы можем получить данные от пользователя и оформить более удобно нашу форму отправки данных.


Вам будет это интересно:

Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий