Kwert-soft.ru

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

Php обработка запроса

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

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

Когда мы создавали клиентскую часть нашего проекта на 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! Комбинация клавиш вызывает вспомогательное окно подсветки программного кода.

Читать еще:  192 168 0 1 login php

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

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

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

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

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

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

Обработка запросов с помощью PHP

Обработка запросов с помощью PHP

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

Внутри PHP-скрипта имеется несколько способов получения доступа к данным, переданным клиентом по протоколу HTTP . До версии PHP 4.1.0 доступ к таким данным осуществлялся по именам переданных переменных (напомним, что данные передаются в виде пар » имя переменной , символ «=», значение переменной»). Таким образом, если, например, было передано first_name=Nina , то внутри скрипта появлялась переменная $first_name со значением Nina . Если требовалось различать, каким методом были переданы данные, то использовались ассоциативные массивы $HTTP_POST_VARS и $HTTP_GET_VARS , ключами которых являлись имена переданных переменных, а значениями – соответственно значения этих переменных. Таким образом, если пара first_name = Nina передана методом GET , то $ HTTP_GET_VARS [«first_name»]=»Nina» .

Использовать в программе имена переданных переменных напрямую небезопасно. Поэтому было решено начиная с PHP 4.1.0 задействовать для обращения к переменным, переданным с помощью HTTP-запросов, специальный массив – $_REQUEST . Этот массив содержит данные, переданные методами POST и GET , а также с помощью HTTP cookies. Это суперглобальный ассоциативный массив , т.е. его значения можно получить в любом месте программы, используя в качестве ключа имя соответствующей переменной (элемента формы).

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

Тогда, если в форму мы ввели имя «Вася», фамилию «Петров» и выбрали среди всех курсов курс по PHP , на экране браузера получим такое сообщение:

После введения массива $_REQUEST массивы $HTTP_POST_VARS и $HTTP_GET_VARS для однородности были переименованы в $_POST и $_GET соответственно, но сами они из обихода не исчезли из соображений совместимости с предыдущими версиями PHP . В отличие от своих предшественников, массивы $_POST и $_GET стали суперглобальными, т.е. доступными напрямую и внутри функций и методов.

Приведем пример использования этих массивов. Допустим, нам нужно обработать форму, содержащую элементы ввода с именами first_name , last_name , kurs (например, форму form.html , приведенную выше). Данные были переданы методом POST , и данные, переданные другими методами, мы обрабатывать не хотим. Это можно сделать следующим образом:

Тогда на экране браузера, если мы ввели имя «Вася», фамилию «Петров» и выбрали среди всех курсов курс по PHP , увидим сообщение, как в предыдущем примере:

Для того, чтобы сохранить возможность обработки скриптов более ранних версий, чем PHP 4.1.0, была введена директива register_globals , разрешающая или запрещающая доступ к переменным непосредственно по их именам. Если в файле настроек PHP параметр register_globals =On , то к переменным, переданным серверу методами GET и POST , можно обращаться просто по их именам (т.е. можно писать $first_name ). Если же register_globals =Off , то нужно писать $ _REQUEST [«first_name»] или $ _POST [«first_name»] , $ _GET [«first_name»] , $ HTTP_POST_VARS [«first_name»] , $ HTTP_GET_VARS [«first_name»] . С точки зрения безопасности эту директиву лучше отключать (т.е. register_globals =Off ). При включенной директиве register_globals перечисленные выше массивы также будут содержать данные, переданные клиентом .

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

Как мы уже говорили, если используется метод GET , то данные передаются добавлением строки запроса в виде пар «имя_переменной= значение к URL -адресу ресурса». Все, что записано в URL после знака вопроса, можно получить с помощью команды

