Решил сделать себе шпаргалку об основных методах отправки и получения данных с веб сервера средствами php и js. Так и родилась эта заметка. В ней я рассмотрел наиболее часто используемые приёмы обмена данными между веб клиентом и веб сервером, которые используют php разработчики.
Главными фаворитами отправки данных являются php get запрос и php запрос post, за ними идёт технология AJAX. Так в чём же отличия get и post запросов.
Что бы сделать php get запрос нам для начала следует создать html форму с полем для ввода данных. В теге form указываем к какому файлу на сервере обращаться и каким методом производить отправку . Так же не забываем задавать полю атрибут name , это будет название ячейки массива GET $_GET["data"]; из которого мы получим данные в файл на сервере. Как отправлять данные get через форму я думаю ясно, теперь попробуем передать их через адресную строку. index.php?data=1 если мы вобьём такой запрос в адресную строку и отправим, то в файле в index.php мы получим из $_GET["data"] значение 1. С этим я думаю то же всё понятно, теперь пример.
Задача: есть файл index.php с формой отправки get запроса к другому файлу например get.php. При получении гет запроса файл get.php должен передать массив с данными в index.php. В index.php полученный массив должен вывестись.
Реализация. Файл index.php
//В форме методом get через скрытое поле посылаем значение 1 Отправить запрос
Файл get.php
Php запрос post
Php запрос post передаётся так же через форму, только атрибут в теге form будет method="post" . И получать данные в указанном файле мы будем из массива пост $_POST["search"] и сразу приведём пример.
Задача: отправить данные из index.php методом POST на сервер в файл get.php и получить их обратно, если поле отправки данных пустое вывести сообщении о незаполненном поле. Решение начнём с index.php
Заполните поле запроса
Введённый запрос:
Отправить запросФайл get.php
Передача массива AJAX
Выполним ту же самую задачу с помощью ajax. Вообще то ajax это технология относящаяся к javascript, но в рамках заметки о передаче данных на сервер затронем и эту технологию. Конечно ajax это тема отдельной статьи. В процессе запроса ещё будем выводить гифку индикатора загрузки. Так же имеем два файла index.php и get.php. Файл index.php. Не забываем подключать jquery. Обращу внимание, для скрытия гифки при первой загрузке страницы назначаем блоку box стиль display: none
$(document).ready(function(){ //вешаем событие на кнопку отправить $(".submit").click(function(){ $.ajax({ //как будем передавать данные type: "GET", //куда передаём url: "get.php", //какие данные передаём data: {flag: 1}, //событие перед отправкой ajax beforeSend: function(){ //выводим гифку $(".box").show(); }, //событие после получения ответа, //получаем массив в data success: function(data){ //скрываем гифку $(".box").hide(); var html = ""; //ф-я JSON.parse переводит json данные в объект var dt=JSON.parse(data); for (var i = 0; i
Файл get.php. В файл получаем данные из гет массива и из php передаём массив в javascript. Что бы передать php массив в js, его нужно привести к формату json. Для этого используем php ф-ю json_encode. После перекодировки производится отправка json php средствами, а конкретно вызываем echo.
Первый метод для выполнения PHP POST запроса заключается в использовании file_get_contents . Второй метод будет использовать fread в сочетании с парой других функций. Оба варианта применяют функцию stream_context_create , чтобы заполнить необходимые поля заголовка запроса.
Пояснение кодаПеременная $sPD содержит данные, которые нужно передать. Она должна иметь формат строки HTTP-запроса , поэтому некоторые специальные символы должны быть закодированы.
И в функции file_get_contents , и в функции fread у нас есть два новых параметра. Первый из них — use_include_path . Так как мы выполняем HTTP- запрос , в обоих примерах он будет иметь значение false . При использовании значения true для считывания локального ресурса функция будет искать файл по адресу include_path .
Второй параметр — context , он заполняется возвращаемым значением stream_context_create , который принимает значение массива $aHTTP .
Использование file_get_contents для выполнения POST-запросовЧтобы в PHP отправить POST запрос с помощью file_get_contents , нужно применить stream_context_create , чтобы вручную заполнить поля заголовка и указать, какая «обертка » будет использоваться — в данном случае HTTP :
$sURL = "http://brugbart.com/Examples/http-post.php"; // URL-адрес POST $sPD = "name=Jacob&bench=150"; // Данные POST $aHTTP = array("http" => // Обертка, которая будет использоваться array("method" => "POST", // Метод запроса // Ниже задаются заголовки запроса "header" => "Content-type: application/x-www-form-urlencoded", "content" => $sPD)); $context = stream_context_create($aHTTP); $contents = file_get_contents($sURL, false, $context); echo $contents;
Использование fread для выполнения POST-запросовДля выполнения POST-запросов можно использовать функцию fread . В следующем примере stream_context_create используется для составления необходимых заголовков HTTP-запроса :
$sURL = "http://brugbart.com/Examples/http-post.php"; // URL-адрес POST $sPD = "name=Jacob&bench=150"; // Данные POST $aHTTP = array("http" => // Обертка, которая будет использоваться array("method" => "POST", // Request Method // Ниже задаются заголовки запроса "header" => "Content-type: application/x-www-form-urlencoded", "content" => $sPD)); $context = stream_context_create($aHTTP); $handle = fopen($sURL, "r", false, $context); $contents = ""; while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); echo $contents;
Выполнение GET-запросов с помощью PHPТеперь мы уделим внимание использованию fread и file_get_contents для загрузки контента из интернета через HTTP и HTTPS . Чтобы использовать методы, описанные в этой статье, необходимо активировать опцию fopen wrappers . Для этого в файле php.ini нужно установить для параметра allow_url_fopen значение On .
Выполнение POST и GET запросов PHP применяется для входа в систему на сайтах, получения содержимого веб-страницы или проверки новых версий приложений. Мы расскажем, как выполнять простые HTTP-запросы .
Использование fread для загрузки или получения файлов через интернетПомните, что считывание веб-страницы ограничивается доступной частью пакета. Так что нужно использовать функцию stream_get_contents (аналогичную file_get_contents ) или цикл while , чтобы считывать содержимое меньшими фрагментами до тех пор, пока не будет достигнут конец файла:
В данном случае обработки POST запроса PHP последний аргумент функции fread равен размеру фрагмента. Он, как правило, не должен быть больше, чем 8192 (8*1024 ).
У меня есть структура URL со строкой запроса и параметром под названием position ,
Http://computerhelpwanted.com/jobs/?occupation=administrator&position=network+administrator
У меня также есть выпадающий список выбора формы с именем выбора формы position ,
Select Occupation Administrator Select Position Network Administrator
Когда пользователь делает выбор, он отправляет значения параметра в атрибут действия с параметром select name = «position» в качестве параметра для использования в строке запроса.
У меня вопрос, как мне получить доступ к значениям выбора формы отдельно от значений строки запроса?
Я использую метод _GET для вызова значения из параметра строки запроса.
$position = isset($_GET["position"]) ? ($_GET["position"]) : "";
Очевидно, это получает значение из структуры URL, а не элемента формы. Или, может быть, это так, не уверен. Но, проверяя его, я, кажется, пришел к выводу, что он получает его по URL, а не по форме.
Как я могу получить доступ к значению выбора формы при сравнении в моем PHP?
Обновить
У меня проблема с каноническим URL-адресом, указанным в заголовке.
так должно быть
единственная разница заключается в - и + в строке запроса.
Не все строки моего запроса имеют +. У некоторых есть -. Но я показываю контент по обоим URL, независимо от того, есть ли у него — или +. В любом случае, оба URL получают одинаковое содержимое страницы.
Но поскольку каноническое создается динамически из URI, а не из значения элемента формы, на обеих страницах контента есть 2 разных канонических символа.
Использование _Get (‘value’) извлекает значение из строки запроса вместо элемента формы. Я знаю это, потому что значение элемента формы имеет пробел между network administrator который получает urlencoded, когда форма представляет как network+administrator , Так что, если я могу сравнить со значением элемента формы, я могу установить правильный канонический.