Немного о компьютере

Получить данные из адресной строки php. Внешние переменные (переменные вне PHP). Передача переменных в PHP при помощи метода POST

Решил сделать себе шпаргалку об основных методах отправки и получения данных с веб сервера средствами php и js. Так и родилась эта заметка. В ней я рассмотрел наиболее часто используемые приёмы обмена данными между веб клиентом и веб сервером, которые используют php разработчики.

Главными фаворитами отправки данных являются php get запрос и php запрос post, за ними идёт технология AJAX. Так в чём же отличия get и post запросов.

  • get запрос передаётся в адресной строке (в http заголовке) и виден пользователю
  • post запрос передаётся в теле документа
  • объём get запроса ограничен (максимум 276 символов)
  • метод get не передаёт файлы
  • метод post передаёт файлы
Php get запрос

Что бы сделать 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 ).

из get (9)

Что такое способ «меньше кода» для получения параметров из строки запроса URL-адреса, которая отформатирована следующим образом?

www.mysite.com/category/subcategory?myqueryhash

Выход должен быть: myqueryhash

Я знаю об этом:

Www.mysite.com/category/subcategory?q=myquery

Answers

Этот код и обозначения не мои. Evan K разрешает многозначное одноименное задание с пользовательской функцией;) берется из:

Вышеприведенный пример выводит:

Привет, Ханнес!

Если вы хотите получить всю строку запроса:

$_SERVER["QUERY_STRING"]

Кроме того, если вы ищете текущее имя файла вместе с строкой запроса, вам просто нужно следующее

Basename($_SERVER["REQUEST_URI"])

Это предоставит вам информацию, как в следующем примере

file.php? arg1 = значение & арг2 = значение

И если вам также нужен полный путь к файлу, начиная с root, например /folder/folder2/file.php?arg1=val&arg2=val, тогда просто удалите функцию basename () и просто используйте наложение

$_SERVER["REQUEST_URI"]

Благодаря @K. Shahzad Это помогает, когда вы хотите переписать строку запроса без каких-либо переписывающих дополнений. Скажем, вы переписываете / test /? X = y в index.php? Q = test & x = y, и вы хотите получить строку запроса.

Function get_query_string(){ $arr = explode("?",$_SERVER["REQUEST_URI"]); if (count($arr) == 2){ return ""; }else{ return "?".end($arr)."
"; } } $query_string = get_query_string();

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

$url = "www.mysite.com/category/subcategory?myqueryhash"; echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"

Вот моя функция для восстановления частей строки запроса REFERRER .

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

Пример: строка запроса Referrer была?foo=1&bar=2&baz=3 вызывающая refererQueryString("foo" , "baz") возвращает foo=1&baz=3" :

Function refererQueryString(/* var args */) { //Return empty string if no referer or no $_GET vars in referer available: if (!isset($_SERVER["HTTP_REFERER"]) || empty($_SERVER["HTTP_REFERER"]) || empty(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_QUERY))) { return ""; } //Get URL query of referer (something like "threadID=7&page=8") $refererQueryString = parse_url(urldecode($_SERVER["HTTP_REFERER"]), PHP_URL_QUERY); //Which values do you want to extract? (You passed their names as variables.) $args = func_get_args(); //Get "" strings out of referer"s URL: $pairs = explode("&",$refererQueryString); //String you will return later: $return = ""; //Analyze retrieved strings and look for the ones of interest: foreach ($pairs as $pair) { $keyVal = explode("=",$pair); $key = &$keyVal; $val = urlencode($keyVal); //If you passed the name as arg, attach current pair to return string: if(in_array($key,$args)) { $return .= "&". $key . "=" .$val; } } //Here are your returned "key=value" pairs glued together with "&": return ltrim($return,"&"); } //If your referer was "page.php?foo=1&bar=2&baz=3" //and you want to header() back to "page.php?foo=1&baz=3" //(no "bar", only foo and baz), then apply: header("Location: page.php?".refererQueryString("foo","baz"));

Служба поддержки Microsoft заявляет: «Максимальная длина URL-адреса составляет 2083 символа в Internet Explorer».

У IE проблемы с URL-адресами дольше. Firefox, похоже, отлично работает с символами> 4k.

У меня есть структура 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 , Так что, если я могу сравнить со значением элемента формы, я могу установить правильный канонический.

Web-программирование в большей части представляет собой как раз обработку различных данных, введенных пользователем - т. е., обработку HTML-форм .
Пожалуй, нет другого такого языка, как PHP, который бы настолько облегчил вам задачу обработки и разбора, т.е. переменных, которые поступили из (из браузера пользователя). Дело в том, что в язык PHP встроены все необходимые возможности, так что вам не придется даже и задумываться над особенностями протокола HTTP и размышлять, как же происходит отправка и прием POST-форм или даже загрузка файлов.Разработчики PHP все предусмотрели.

Здесь мы не будем подробно останавливаться на механизе работы протокола HTTP, который отвечает за доставку данных из браузера на сервер и обратно, этому посвящен специальный раздел PHP и HTTP . Там же глубоко рассмотрены принципы работы с HTML-формами.

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

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

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

"Привет, !".

Сначала рассмотрим наиболее простой способ передачи имени сценарию - непосредственный набор его в URL после знака ? - например, в формате name=имя . Вот пример:

http://localhost/script.php?name=имя

Наш сценарий должен распознать параметр name . То есть, говоря проще, сценарий (скрипт) должен принять параметр name в виде переменной name , а затем вывести в браузер пользоватея строку "Привет, !". Сделать это можно таким образом:

Пишем скрипт, принимающий параметр name и выводящий результат в браузер пользователя, а затем сохраняем его под именем script.php :

В нашем примере мы использовали предопределенную переменную $_GET["name"] , чтобы "принять" параметр name . Теперь, передав через GET -запрос параметр name=Саша , мы получим следующий результат:

Привет, Саша!

А теперь попробуем передать параметр name не из строки запроса браузера, а через HTML-форму. Создаем HTML-документ следующего содержания:


Name:

Теперь сохраним данный HTML-документ на нашем тестовом сервере (localhost) под именем send.html в той же директории, где у нас уже сохранен сценарий script.php .

Теперь запускаем HTML-документ в браузере:

http://localhost/send.html

Вводим имя в поле и нажимаем кнопку "GO!". Форма передаст через GET-запрос параметр name нашему скрипту script.php . Если вы все сделали правильно и ваш web-сервер работает нормально, вы увидете введенное вами в поле формы имя! В адресной строке браузера вы увидете путь и переданный вами параметр name .

Теперь мы должны понять, как мы можем передать множество параметров, для начала хотя-бы два .

Итак, нам нужно, чтобы скрипт выводил следующее:

"Привет, ! Вам лет!".

То есть нам нужно передать в скрипт 2 параметра: name и age .

Теперь мы напишем скрипт script.php , принимающий два параметра: name и age , а также HTML-документ с формой, которая эти два параметра будет передавать в наш новый скрипт:

А вот и HTML-документ send.html , с помощью которого мы параметры name и age передадим нашему скрипту:



Введите имя:

Введите возраст:



Теперь наш скрипт принимает два параметра name и age и выводит в браузер результат формата: "Привет, ! Вам лет!".

Обратите внимание на адресную строку браузера после передачи параметров сценарию, она будет выглядить примерно следующим образом (без URL-кодирования кириллицы):

http://localhost/script.php?name=Саша&age=23

В зависимости от установок вашего интерпретатора, существует несколько способов доступа к данным из ваших HTML-форм. Вот несколько примеров:

Похожие публикации