Благодаря этому можно по методу GET передавать данные в каком-нибудь другом виде. Например, указывать только значения нескольких параметров через знак плюс, а в скрипте разбирать строку запроса на части или можно передавать значение всего одного параметра. В этом случае в массиве $_GET появится пустой элемент с ключом, равным этому значению (всей строке запроса ), причем символ » + «, встретившийся в строке запроса , будет заменен на подчеркивание » _ «.

Методом POST данные передаются только с помощью форм, и пользователь ( клиент ) не видит, какие именно данные отправляются серверу . Чтобы их увидеть, хакер должен подменить нашу форму своей. Тогда сервер отправит результаты обработки неправильной формы не туда, куда нужно. Чтобы этого избежать, можно проверять адрес страницы, с которой были посланы данные. Это можно сделать опять же с помощью функции getenv() :

Теперь самое время решить задачу, сформулированную в начале лекции.

Читать еще:  Php письмо с вложением

Пример обработки запроса с помощью PHP

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

Здесь все достаточно просто и понятно. Единственное, что можно отметить, – это способ передачи значений элемента checkbox . Когда мы пишем в имени элемента kurs[] , это значит, что первый отмеченный элемент checkbox будет записан в первый элемент массива kurs , второй отмеченный checkbox – во второй элемент массива и т.д. Можно, конечно, просто дать разные имена элементам checkbox , но это усложнит обработку данных, если курсов будет много.

Скрипт, который все это будет разбирать и обрабатывать, называется 1.php (форма ссылается именно на этот файл, что записано в ее атрибуте action ). По умолчанию используется для передачи метод GET , но мы указали POST . По полученным сведениям от зарегистрировавшегося человека, скрипт генерирует соответствующее сообщение. Если человек выбрал какие-то курсы, то ему выводится сообщение о времени их проведения и о лекторах, которые их читают. Если человек ничего не выбрал, то выводится сообщение о следующем собрании заочной школы программистов (ЗШП).

Заключение

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

Обрабатываем POST-запросы в PHP

Итак, в прошлом уроке мы вспоминали о том, как происходит работа пользователя с сайтом. Их общение происходит в форме запрос-ответ. Пользователь отправляет в запросе какие-то данные, а сервер возвращает какой-либо ответ, в зависимости от этих данных.

В предыдущем уроке мы научились работать с GET-запросами. Как мы помним, при этом способе данные передаются на сервер с помощью параметров в адресной строке. Такое бывает удобно, когда нам нужно поделиться ссылкой в которой эти параметры нужны. Например, у нас спрашивают, где в Москве купить шкаф. И мы скидываем человеку ссылку на поиск в Яндексе:
https://yandex.ru/search/?text=шкаф%20в%20москве%20купить

Он переходит по ней и прекрасно себя чувствует, потому что всё уже введено за него.

Однако, параметры в адресной строке – это не всегда уместно. Например, когда в параметрах содержится какая-то конфиденциальная информация: пароль, пин-код. И любой мимо проходящий человек может её увидеть. Как в такой ситуации быть? Использовать POST-запросы!

Что это такое? Да всё тот же запрос от клиента к серверу, только параметры передаются внутри тела запроса, а не в адресной строке. И увидеть их просто так не получится.

Что за тело запроса? Ну, это просто данные, которые передаются на сервер. При этом они скрыты от лишних глаз.

Чтобы отправить POST-запрос нужно в HTML-форме задать для атрибута method значение POST.

Данные, отправленные с помощью POST-запроса доступны в PHP в суперглобальном массиве $_POST.

Давайте выведем переданные скриптом выше значения login и password. Для этого в файл login.php положим следующий код:

Откройте теперь форму, введите в неё значения и нажмите кнопку «Войти».
Вы увидите введенные вами в форме данные, при этом они будут отсутствовать в адресной строке. Вуаля! Теперь никто не подсмотрит ваш пароль в адресной строке.

Как увидеть тело POST-запроса

Чтобы увидеть данные POST-запроса в браузере, в Google Chrome нужно перейти в режим разработчика. Нажмите клавишу F12, находясь в окне браузера. После этого вы увидите панель разработчика.

