Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Обработка get запроса php

GET-запросы в PHP

Итак, пришло время нам начать взаимодействовать с пользователем.

Как мы говорили ранее, PHP работает на сервере. Отсюда следует вопрос, а как же нам из браузера начать с ним взаимодействовать? Например, заполнить форму логина на сайте и отправить данные на сервер, чтобы наш код с ним что-нибудь сделал.

Именно об этом мы и поговорим в этом уроке.

Итак, давайте удалим все наши файлы в проекте и создадим новый пустой файл с именем index.php. Запишем в него следующий код:

Давайте выполним этот скрипт, открыв в браузере адрес:
http://myproject.loc/index.php

Как мы помним из этого урока, мы отправляем запрос веб-серверу, он понимает, что мы запрашиваем PHP-скрипт, выполняет его с помощью интерпретатора и возвращает нам ответ в виде результата выполнения этого скрипта.

Возникает вопрос: «А как можно передать от пользователя внутрь скрипта какие-либо данные?». Ответов на него у нас сразу несколько, и все мы их рассмотрим в этом уроке.

Метод GET

Когда мы вбиваем адрес скрипта и нажимаем Enter, выполняется GET-запрос по протоколу HTTP. В этом типе запроса к основному адресу мы можем прикрепить дополнительные параметры. Для того чтобы передать их, в конце основного адреса ставится знак вопроса, и мы можем перечислять эти параметры — вот так:
параметр1=значение1.
При этом если нам нужно указать несколько параметров, то мы разделяем их с помощью знака амперсанда:
арг1=знач1&арг2=знач2.

Если сейчас перейти по этой ссылке в браузере, то на сервер передадутся 2 параметра:

  • arg1 со значением 123;
  • arg2 со значением scrrr.

Мы можем очень просто получить к ним доступ из PHP с помощью магической переменной $_GET. Эта переменная является суперглобальной, то есть доступна нам в PHP всегда и в любом месте. Она представляет собой ассоциативный массив, в котором хранятся все переданные в запросе GET-параметры.

Давайте изменим код нашего index.php, чтобы узнать, что именно хранится в этой переменной.

Мы увидим следующее:

Как мы можем видеть, это действительно наши переданные аргументы, представленные в виде ассоциативного массива.

Учимся обрабатывать параметры

Разумеется, мы можем обращаться к этим элементам как к элементам обычного массива. Например, так:

Давайте создадим простую страничку, на которой мы будем выводить переданные с помощью GET-запроса логин и пароль.

Обновим нашу страничку в браузере и увидим результат.

Отлично, мы успешно обработали данные, которые нам пришли от пользователя.

Учимся работать с формами

Давайте теперь вспомним уроки про формы из курса по HTML и сделаем простейшую форму для отправки GET-запроса на страничку.

Давайте запишем в наш index.php следующий код:

И давайте теперь откроем его в браузере: http://myproject.loc/index.php

Как мы видим по исходному коду, форма отправит аргументы login и password с введенными значениями на адрес /login.php.

Давайте введем в поля значения admin и Pa$$w0rd соответственно и нажмем на кнопку «Войти».

Где сервер нам скажет о том, что такой странички не найдено.

Отлично! Так давайте же её создадим! Создаём рядом с нашим index.php файл с именем login.php. И пишем в него следующий код:

Вернёмся на нашу форму и повторно отправим пароль. Теперь мы увидим информацию о том, что мы успешно авторизовались. Это простейший прототип формы авторизации. Разумеется, он сильно упрощён, не всё сразу. А пока – делаем домашнее задание.

Обработка GET запроса

16.12.2016, 18:13

Обработка GET запроса
Как принимать GET запрос от N-ого сервера, который после URL ставит не ? , а знак # , как его.

Обработка get запроса
Здравствуйте. Через URL напрямую в адресную строку я присваиваю переменой «page» определенное.

Обработка запроса
В html немножко понимаю, а php полный ноль. Помогите обработать результата запроса и вывести в.

Обработка запроса js
Подскажите пожалуйста есть например 2 файла допустим с простой авторизацией. По нажатию на кнопку.

16.12.2016, 18:252

Решение

16.12.2016, 19:21 [ТС]316.12.2016, 19:324

У меня Chrome категорически отказывается показывать домен с кавычкой, кидает в гугл.

Имхо, занимаетесь ерундой.

