Inurl post add php username грубый. Учимся работать с GET и POST запросами

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

Метод GET в PHP

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

Страница с примером передачи переменных с помощью Get ссылка

Видите ссылку? Она сложная и состоит из нескольких частей. Давайте разберем все по полочкам:
https://сайт — адрес домена или, как его еще называют, хост.
index.php — страница на php, которая будет обрабатывать запрос.
? — символ разделения между адресом и блоком с переменными.
Далее идут переменные и их значения, которые разделены символом & .
name=Sergey — переменная name и ее значение Sergey.
age=22 — то же самое, переменная age, значение 22.

Все разобрали, теперь посмотрим как это обрабатывается в php, с помощью метода GET.
Страница index.php, как вы помните, мы передавали ей:

Для начала совет: ВСЕГДА проверяйте переменные на правильность: на пустоту, на соответствие допустимых значений и так далее. Так как все передается через адресную строку, то данные можно легко подменить и навредить сайту. Теперь по самому коду: мы, с помощью , проверили переменные name и age на пустоту и, если они не пустые, то вывели их, а если пустые, то просто сообщили об этом.
Все просто, согласитесь? Например вы можете создать html страницу и в менюшке сделать ссылки через переменные, а в index.php обрабатывать переменную и отображать в зависимости от полученного значения ту или иную страницу. Ну об этом мы поговорим позже, в статье про создание сайта на php с нуля. Чтобы ничего не пропустить, советую подписаться на RSS .

Метод POST в PHP

Для демонстрации работы этого метода нам понадобится немного больше, чем простая строчка с адресом:) Нужно будет создать html страницу с формой для заполнения, но ничего, я приведу готовый пример для вас:

Страница с примером передачи переменных с помощью Post

Заполняем поля для передачи информации:

Укажите Ваше имя:

Укажите Ваш возраст:

Итак, мы создали html страничку с простой формой. Запомните, метод POST может использоваться только в форме.
Первый параметр формы — «method», он определяет метод, который мы будем использовать для передачи. Как вы могли догадаться, это либо GET, либо POST. При этом, если установлен GET, то все имена полей (в виде названий переменных), а также их значения, передаются по ссылке, как в разделе про метод GET. Если же установлен POST, то все названия переменных и значения будут передаваться как запрос браузера к веб-серверу. То есть в адресной строке их видно не будет. Во многих случаях это очень полезно. Также POST безопаснее, оно и понятно, ведь переменные с их значениями уже не так просто отредактировать, хотя тоже можно.

Второй параметр формы — «action». Это путь и имя файла скрипта, которому мы передаем данные. В нашем случае это index.php. Этот путь можно передавать и полностью, то есть так: action=«https://my_site.ru/index.php». Если не указать значение параметра «action», то вся информация будет передаваться главному скрипту, то есть индексной странице index.php вашего сайта, что вполне логично.

Теперь получим данные из нашей формы. Раз передавали мы в index.php, значит ниже будет код именно этой страницы:

"; echo "имя - "; echo $_POST["user_name"]; echo "
возраст - "; echo $_POST["age"]; echo " лет"; } else { echo "Переменные не дошли. Проверьте все еще раз."; } ?>

Не забываем проверять на пустоту и допустимые значения. Далее нужно уточнить, почему наши переменные называются именно user_name и age? А вы посмотрите на поля формы, которую мы создавали выше. Видите там input name=«user_name» type=«text» ? Вот здесь параметр name и задает имя переменной, которую мы получим с помощью этого поля. То же самое и с age. Надеюсь понятно. Ну а получение переменной и ее значения через POST почти не отличается от GET, который мы рассмотрели выше.

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

Вы могли заметить, что на большинство сайтов можно лицезреть вот такие адреса:

Http://сайт/index.php?blog=2