Перейдите во вкладку Network, а затем установите галочку напротив пункта Preserve log.

Теперь вернитесь на форму, и снова введите данные, после чего нажмите на кнопку «Войти».

Одновременно с тем, как вы нажмете на кнопку входа, вы увидите в панели разработчика запрос на login.php.

Нажмите на него, и справа откроются детали запроса. По умолчанию открывается исходный код ответа. Здесь можно увидеть то, что было сгенерировано с помощью PHP и отправлено веб-сервером в браузер.

Нас здесь интересует вкладка Headers. Перейдите в неё, и прокрутите содержимое в самый низ. Здесь вы увидите те данные, что браузер отправил на сервер.

Заключение

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

А сейчас — немного нестандартное домашнее задание =)

Если этот урок был вам полезен, расскажите об этом курсе своим знакомым или поделитесь на него ссылкой в социальных сетях.

Php обработка запроса

За выполнение запросов отвечают функции mysqli_query() , mysqli_real_query() и mysqli_multi_query() . Чаще всего применяется функция mysqli_query() , так как она выполняет сразу две задачи: выполняет запрос и буферизует на клиенте результат этого запроса (если он есть). Вызов mysqli_query() идентичен последовательному вызову функций mysqli_real_query() и mysqli_store_result() .

Читать еще:  Задача коммивояжера php

Пример #1 Подключение к MySQL

= new mysqli ( «example.com» , «user» , «password» , «database» );
if ( $mysqli -> connect_errno ) <
echo «Не удалось подключиться к MySQL: (» . $mysqli -> connect_errno . «) » . $mysqli -> connect_error ;
>

if (! $mysqli -> query ( «DROP TABLE IF EXISTS test» ) ||
! $mysqli -> query ( «CREATE TABLE test(id INT)» ) ||
! $mysqli -> query ( «INSERT INTO test(id) VALUES (1)» )) <
echo «Не удалось создать таблицу: (» . $mysqli -> errno . «) » . $mysqli -> error ;
>
?>

Буферизация результатов запроса

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

PHP-приложения могут свободно оперировать данными внутри буферизованных результирующих наборов. Быстрая навигация по строкам наборов обусловлена тем, что наборы полностью располагаются в памяти клиента. Следует помнить, что зачастую обработка результатов на клиенте проще, нежели средствами сервера.

Пример #2 Навигация по строкам буферизованной результирующей таблицы

= new mysqli ( «example.com» , «user» , «password» , «database» );
if ( $mysqli -> connect_errno ) <
echo «Не удалось подключиться к MySQL: (» . $mysqli -> connect_errno . «) » . $mysqli -> connect_error ;
>

if (! $mysqli -> query ( «DROP TABLE IF EXISTS test» ) ||
! $mysqli -> query ( «CREATE TABLE test(id INT)» ) ||
! $mysqli -> query ( «INSERT INTO test(id) VALUES (1), (2), (3)» )) <
echo «Не удалось создать таблицу: (» . $mysqli -> errno . «) » . $mysqli -> error ;
>

$res = $mysqli -> query ( «SELECT id FROM test ORDER BY id ASC» );

echo «Обратный порядок. n» ;
for ( $row_no = $res -> num_rows — 1 ; $row_no >= 0 ; $row_no —) <
$res -> data_seek ( $row_no );
$row = $res -> fetch_assoc ();
echo » > . $row [ ‘id’ ] . «n» ;
>

echo «Исходный порядок строк. n» ;
$res -> data_seek ( 0 );
while ( $row = $res -> fetch_assoc ()) <
echo » > . $row [ ‘id’ ] . «n» ;
>
?>

Результат выполнения данного примера:

Небуферизуемые результирующие наборы

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

Пример #3 Навигация по строкам небуферизованной результирующей таблицы