16.12.2016, 19:43516.12.2016, 20:18 [ТС]6 Вообщем вопроса не поняли походу. Я имею в виду, например, siti.ru/index.php?var=1&var2=2
создается массив с 2мя переменными var=1 и var2=2, это не сложно править, но как быть когда
пользователь начинает добавлять всякую чушь сразу после siti.ru/index.php’ или siti.ru/index.phpblabla идет попытка поиска такой страницы, но ее нет и он кидает на 404, мне нужно чтобы переброски не проходило, как это организовать, что нужно сделать?

Комментарий модератора
5.2. Запрещено использовать нецензурные выражения в любом виде, оскорблять других участников форума, умышленно использовать выражения, противоречащие правилам русского языка, в том числе «олбанский» язык.
16.12.2016, 20:267

Поняли и ответили. Вы изменили вопрос.

Вообще описанное поведение более чем нормально. Но можете в обработчик 404-ой впихнуть редирект куда-нибудь. Детектить корректный адрес по некорректному не всегда легко, но редирект например на главную сделать совсем не трудно.

16.12.2016, 20:378

Зачем? Это ведь нормальное поведение.

Или вы имеете ввиду, что юзер переходит на site.ru/blablabla, и его перекидывает на site.ru/404, а должно показывать страницу 404 без редиректа?

16.12.2016, 20:46 [ТС]916.12.2016, 20:5410

Complex138, у вас одна точка входа в приложение? Или куча скриптов типа /article.php, /catalog.php и т.п.?

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

16.12.2016, 20:5511

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

Добавлено через 1 минуту

16.12.2016, 21:08 [ТС]12
16.12.2016, 21:08
16.12.2016, 21:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Обработка $_GET запроса
Всем привет. Подскажите пожалуйста: Есть страница, на ней несколько форм, все отправляются по.

Обработка строки из GET-запроса
Ребята, всем привет 🙂 Аж стыдно создавать тему, но я сижу в ступоре. Передаю GET запросом строку и.

Обработка ajax-запроса
Привет! Как мне правильно обработать ajax запрос? Код формируется на php echo «function.

Обработка POST запроса
Отправляю POST запрос на определённую страницу, и в зависимости от данных, страница выдаёт разный.

Обработка GET-запроса вPHP

Дата добавления: 2015-06-12 ; просмотров: 4939 ; Нарушение авторских прав

Когда мы создавали клиентскую часть нашего проекта на Java, то говорили о понятии GET-запроса. Именно при помощи GET-запроса мы отправляли данные на серверную частьPHP. В таком виде мы отправляли GET-запрос из Java:

Всего передаются десять параметров, значение каждого параметра–это количество поступившего товара. Это значит, что этот GET-запрос мы должны обработать изPHP. ДанныйGET-запрос изJava передавался по адресу http://puh/tovar.php.Вспомним программный кодJava, который мы писали для этих целей:

// Формируем GET-запрос для отправки

String str = «http://puh/tovar.php»+makeGet();

Страницу tovar.php мы уже добавили к нашему проекту, давайте перейдем на нее и запишем теги для написания PHPкода (см. рис. 5.23):

Весь дальнейший программный код на текущем занятии мы будем вводить в файле нашего проектаtovar.php!

Добавим одну строчкуPHP-кода:

Команда echo выводит данные на страницу. Сохраним изменения в проекте,откроем браузер и в адресной строке введем:http://puh/tovar.php.Нажмем клавишу Enterи увидим результат(см. рис. 16):

Все работает нормально,русские буквы отображаются правильно!

Обратите внимание, что на этот раз мы указали не только название сайта puh, но и имя конкретной страницы —http://puh/tovar.php. Для запуска любой страницы, кроме index.php –нужно указывать явно имя страницы!

В дальнейшем, как и обычно, не будем закрывать окно браузера, а будем нажимать клавишу F5 для обновления результата.

Для обработки параметров, переданных через GET-запрос в PHP,существует специальный массив — $_GET.

Вспомним. Название любой переменной, в том числе и массива, в PHPначинается с символа доллара ($)!

Чтобы получить значение параметра GET-запроса по его имени достаточно в квадратных скобках массива указать имя параметра в кавычках: $_GET[«tov1»].

Изменим наш PHP-код на следующий:

Теперь на страницу будет выводиться значение параметра с именем: tov1. Перейдем в браузер и в адресной строке введем: http://puh/tovar.php?tov1=17. Адрес страницы остался тем же, а после адреса добавился GET-запрос с одним параметром под именем tov1.Нажмем клавишуEnter –увидим результат(см. рис. 5.17):

Получилось следующее:код PHP обработал параметр из GET-запроса и его значение вывел на страницу. Таким образом,GET-запрос можно передать странице через ссылку в адресной строке браузера. Это один из способов передачи данных на веб-страницу. Мы уже программировали процесс передачи данных при создании клиентской части на языке Java.Результат и в том, и в другом случае получается одинаковым –страница tovar.php получает данные и может их обработать.