Тут, даже не зная php, можно догадаться, что мы обращаемся к файлу index.php Но то, что идет после знака вопроса, мало кто знает. Все довольно просто: ?blog=2 это объявление глобальной переменной «$_GET["blog"]» с значением «2». Таким образом я в скрипт передаю переменную которая отвечает за вывод информации из базы данных. Давайте напишем небольшой скрипт в котором Вы все наглядно увидите:

if(isset($_GET["blog"])) {
echo $_GET["blog"];
}
?>

Мы используем оператор условий if() в качестве условия стоит вот такая строчка:

Isset($_GET["blog"])

isset() позволяет узнать существует ли переменная которая указана в скобках, то есть условие которое я описал в коде звучит так: Если существует переменная $_GET["blog"] то вывести содержимое этой переменной на экран. Вот что получилось:

Думаю понятно Создается глобальная переменная $_GET с идентификатором который мы объявили в адресной строке (в данном случае с идентификатором «blog» )

Теперь хочу пояснить один момент. Предположим нам необходимо объявить две переменные, как это сделать? Первая переменная объявляется после знака вопроса «?» Вторая же переменная объявляется после такого знака «&» (Если честно не знаю что это за знак ), вот пример объявление трех переменных:

Http://сайт/index.php?a=1&b=2&c=3

Вот код вывода:

if(isset($_GET["a"]) AND isset($_GET["b"]) AND isset($_GET["c"])) {
echo $_GET["a"]."
";
echo $_GET["b"]."
";
echo $_GET["c"]."
";
}
?>

Условие звучит так:

Если существует глобальная переменная $_GET["a"] и глобальная переменная $_GET["b"] и глобальная переменная $_GET["с"] то вывести их на экран , вот результат:

Формы

Прежде чем мы перейдем к post запросам, необходимо разобрать, что такое формы? Почему нужно? Потому что глобальная переменная $_POST[""] создается именно через формы. Что такое форма? Это поля для ввода какой-нить информации пользователем. Поля бывают в одну строчку, большие поля, так же бывают радио кнопочки, чек боксы. Разберем все по порядку...

Форма это тег:


элементы формы

У формы есть атрибуты, перечислю самые распространенные:

Давайте создадим форму:


элементы формы

В качестве файла обработчика я поставил файл test.php так как именно в нем пишу для Вас примеры. Метод отправки я поставил post так как именно этим методам пользуются в 99.9% случаях. Так же я присвоил нашей форме имя — form

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

Я уверен, что вы не раз встречали такие поля, так что тут как говорится: «no comments»

Теперь давайте составим небольшую тренировочную анкету, с которой будем работать далее. Наша задача составить небольшую анкетку которая поведает нам имя заполнявшего, пол, из какой он страны, любимый цвет и поле текста где пользователь может добавить что-нить о себе. Вот что у меня получилось:

Ваше Фамилия Имя Отчество:

Ваш пол:
М
Ж

Из какой Вы страны



Любимый(ые) цвет(а):

Черный:
Красный:
Белый:
Другой:

О себе:




Обратите внимание, что почти у каждого тега есть атрибут value , для чего он? В него записываются данные которые Вы собираетесь перенести на другую страницу. Надеюсь понятно

Теперь если запустить этот код в браузере, то мы увидим следующее:

У формы я использовал атрибут action со значением test.php это означает, как я уже говорил, что данные из формы передадутся в файл test.php.

POST запрос

Теперь напишем php код который позволит нам увидеть введенную нами информацию. Где хранятся данные? В случае с get запросом, наши данные лежали в глобальной переменной $_GET[""]. При post запросе, данные будут лежать в глобальной переменной $_POST[""]. В квадратных скобках, необходимо прописывать, как и в случае с глобальной переменной get, идентификатор. Вопрос, где этот идентификатор взять? Вот для чего нам необходим атрибут name у элементов форм! Именно эти имена и служат нам ключом в глобальном массиве post. Ну что ж, приступим к описанию скрипта:

if(isset($_POST["submit"])) {
echo "ФИО: ".$_POST["fio"]."
";
echo "Пол: ".$_POST["sex"]."
";
echo "Страна проживания: ".$_POST["city"]."
";

Echo "Любимый(ые) цвет(а):
";
echo $_POST["color_1"]."
";
echo $_POST["color_2"]."
";
echo $_POST["color_3"]."
";
echo $_POST["color_4"]."
";
echo "О себе: ".$_POST["about"]."


";
}
?>

Написанное нами условие if гласит: Если существует глобальная переменная $_POST["submit"] то выводим данные на экран. Эта глобальная переменная создается в случае если мы нажали на кнопку отправки, вот для чего в данном примере необходим атрибут name в кнопке. Вы вполне можете задаться вопросом, почему же у кнопки атрибут name не обязательный? Все довольно просто. Обычно программист не отслеживает нажатие кнопки, а отслеживает посланные данные. Для корректной работы, например формы контактов, необходимо отследить не нажатие кнопки, а правильность ввода информации, и узнать вводили ли эту информацию вообще. В нашем же примере мы не проверяли посланные данные, а просто отследили нажатие кнопки, для упрощение примера... Вот что у нас получилось:

Заключение

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

P.S.: Хотите что бы компьютерные игры стали еще более реалистичными? directx 11 для windows 7 скачать бесплатно можно на виндоус ин! Наслаждайтесь замечательной графикой!

2 июля 2009 в 16:05

Perl - Отправляем файлы на сервер HTTP запросом

  • Perl

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

Использование LWP::UserAgent

Алгоритм формирования запроса:
  • Создаем запрос (HTTP::Request);
  • Создаем «браузер» (LWP::UserAgent);
  • Определяем для него заголовки;
  • Отправляем запрос;
Муторно как XML::LibXML, но зато надежно, итак: Perl код (1) #!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; # Это файл, который будем отправлять my $file = "./files/some_file.bin"; # Это URI по которому будем отсылать запрос my $uri = "http://somedomain.com/form/action/script"; # Объект запроса my $request = HTTP::Request->new("POST", $uri); # Формируем разделитель, так как если мы его не укажем принудительно, то при $ua->request($request) он у нас не войдет в основной заголовок # хотя, можно просто сделать $request->as_string после формирования объекта заголовка, тогда он подставится дефолтный, но не будем рисковать my $boundary = "X"; my @rand = ("a".."z", "A".."Z"); for (0..14) {$boundary .= $rand;} # Формируем заголовок: $request->header("Content-Type" => "multipart/form-data; boundary=".$boundary); $request->header("User-Agent" => "Mozilla Firefox 5.0:-)"); $request->header("Referer" => "http://somedomain.com/form"); $request->protocol("HTTP/1.0"); # Хотя это сделает LWP::UserAgent, но лучше сразу # Формирование обычных, текстовых параметров формы my $field = HTTP::Message->new([ "Content-Disposition" => "form-data; name="fieldname"", "Content-Type" => "text/plain; charset=utf-8", ]); # Заголовок HTTP::Headers подставляем во время создания объекта HTTP::Message $field->add_content_utf8("somevalue"); # Как видно, somevalue должно быть в UTF-8 $request->add_part($field); # ... И так далее, для каждого текстового поля... # Формирование бинарных параметров формы open(my $fh, "<", $file); # А можно сначала сделать заголовок, а потом уже применить к HTTP::Message my $size = (stat $file); my $header = HTTP::Headers->new; $header->header("Content-Disposition" => "form-data; name="file"; filename="somefile.bin"); # Хотя filename можно вычислить и из имени файла $header->header("Content-Type" => "application/octet-stream"); # Или соответсвующий типу файла my $file_content = HTTP::Message->new($header); $file_content->add_content($_) while <$fh>; $request->add_part($file_content); close $fh; # ... И так далее, для каждого файла... my $response = $ua->request($request); if ($response->is_success) { print $response->content } else { die $response->status_line }

Использование Socket