-> real_query ( «SELECT id FROM test ORDER BY id ASC» );
$res = $mysqli -> use_result ();

echo «Порядок строк в результирующем наборе. n» ;
while ( $row = $res -> fetch_assoc ()) <
echo » > . $row [ ‘id’ ] . «n» ;
>
?>

Типы данных значений в результирующей таблице

Функции mysqli_query() , mysqli_real_query() и mysqli_multi_query() предназначены для выполнения неподготавливаемых запросов. На уровне протокола клиент-серверного взаимодействия MySQL за выполнение запросов отвечают команда COM_QUERY и текстовый протокол. Когда используется текстовый протокол, сервер MySQL перед отправкой клиенту преобразует все данные в результирующем наборе в текстовые строки. Это преобразование выполняется вне зависимости от типа данных SQL-столбца результирующей таблицы. Клиентские библиотеки mysql, в свою очередь, получают все данные, принимая их за строки. На клиенте не проводится никакого обратного преобразования к исходным типам, все данные, полученные приложением остаются PHP строками.

Пример #4 Текстовый протокол по умолчанию возвращает строки

= new mysqli ( «example.com» , «user» , «password» , «database» );
if ( $mysqli -> connect_errno ) <
echo «Не удалось подключиться к MySQL: (» . $mysqli -> connect_errno . «) » . $mysqli -> connect_error ;
>

if (! $mysqli -> query ( «DROP TABLE IF EXISTS test» ) ||
! $mysqli -> query ( «CREATE TABLE test(id INT, label CHAR(1))» ) ||
! $mysqli -> query ( «INSERT INTO test(id, label) VALUES (1, ‘a’)» )) <
echo «Не удалось создать таблицу: (» . $mysqli -> errno . «) » . $mysqli -> error ;
>

$res = $mysqli -> query ( «SELECT > );
$row = $res -> fetch_assoc ();

printf ( » > , $row [ ‘id’ ], gettype ( $row [ ‘id’ ]));
printf ( «label = %s (%s)n» , $row [ ‘label’ ], gettype ( $row [ ‘label’ ]));
?>

Результат выполнения данного примера:

Если используется библиотека mysqlnd, можно включить преобразование целочисленных значений и чисел с плавающей запятой из столбцов таблицы в PHP числа. Делается это заданием настройки подключения MYSQLI_OPT_INT_AND_FLOAT_NATIVE . В таком случае mysqlnd будет проверять метаданные столбцов и преобразовывать SQL-числа этих полей в PHP-числа, если эти значения не выходят за рамки допустимых диапазонов типов данных PHP. То есть, например, SQL INT число попадет в PHP приложение в виде целого (integer).

Пример #5 Получение исходных типов данных в приложении

= mysqli_init ();
$mysqli -> options ( MYSQLI_OPT_INT_AND_FLOAT_NATIVE , 1 );
$mysqli -> real_connect ( «example.com» , «user» , «password» , «database» );

if ( $mysqli -> connect_errno ) <
echo «Не удалось подключиться к MySQL: (» . $mysqli -> connect_errno . «) » . $mysqli -> connect_error ;
>

if (! $mysqli -> query ( «DROP TABLE IF EXISTS test» ) ||
! $mysqli -> query ( «CREATE TABLE test(id INT, label CHAR(1))» ) ||
! $mysqli -> query ( «INSERT INTO test(id, label) VALUES (1, ‘a’)» )) <
echo «Не удалось создать таблицу: (» . $mysqli -> errno . «) » . $mysqli -> error ;
>

$res = $mysqli -> query ( «SELECT > );
$row = $res -> fetch_assoc ();

printf ( » > , $row [ ‘id’ ], gettype ( $row [ ‘id’ ]));
printf ( «label = %s (%s)n» , $row [ ‘label’ ], gettype ( $row [ ‘label’ ]));
?>

Ссылка на основную публикацию
Adblock
detector