При открытииPHP-страницы, ее программный код, записанный внутри тегов начинает выполняться как обычная программа!

Напомним, что язык программирования PHP имеет такой же синтаксис, как иJava. Однако,между ними имеются определенные отличия.некоторые из них мы рассмотрели на самом первом занятии.

Рассмотрим еще одно отличие –сложение строк (конкатенация) обозначается в PHPсимволомточка(.). В Javaдля этого применяется символплюс(+). Ниже приведены примеры сложения строк в Javaи PHP:

//Сложение строк в PHP

//Сложение строк в Java

String str = «Hello! «+»Java»;

Из клиентской части нам передается GET-запрос. Прежде чем обработать эти данные, необходимо проверить его формат и убедиться, что имеются параметры с названием «tov..» и наличием хотя бы одного значения,отличного от нуля. Когда передаются все нулевые значения –нам не нужно обрабатывать такой запрос!

Удалим нашу проверочную строку:

А вместо нее запишем кодPHP для проверки:

вернет значение true, если массив $_GET содержит данные,т.е. имеются параметры GET-запроса.

Переменной flag изначально присваивается значение falseи меняется на true, если найден хотя бы один параметр в GET-запросе с названием на tov и значением отличным от нуля. В этом случае мы выводим проверочную фразу: «Формат верный».

Цикл for выполняет десять шагов, значения переменной $iизменяется от 1 до 10, т.к. это связано с тем, что наши параметры имеют имена: tov1, tov2, … , tov10.

Переменная $tmpна каждом шаге цикла будет принимать значения: tov1, tov2, … , tov10 в результате сложения строк. Далее значение переменной $tmp будет подставляться в конструкциюif ($_GET[$tmp]). Это равносильно записи: $_GET[«tov1»],…, $_GET[«tov10»]. Конструкция:if ($_GET[$tmp]) вернет значение trueв том случае, если параметр с таким именем действительно имеется в GET-запросе и имеет ненулевое значение.

Если находим хотя бы одно такое значение –меняем значение переменной- flag, и прерываем цикл.

Перейдем в браузер и введем в адресной строке следующее:

http://puh/tovar.php?name=Вася&famil=Петров

Нажмем клавишу Enter –на странице ничего не появилось (см. рис.5.18):

Это означает, что данныйGET-запрос не прошел проверку! И это правильно, потому что данный GET-запрос содержит совершенно другие параметры: name иfamil.

Теперь введем правильный GET-запрос в адресную строку браузера:http://puh/tovar.php?tov1=100&tov2=200.

Нажимаем Enter и видим, что на странице появилось сообщение:Формат верный! Наша проверка работает правильно.

Мы не проверяем количество переданных параметров, так как из клиентской части на Javaмы всегда отправляем именно десять параметров.

Изучая язык программирования Java, мы знакомились с понятием метода класса. ВPHP тоже можно создавать классы, но в отличие от Java, в PHPметод может находиться вне класса, т.е. без класса. Такой метод называется функцией. Принцип работы функции такой же, как и у метода. При вызове функциивыполняется программный код,расположенный внутри фигурных скобокфункции. Записьфункции начинается со служебного словаfunction. Например:

В данном случае имя функции: func.

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

echo «Формат верный!»;

Внимание. Подсветка кода для PHP работает по тем же принципам, как и в Java! Комбинация клавиш вызывает вспомогательное окно подсветки программного кода.

На то место, где был вывод сообщения – вставим вызов функции:

// Если формат GET-запроса оказался верным

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

Функция runMySQL() будетвыполнять запись данных в базу MySQLи возвращать ответ клиентской части на Java в виде остатков товаров, в формате:

Это и есть данные,которые мы получали из Java, а потом выводили в таблицу, в колонку остатков товаров. Вывод сообщения о правильном формате удалим:

Это было временное сообщение на момент проверки.

Обработка GET-запроса в строке URL средствами PHP

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

Вообще говоря, любая строка URL в терминах PCRE 1 может быть нестрого описана вот таким регулярным выражением:

Приведенное выше регулярное выражение описывает GET-параметры как фрагмент строки адреса, начинающийся со знака вопроса и продолжающийся до конца строки или до первой решётки (#), если таковая имеется 2 ; про якоря (anchors) в адресах часто забывают — именно они объявляются с помощью решётки.

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

Получение строки GET-запроса.

Для начала поставим самую простую задачу — получить часть URL, содержащую GET-параметры.

Не стоит забывать, что адрес может вовсе не содержать никакого GET-запроса, и массив совпадений может не иметь второго элемента 3 .

Исключение GET-запроса из URL.

Иногда нужно получить URL без GET-параметров (например, при перенаправлении запросов с помощью mod_rewrite зачастую требуется проводить анализ URL, чтобы сформировать ответ клиенту; нередко для анализа нужна только статическая часть URL, а часть, где передается GET-запрос, не нужна и даже мешает). Эта операция занимает фактически одну строку, но, чтобы не писать каждый раз однотипный код, удобно вынести его в функцию 4 :

Замена содержимого GET-параметров.

Нередко требуется, имея адрес страницы, добавить к нему какой-нибудь GET-запрос. Как правило, это делается простым дописыванием к адресу строки вида ?имя_переменной=значение . Однако не всегда бывает заранее известно, не содержит ли уже адрес какого-нибудь GET-запроса — если вдруг содержит, то простое дописывание приведет к адресу, содержащему два знака вопроса (вида ‘?имя1=значение1?имя2=значение2’ ) и потому некорректному, что приводит к необходимости на этот счет строку адреса специально проверять.

Еще более сложная ситуация возникает в случае, когда в URL уже может находиться нужный к передаче GET-параметр (т.е. с тем же именем) — в этом случае нужно даже не просто корректно дописать адрес, а найти там нужную переменную и переписать её значение. Например, было

Все эти задачи может решить функция sgp ( ) :

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

sgp (
$url ,
array ( ‘page’ , ‘view’ ) ,
array ( 4 , ‘normal’ )
) ; // . view=normal&page=4&mode=1#note_1

sgp (
$url ,
array ( ‘page’ , ‘view’ ) ,
NULL // или просто опустить третий аргумент
) ; // . mode=1#note_1

В примерах для краткости изложения приведены относительные имена. Функция, разумеется, может работать и с абсолютными адресами, подчиняющимися стандарту URI. Код функции достаточно прост:

function sgp ( $url , $varname , $value ) // substitute get parameter
<
if ( is_array ( $varname ) ) <
foreach ( $varname as $i => $n ) <
$v = ( is_array ( $value ) )
? ( isset ( $value [ $i ] ) ? $value [ $i ] : NULL )
: $value ;
$url = sgp ( $url , $n , $v ) ;
>
return $url ;
>

preg_match ( ‘/^([^?]+)( ? .*?)?(#.*)?$/’ , $url , $matches ) ;
$gp = ( isset ( $matches [ 2 ] ) ) ? $matches [ 2 ] : » ; // GET-parameters
if ( ! $gp ) return $url ;

$pattern = «/([?&])$varname=.*?(?=&|#| z )/» ;
if ( preg_match ( $pattern , $gp ) ) <
$substitution = ( $value !== » ) ? » $ <1>$varname=» . preg_quote ( $value ) : » ;
$newgp = preg_replace ( $pattern , $substitution , $gp ) ; // new GET-parameters
$newgp = preg_replace ( ‘/^&/’ , ‘?’ , $newgp ) ;
>
else <
$s = ( $gp ) ? ‘&’ : ‘?’ ;
$newgp = $gp . $s . $varname . ‘=’ . $value ;
>

$anchor = ( isset ( $matches [ 3 ] ) ) ? $matches [ 3 ] : » ;
$newurl = $matches [ 1 ] . $newgp . $anchor ;
return $newurl ;
>

Для начала получаем GET-параметры адреса (код, аналогичный функции ggp ( ) ):

Если GET-параметры отсутствуют — заменять негде, переданный адрес заведомо останется неизменным и его можно сразу вернуть, завершив работу функции:

Далее нужно сконструировать регулярное выражение, описывающее указание в адресе на данную переменную GET-запроса. Это регулярное выражение должно ловить строку вида имя_переменной=значение , которой предшествует знак вопроса или амперсанд, и вслед за которой следует конец строки (самый, наверное, частый случай), амперсанд (если начинается объявление следующей GET-переменной) или же решётка (если адрес содержит якорь):

Далее логика программы такая: если функции передается новое значение переменной, то производится замена старого значения на новое (при этом используется фрагмент строки, захваченный первой подмаской — это будет знак вопроса или амперсанд). Если же новое значение переменной — ни что иное, как пустая строка, то следует совсем исключить упоминание об этой переменной из строки запроса (т.е. получить адрес даже не вида /adress.php?v1=&v2=asdf , а просто /adress.php?v2=asdf ). Такое поведение не является полностью строгим, поскольку может приводить к изменению количества передаваемых параметров GET-запроса, однако, автор считает такой вариант работы наиболее удобным, т.к. при этом происходит также очищение запроса от пустых переменных, которые в большинстве случаев являются просто мусором:

Нужно не забывать и о ситуации, в которой переменная запроса, которую решили убрать, следовала в запросе первой. В таком случае из адреса вида /adress.php?v1=&v2=asdf&v3= 1 получится некорректный адрес: /adress.php&v2=asdf&v3= 1 . В этом адресе первый амперсанд нужно заменить на знак вопроса, а поскольку располагаем мы не только целым адресом, но и отдельно строкой его GET-запроса (в примере — &v2=asdf&v3= 1 ), сделать это особенно легко:

Если оказалось, что URL не содержит упоминания данной переменной, нужно эту переменную в него дописать, причем сделать это корректно: если URL вовсе не содержит GET-запроса (в этом случае переменная $gp будет содержать пустую строку), декларация переменной должна начинаться со знака вопроса, в противном случае — с амперсанда:

Далее окончательно формируем обновленную строку GET-запроса:

Обрабатываем возможное наличие якоря:

И, наконец, конструируем конечный адрес полностью, дописывая статическую часть адреса страницы и якорь, после чего возвращаем полученный результат:

Следует отметить, что эту задачу можно решить и без интенсивного использования регулярных выражений:

function sgp (
$url ,
$varname ,
$value = NULL , // если NULL — убираем переменную совсем
$clean = TRUE // превращать ли ?one=&two=
) < // в ?one&two (так адрес красивее)

// Версия функции «substitue get parameter» без регулярных выражений

if ( is_array ( $varname ) ) <
foreach ( $varname as $i => $n ) <
$v = ( is_array ( $value ) )
? ( isset ( $value [ $i ] ) ? $value [ $i ] : NULL )
: $value ;
$url = sgp ( $url , $n , $v , $clean ) ;
>
return $url ;
>

$urlinfo = parse_url ( $url ) ;

$get = ( isset ( $urlinfo [ ‘query’ ] ) )
? $urlinfo [ ‘query’ ]
: » ;

parse_str ( $get , $vars ) ;

if ( ! is_null ( $value ) ) // одновременно переписываем переменную
$vars [ $varname ] = $value ; // либо добавляем новую
else
unset ( $vars [ $varname ] ) ; // убираем переменную совсем

$new_get = http_build_query ( $vars ) ;

$result_url = ( isset ( $urlinfo [ ‘scheme’ ] ) ? «$urlinfo[scheme]://» : » )
. ( isset ( $urlinfo [ ‘host’ ] ) ? «$urlinfo[host]» : » )
. ( isset ( $urlinfo [ ‘path’ ] ) ? «$urlinfo[path]» : » )
. ( ( $new_get ) ? «?$new_get» : » )
. ( isset ( $urlinfo [ ‘fragment’ ] ) ? «#$urlinfo[fragment]» : » )
;
return $result_url ;
>

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

1. Работа с PCRE-совместимыми регулярными выражениями описана на соответствующей странице руководства по PHP.

2. Более строгое регулярное выражение, описывающее URL, можно найти в стандарте, описывающем URI (и, соответственно, URL как его частный случай), однако, в данном случае работать оно будет аналогично приводимому в данной статье: модификатор ? в первой подмаске делает квантификатор + нежадным, поэтому совпадение с первой подмаской продолжается вплоть до первого знака вопроса, после чего задействуется уже вторая подмаска. По той же причине совпадение со второй подмаской прекращается, как только встречается решётка, в противном случае продолжается до конца строки.

3. С переменным количеством подмасок приходится иметь дело довольно-таки часто. В регулярном выражении /^([^?]+)(?.*?)?(#.*)?$/ гарантировано совпадает только первая подмаска. Вторая же может совсем отсутствовать в случае статического (без GET-запроса) адреса без якоря — именно для описания такого случая и служит код

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

4. Вообще говоря, если положиться на корректность URL (т.е. допустить в т.ч., что знак вопроса встречается в адресе только один раз и решётка, если присутствует, следует за ним, а не перед ним), то можно использовать более простой код:

В принципе, уязвимость такого кода достаточно низкая: GET-параметры он успешно уберет, просто может затронуть находящуюся за решёткой-якорем часть строки, если она будет иметь вид ?что_то #что_то_еще?еще_что_то#и_т_д. . В большинстве случаев эта особенность поведения не имеет никакого значения, однако, о ней лучше знать.

Читать еще:  Константы в php
Ссылка на основную публикацию
Adblock
detector