Все бы хорошо, но если у нас для передачи будет большой файл, то закачивать его целиком в память, что бы собрать запрос, не самая лучшая перспектива. Поэтому возможно отправить запрос потоком через сокет: Perl код (2) #!/usr/bin/perl use strict; use warnings; use HTTP::Headers; use HTTP::Message; use HTTP::Request; use HTTP::Response; use IO::Socket::INET; # Это файл, который будем отправлять my $file = "./files/some_file.bin"; # Это URI по которому будем отсылать запрос my $uri = "http://somedomain.com/form/action/script"; # Так как мы будем использовать сокет, то нам нужен домен, порт и путь раздельно my ($domain, $port, $path) = $uri =~ m/^(?:https?\:\/\/)?([^\/\:]+)(?:\:(\d+))?(.+)$/; $port ||= 80; # По умолчанию # Велосипед - это, конечно хорошо, но формировать заголовки и небинарное тело запроса можно спокойно и с помощью готового модуля my $header = HTTP::Headers->new; $header->header("Content-Type" => "multipart/form-data"); my $request = HTTP::Request->new("POST", $uri, $header); # Вместо $path у нас $uri, так быть и должно;-) $request->protocol("HTTP/1.0"); # Странно, что по-умолчанию HTTP::Request протокол не ставит, поэтому выставляем сами # Для небольших объемов данных, например текстовые поля, велосипед тоже будет лишним # (SFCI) Условия те же, что и в предыдущем коде (1) my $field = HTTP::Message->new([ "Content-Disposition" => "form-data; name="fieldname"", "Content-Type" => "text/plain; charset=utf-8", ]); $field->add_content_utf8("somevalue"); # И тут тоже utf8 $request->add_part($field); # ... И так далее, для каждого текстового поля... # Далее наш запрос, но без файлов разделяем на основной заголовок и первую часть контента # Делим регулярным выражением ибо $request->headers->as_string не возвращает первую строку запроса, а именно - команду POST, # а собирать строку самостоятельно, можно конечно, но лень. my ($head, $content) = $request->as_string =~ m/^(.+?)\n\n(.+)$/s; # Контент у нас не закончен, поэтому отрезаем -- $content = substr($content, 0, -4); # а так же boundary $content =~ s/(\-\-[^\n]+)$//s; my $boundary = $1; # Считаем предварительную длинну запроса my $length = length $content; # Теперь наши файлы: my $files = ; my $size = (stat $file); my $f_header = HTTP::Headers->new; $f_header->header("Content-Disposition" => "form-data; name="file"; filename="somefile.bin"); $f_header->header("Content-Type" => "application/octet-stream"); $f_header = $boundary."\n".$f_header->as_string."\n"; # Прибаляем к длинне запроса $length += length $f_header; $length += $size; # Собственно, процедура ниже только лишь для случаев, когда фалов много. # Тогда, нам сначала нужно посчитать длинну контента, ибо она (длинна) будет указываться в основном заголовке push @{$files}, {header => $f_header, file => $file}; # ... И так далее, для каждого файла... # Итак у нас все готово $length += length $boundary."--"; # Концевую строку тоже считаем # Открываем сокет my $socket = IO::Socket::INET->new($domain.":".$port) || die $!; # К основному заголовку длинну $head .= "\nContent-Length: ".$length; # Отправляем в сокет заголовок и первую (текстовую) часть контента print $socket $head; print $socket "\n\n"; print $socket $content; foreach my $file (@{$files}) { print $socket $file->{header}; open(my $fh, "<", $file->{file}); print $socket $_ while <$fh>; print $socket "\n"; close $fh; } # Отсылаем сокету конец файла print $socket $boundary."--"; # Отсылаем сокету конец файла shutdown($socket, 1); # Получаем из сокета ответ и разбираем его my $response = HTTP::Response->parse(join ("", <$socket>)); if ($response->is_success) { print $response->content } else { die $response->status_line } Well done (SFCI) Хочу заметить, всё что выделено в коде курсивом, должно быть заменено соответсвующими значениями условия задачи.Примечание: SFCI - Special for copipaster"s idiots. Без комментариев.