Итак, мы снова продолжаем изучение основ PHP и в этой статье познакомимся со способами передачи переменных в PHP, а именно с методами GET и POST . Каждый из них имеет свои плюсы и минусы, и применяется в соответствующих ситуациях, речь о которых пойдет в данной статье. Мы также рассмотрим примеры кода, которые демонстрируют работу методов POST и GET.
Передача переменных при помощи метода GET
Данный метод передачи переменных применяется в PHP для передачи переменных в файл при помощи адресной строки. То есть переменные передаются сразу через адресную строку браузера. Примером может быть, например, ссылка на статью в WordPress без использования ЧПУ (SEF), которая имеет примерно следующий вид:
Https://сайт/?p=315
То есть в данном случае передается переменная $p со значением 315. Теперь давайте более подробно на примере рассмотрим работу метод GET. Пускай нам нужно передать в файл три переменных $a, $b и $c методом GET и вывести их сумму на экран. Для этого можно использовать следующий код.
$a = $_GET["a"]; $b = $_GET["b"]; $c = $_GET["c"]; $summa = $a + $b + $c; echo "Сумма $a + $b + $c = $summa";
Поскольку все переменные перед передачей будут помещаться в глобальный массив GET (), то мы первым делом присваиваем нашим переменным значения соответствующих элементов массива GET. Делаем это в самом начале во избежание разнообразных ошибок при передаче переменных. Далее для демонстрации работы прописываем произвольную формулу и выводим результат на экран.
Для проверки работы метода GET достаточно просто добавить к ссылке на файл знак вопроса «?» и через амперсанд «&» перечислить переменные с их значениями. Пускай у нас есть файл get.php , который лежит в корне сайта . Для того чтобы передать в файл переменные, достаточно прописать в адресной строке следующее.
Https://сайт/get.php?a=1&b=2&c=3
Как видно с примера, сначала мы добавляем знак вопроса сразу после названия файла. Далее прописываем переменную и через равно указываем ее значение. После этого через амперсанд аналогичным образом перечисляем другие переменные. Теперь при переходе по этой ссылке нам выведется сумма переменных $a, $b и $c.
Данный способ очень простой и не требует создания дополнительных файлов. Все необходимые данные поступают прямо через адресную строку браузера.
Ну а теперь давайте перейдем ко второму способу передачи переменных в PHP – методу POST .
Передача переменных в PHP при помощи метода POST
Данный способ позволяет скрыто передавать переменные с одного файла в другой. Как вы уже поняли, обычно для этих целей используются два файла. В первом находится форма для ввода исходных данных, а во втором исполнительный файл, который принимает переменные. Для демонстрации давайте рассмотрим следующий код.
Код первого файла с формой для отправки данных. Дадим ему название post-1.php
- action – указываем файл, в который будут передаваться переменные.
- method – метод передачи переменных. В нашем случае это метод POST.
- name – название формы. Одновременно в файл будет передана переменная с таким именем.
Текстовые поля:
- name – имена переменных. В нашем случае это имя и фамилия (переменные name и lastname).
- type – тип поля. В нашем случае это текстовое поле.
- name – имя кнопки и переменной, которая будет передана вместе с другими переменными.
- type – тип кнопки. В нашем случае это кнопка для отправки данных.
- value – текст на кнопке.
Код второго файла, который будет служить приемником переменных. Назовем его post-2.php
$name = $_POST; $lastname = $_POST; echo "Значения переменных, переданных методом POST - $name и $lastname";
Как и с методом GET, мы первым делом присваиваем переменным значения соответствующих элементов глобального массива POST . Далее для наглядности выводим эти переменные на экран при помощи .
Теперь при загрузке первого файла у нас загрузится форма. После введения данных жмем по кнопке «Отправить», в результате чего в новой вкладке у нас откроется страница со вторым файлом, на которой выведутся значения, прописанные в форме на предыдущей странице. То есть второму файлу будут переданы значения переменных с первого файла.
На этом данная статья про передачу переменных в PHP подошла к концу. Если вы не хотите пропустить появления других статей на блоге, рекомендую подписаться на новостную рассылку любым удобным способом в пункте «Подписка» либо воспользоваться формой ниже.
На этом все. Удачи вам и успеха в освоении основ PHP.
Первый метод для выполнения 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.
Web-программирование в большей части представляет собой как раз обработку различных данных, введенных пользователем - т. е., обработку HTML-форм
.
Пожалуй, нет другого такого языка, как PHP, который бы настолько облегчил вам задачу обработки и разбора, т.е. переменных, которые поступили из (из браузера пользователя). Дело в том, что в язык PHP встроены все необходимые возможности, так что вам не придется даже и задумываться над особенностями протокола HTTP и размышлять, как же происходит отправка и прием POST-форм или даже загрузка файлов.Разработчики PHP все предусмотрели.
Здесь мы не будем подробно останавливаться на механизе работы протокола HTTP, который отвечает за доставку данных из браузера на сервер и обратно, этому посвящен специальный раздел PHP и HTTP . Там же глубоко рассмотрены принципы работы с HTML-формами.
Сейчас мы рассмотрим эти механизмы лишь с прикладных позиций, не углубляясь в теорию.
Для того, чтобы принимать данные от пользователей, нам необходимо интерактивное взаимодействие с ними.
А теперь попробуем написать сценарий, который принимает в параметрах имя пользователя и выводит:
"Привет, <имя>!".
Сначала рассмотрим наиболее простой способ передачи имени сценарию - непосредственный набор его в URL после знака ? - например, в формате name=имя . Вот пример:
http://localhost/script.php?name=имя
Наш сценарий должен распознать параметр name . То есть, говоря проще, сценарий (скрипт) должен принять параметр name в виде переменной name , а затем вывести в браузер пользоватея строку "Привет, <имя>!". Сделать это можно таким образом:
Пишем скрипт, принимающий параметр name и выводящий результат в браузер пользователя, а затем сохраняем его под именем script.php :
echo "Привет, $_GET["name"] !";
?>
В нашем примере мы использовали предопределенную переменную $_GET["name"] , чтобы "принять" параметр name . Теперь, передав через GET -запрос параметр name=Саша , мы получим следующий результат:
Привет, Саша!
А теперь попробуем передать параметр name не из строки запроса браузера, а через HTML-форму. Создаем HTML-документ следующего содержания:
Теперь сохраним данный 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-документ с формой, которая эти два параметра будет передавать в наш новый скрипт:
echo "Привет, $_GET["name"] ! Вам $_GET["age"] лет!";
?>
А вот и HTML-документ send.html , с помощью которого мы параметры name и age передадим нашему скрипту:
Теперь наш скрипт принимает два параметра name и age и выводит в браузер результат формата: "Привет, <имя>! Вам <возраст> лет!".
Обратите внимание на адресную строку браузера после передачи параметров сценарию, она будет выглядить примерно следующим образом (без URL-кодирования кириллицы):
http://localhost/script.php?name=Саша&age=23
В зависимости от установок вашего интерпретатора, существует несколько способов доступа к данным из ваших HTML-форм. Вот несколько примеров:
// Доступно, начиная с PHP 4.1.0
Echo $_GET["username"];
echo $_POST["username"];
echo $_REQUEST["username"];
Вы могли заметить, что на большинство сайтов можно лицезреть вот такие адреса:
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»
Теперь давайте составим небольшую тренировочную анкету, с которой будем работать далее. Наша задача составить небольшую анкетку которая поведает нам имя заполнявшего, пол, из какой он страны, любимый цвет и поле текста где пользователь может добавить что-нить о себе. Вот что у меня получилось: