Учимся работать с GET и POST запросами

 

Здравствуйте дорогой читатель Блога RS! Сегодня мы с Вами будем разбирать get и post запросы. Так же поговорим о формах в html.

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

 

GET запрос

Вы могли заметить, что на большинство сайтов можно лицезреть вот такие адреса:

http://rio-shaman.ru/index.php?blog=2

Тут, даже не зная php, можно догадаться, что мы обращаемся к файлу index.php Но то, что идет после знака вопроса, мало кто знает. Все довольно просто: ?blog=2 это объявление глобальной переменной «$_GET['blog']» с значением «2». Таким образом я в скрипт передаю переменную которая отвечает за вывод информации из базы данных. Давайте напишем небольшой скрипт в котором Вы все наглядно увидите:

<?php
if(isset($_GET['blog'])) {
echo $_GET['blog'];
}
?>

Мы используем оператор условий if() в качестве условия стоит вот такая строчка:

isset($_GET['blog'])

isset() позволяет узнать существует ли переменная которая указана в скобках, то есть условие которое я описал в коде звучит так: Если существует переменная $_GET['blog'] то вывести содержимое этой переменной на экран. Вот что получилось:

Думаю понятно Улыбаюсь Создается глобальная переменная $_GET с идентификатором который мы объявили в адресной строке (в данном случае с идентификатором «blog»)

Теперь хочу пояснить один момент. Предположим нам необходимо объявить две переменные, как это сделать? Первая переменная объявляется после знака вопроса «?» Вторая же переменная объявляется после такого знака «&» (Если честно не знаю что это за знак Улыбаюсь), вот пример объявление трех переменных:

http://rio-shaman.ru/index.php?a=1&b=2&c=3

Вот код вывода:

<?php
if(isset($_GET['a']) AND isset($_GET['b']) AND isset($_GET['c']) ) {
echo $_GET['a']."<br>";
echo $_GET['b']."<br>";
echo $_GET['c']."<br>";
}
?>

Условие звучит так:

Если существует глобальная переменная $_GET['a'] и глобальная переменная $_GET['b'] и глобальная переменная $_GET['с'] то вывести их на экран, вот результат:

Формы

Прежде чем мы перейдем к post запросам, необходимо разобрать, что такое формы? Почему нужно? Потому что глобальная переменная $_POST[''] создается именно через формы. Что такое форма? Это поля для ввода какой-нить информации пользователем. Поля бывают в одну строчку, большие поля, так же бывают радио кнопочки, чек боксы. Разберем все по порядку...

Форма это тег:

<form>
элементы формы
</form>

У формы есть атрибуты, перечислю самые распространенные:

  • name="имя" — Этим атрибутом прописывается имя формы, на мой взгляд не обязательный атрибут, но все же всегда заполняю Улыбаюсь
  • action="Ссылка на файл" — Этим атрибутом определяется файл обработчик, а именно файл куда Вы посылаете данные
  • method="post" — Собственно атрибут который говорит форме, что необходимо отправлять post запросы. Так же Вы через формы можете отправлять и get запросы, выставив свойство get а не post.

Давайте создадим форму:

<form action="test.php" method="post" name="form">
элементы формы
</form>

В качестве файла обработчика я поставил файл test.php так как именно в нем пишу для Вас примеры. Метод отправки я поставил post так как именно этим методам пользуются в 99.9% случаях. Так же я присвоил нашей форме имя — form

Теперь окунемся в мир элементов формы. Первым делом Вы должны понять, что почти все элементы являются тегом <input> отличие лишь в атрибуте type у этих тегов. Давайте я перечислю используемые элементы форм:

Я уверен, что вы не раз встречали такие поля, так что тут как говорится: «no comments» Улыбаюсь

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

<form action="test.php" method="post" name="form">

Ваше Фамилия Имя Отчество: <input name="fio" type="text" value=""><br><br>

Ваш пол:
М<input name="sex" type="radio" value="Мужской">
Ж<input name="sex" type="radio" value="Женский"><br><br>

Из какой Вы страны

<select name="city">
<option value="Россия"> Россия
<option value="Другая страна"> Другая страна
</select><br><br>

Любимый(ые) цвет(а): <br><br>

Черный: <input type="checkbox" name="color_1" value="Черный">
Красный: <input type="checkbox" name="color_2" value="Красный">
Белый: <input type="checkbox" name="color_3" value="Белый">
Другой: <input type="checkbox" name="color_4" value="Другой"><br><br>

О себе:<br><br>
<textarea cols="40" rows="10" name="about"></textarea><br><br>

<input type="submit" name="submit">

</form>
  • Для поля ФИО я использовал одностроковое поле ввода. Атрибут name обязателен для заполнения, почему? Объясню ниже Улыбаюсь
  • Для Выбора пола я использовал радио кнопки, заметьте что атрибут name у них один и тот же... Это сделано для того что бы выбрать можно было лишь один пункт.
  • Страна проживания выводится списком, у списка есть атрибут name у пунктов же (<option>) этого атрибута быть не должно.
  • Любимые цвета выбираются чек боксами. Каждый чек бокс имеет свой атрибут name. Сделано для того чтобы выбрать можно было несколько пунктов.
  • О себе принимает вид большого поля. Заметьте, что я использую атрибуты rows и cols. cols определяет сколько видимых символов может влезть по горизонтали, а rows определяет сколько пользователь увидит строк. С помощью этих атрибутов мы определяем ширину и высоту области.
  • Для кнопки, атрибут name не обязателен, но не для этого примера, в этом примере этот атрибут понадобится. Если в теге кнопки написать атрибут value="" и в ведя в этот атрибут, например слово «отправить анкету» (value="отправить анкету") то надпись на кнопке примет значение атрибута value.

Обратите внимание, что почти у каждого тега есть атрибут value, для чего он? В него записываются данные которые Вы собираетесь перенести на другую страницу. Надеюсь понятно Улыбаюсь

Теперь если запустить этот код в браузере, то мы увидим следующее:

У формы я использовал атрибут action со значением test.php это означает, как я уже говорил, что данные из формы передадутся в файл test.php.

POST запрос

Теперь напишем php код который позволит нам увидеть введенную нами информацию. Где хранятся данные? В случае с get запросом, наши данные лежали в глобальной переменной $_GET['']. При post запросе, данные будут лежать в глобальной переменной $_POST['']. В квадратных скобках, необходимо прописывать, как и в случае с глобальной переменной get, идентификатор. Вопрос, где этот идентификатор взять? Вот для чего нам необходим атрибут name у элементов форм! Именно эти имена и служат нам ключом в глобальном массиве post. Ну что ж, приступим к описанию скрипта:

<?php
if(isset($_POST['submit'])) {
echo "ФИО: ".$_POST['fio']."<br>";
echo "Пол: ".$_POST['sex']."<br>";
echo "Страна проживания: ".$_POST['city']."<br>";

echo "Любимый(ые) цвет(а): <br>";
echo $_POST['color_1']."<br>";
echo $_POST['color_2']."<br>";
echo $_POST['color_3']."<br>";
echo $_POST['color_4']."<br>";
echo "О себе: ".$_POST['about']."<br><br><br>";
}
?>

Написанное нами условие if гласит: Если существует глобальная переменная $_POST['submit'] то выводим данные на экран. Эта глобальная переменная создается в случае если мы нажали на кнопку отправки, вот для чего в данном примере необходим атрибут name в кнопке. Вы вполне можете задаться вопросом, почему же у кнопки атрибут name не обязательный? Все довольно просто. Обычно программист не отслеживает нажатие кнопки, а отслеживает посланные данные. Для корректной работы, например формы контактов, необходимо отследить не нажатие кнопки, а правильность ввода информации, и узнать вводили ли эту информацию вообще. В нашем же примере мы не проверяли посланные данные, а просто отследили нажатие кнопки, для упрощение примера... Вот что у нас получилось:

Результат работы формы

Заключение

Ну что ж, за сегодня мы разобрали два метода передачи данных между скриптами, так же галопам познакомились с формами. Очень надеюсь, что эта информация Вам хоть где то пригодится. Если есть какие вопросы, или мысли, пишите комментарии. Удачи Вам, на сегодня у меня все!

P.S.: Хотите что бы компьютерные игры стали еще более реалистичными? directx 11 для windows 7 скачать бесплатно можно на виндоус ин! Наслаждайтесь замечательной графикой!
 

Комментарии (23)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Вы не подтвердили условия политики конфиденциальности.
Viktor, 06 Декабря 2011 г. 07:36 пишет:
Гость
Очень интересная и полезная информация, беру себе на заметку.
Автору спасибо за хорошую работу. Капчу срочно заменить на
обычную формулу. Пыхтелкин Сталинград.
Дмитрий, 25 Марта 2012 г. 22:39 пишет:
Читатель
Статья отличная! Всё хорошо разъяснено.
Я кстати свои первые адреса страниц делал GET'ами, как на вашем блоге. Потом узнал про .htaccess и переделывал ссылки с GET в /a/b/c/ адреса.
Сейчас же изучаю mvc.
Ольга, 25 Марта 2012 г. 22:49 пишет:
Читатель
а можно дать определение GET и POST запросов коротко, например:
GET - передает данные в БД, POST - .......
Ольга, 25 Марта 2012 г. 23:07 пишет:
Читатель
и еще Вы пишете
isset() позволяет узнать существует ли переменная которая указанная в скобках - isset($_GET['blog'])

но ведь переменные вводим мы сами, как можно сомневаться в ее существовании. Другое дело, не пустая-ли она? Это не придирки на ровном месте, просто длительное время я работала с другой СУБД и писала на другом языке программирования. И если я там определяла переменную, какой смысл проверять существует-ли она
Rio-Shaman, 25 Марта 2012 г. 23:50 пишет:
Автор
GET - Способ передать скрипту переменную через адресную строку (в большинстве случаев именно через адресную строку).
POST - Способ передать переменную скрипту через форму, используется например в форме отправки комментариев, введенная информация в форму передается в виде переменной в скрипт, после чего записывается в базу данных.
Ответ для пользователя: Ольга
Rio-Shaman, 25 Марта 2012 г. 23:56 пишет:
Автор
В Веб программирование не каждая переменная объявляется программистом. В случае POST и GET, переменная создается пользователем через форму или же через адресную строку. Для того что бы не запускать определенные части скрипта необходимо определить, была ли создана пользователем переменная. Определяется создание переменной функцией isset()
Ответ для пользователя: Ольга
Rio-Shaman, 25 Марта 2012 г. 23:58 пишет:
Автор
На этом движке ( на котором сейчас работает блог ) предусмотрен ЧПУ, но включение может отразится как на выдаче поисковиков, так и на купленных ссылках. Поэтому я не рискую его включать, и так норм XD
Ответ для пользователя: Дмитрий
Ольга, 26 Марта 2012 г. 08:46 пишет:
Читатель
Вот что я нашла на http://www.php.ru/manual/function.isset.html

isset — Определяет, была ли установлена переменная значением отличным от NULL

Пример #1 Пример использования isset()
<?php
$var = '';
// Проверка вернет TRUE, поэтому текст будет напечатан.
if (isset($var)) {
echo "Эта переменная определена, поэтому меня и напечатали.";
}

Здесь программист сначала определяет $var = '', а потом проверяет, но не на существование переменной, а на то, что переменная имеет какое-то значение. Или я ничего не понимаю.
Потом, как пользователь может создать переменную? Он может ввести какое-то ЗНАЧЕНИЕ для нее, например через форму. Вот Ваш урл http://rio-shaman.ru/index.php?blog=65.
Конечно, можно 65 поменять на 38 и уйти на другую страницу, но кто так делает? Поясните пожалуйста, как в Вебе пользователь может создать переменную, а не значение для нее ?

Ваше определение POST понятное, GET пока не поняла, еще посмотрю. Но в любом случае спасибо за помощь
Rio-Shaman, 26 Марта 2012 г. 11:45 пишет:
Автор
У пользователя просто не огромный выбор в создание переменной. Он может в адресной строке написать вот так:

http://rio-shaman.ru/index.php?myperemennay=65

Скрипт создаст переменную $_GET['myperemennay'], но вот только пользователь не добьется никакого результата создавая эту переменную. Если же пользователь пишет

http://rio-shaman.ru/index.php?blog=65

То скрипт создаст переменную $_GET['blog']. При наличие этой переменной скрипт определит переменную $blog. А создание $blog повлечет за собой какое нить действие ( в нашем случае выведется полная статья ).

В моем случае isset проверяет именно существование переменной, ибо если пользователь через адресную строку не введет значение, переменная blog создана не будет. А создана ли переменная blog я проверяю через функцию isset
Ответ для пользователя: Ольга
Ольга, 26 Марта 2012 г. 14:09 пишет:
Читатель
у меня слишком мало знаний в РНР, не стану спорить, просто пока не понятно с этими $_GET['blog']. Еще покопаюсь. Спасибо.
Митя, 09 Мая 2013 г. 22:17 пишет:
Гость
Поразительно, Rio-Shaman у тебя явно талант к легкой подаче информации.
Почти все беру на заметку.
я, 24 Октября 2013 г. 21:07 пишет:
Гость
Спасибо тебе, автор, добрый человек.
Кирилл, 07 Марта 2014 г. 20:59 пишет:
Гость
Я кстати свои первые адреса страниц делал GET'ами, как на вашем блоге. Потом узнал про .htaccess и переделывал ссылки с GET в /a/b/c/ адреса.
можно поподробней?
DropS, 19 Апреля 2014 г. 20:17 пишет:
Гость
Именно ! К легкой подачи !!! Я в шоке что вообще нашел такого человека который так доступно все расписал )
Ответ для пользователя: Митя
Секрет, 23 Февраля 2015 г. 12:59 пишет:
Гость
Спасибо. Для новичков это очень ценная информация.
Помогло разобраться в вопросе с переменной post
hhh, 21 Апреля 2016 г. 12:01 пишет:
Гость
что будет с post если добавить в поле тег? <label> Hello </label> или ничего
Алексей, 21 Апреля 2016 г. 16:06 пишет:
Автор

В данном случае выведет на экран слово "Hello" которое будет обрамлено тегом "label". Для того что бы html код перестал быть хтмлом, переменную пост (которая содержит хтмл код) необходимо пропустить через функцию htmlspecialchars(). Тем самым мы получим вот такое значение:

&lt;label&gt; Hello &lt;/label&gt;

Такое значение на экране (в браузере) отобразится вот так:

<label> Hello </label>
Ответ для пользователя: hhh
Сергей.Ш, 13 Февраля 2017 г. 08:24 пишет:
Читатель

Добрый день! Спасибо за понятную , доступную, и очень полезную статью! Стану наверное постоянным читателем Вашего блога. Помогите разобраться в коде. Не работает кнопка. Спасибо.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>шаблон создания чата</title>
    </head>
    <body>
        <?php
            require_once 'login.php';
            $db_server = mysql_connect($db_hostname, $db_username, $db_password);

            mysql_select_db($db_database, $db_server)
                or die("Невозможно выбрать базу данных: " . mysql_error());
        
            if (isset($_POST['delete']) && isset($_POST['id_post'])) {
                $id_post = get_post('id_post');
                $query   = "DELETE FROM posts WHERE id_post='$id_post'";
                
                if (!mysql_query($query, $db_server))
                    echo "Сбой при удалении данных: $query<br />" .
                
                mysql_error() . "<br /><br />";
            }
        
        if(
            isset($_POST['id_post']) &&
            isset($_POST['message']) &&
            isset($_POST['id_author'])&&
            isset($_POST['id_topic'])
        ) {
            $id_post   = get_post('id_post');
            $message   = get_post('message');
            $id_author = get_post('id_author');
            $id_topic  = get_post('id_topic');
            $query     = "INSERT INTO posts VALUES"
                . "('$id_post', '$message', '$id_author' ,'$id_topic')"
            ;
            
            if (!mysql_query($query, $db_server))
                echo "Сбой при вставке данных: $query<br />" .
            
            mysql_error() . "<br /><br />";
        }
        
        echo <<<_END
        <form action="forum.php" method="post">
            <pre>
                Id_post <input type="text" name="id_post" />
                Message <input type="text" name="message" />
                Id_author <input type="text" name="id_author" />
                Id_topic <input type="text" name="id_topic" />
                <input type="submit" value="ДОБАВИТЬ ЗАПИСЬ" /> // кнопка ДОБАВИТЬ ЗАПИСЬ
            </pre>
        </form>
_END;
        $query  = "SELECT * FROM posts";
        $result = mysql_query($query);
        
        if (!$result) die ("Сбой при доступе к базе данных: " . mysql_error());
        
        $rows = mysql_num_rows($result);
        for ($j = 0 ; $j < $rows ; ++$j) {
            $row = mysql_fetch_row($result);
            echo <<<_END
                <pre>
                    Id_post$row[0]
                    Message $row[1]
                    Id_author $row[2]
                    Id_topic $row[3]

                </pre>
                <form action="forum.php" method="post">
                    <input type="hidden" name="delete" value="yes" />
                    <input type="hidden" name="id_post" value="$row[3]" />
                    <input type="submit" value="УДАЛИТЬ ЗАПИСЬ" />
                </form>// кнопка
                // УДАЛИТЬ ЗАПИСЬ
_END;
        }
        
        mysql_close($db_server);
        
        function get_post($var)
        {
            return mysql_real_escape_string($_POST[$var]);
        }
        ?>
    </body>
</html>
Алексей, 13 Февраля 2017 г. 10:05 пишет:
Автор
Доброго времени суток. Запустил данный скрипт у себя. Он вполне рабочий за исключением того, что мне пришлось переписать его с использованием mysqli. Какая у Вас версия php, может проблема как раз в этом?
Ответ для пользователя: Сергей.Ш
Сергей.Ш, 13 Февраля 2017 г. 10:42 пишет:
Читатель
Здравствуйте, Алексей! Спасибо .что ответили. У меня не работает кнопка удаления записи. О ней разговор. Установлен PHP5.Остальные кнопки рабочие.
Ответ для пользователя: Сергей.Ш
Сергей.Ш, 16 Февраля 2017 г. 19:48 пишет:
Читатель
Я нашел ошибку. просто у меня Id_post$row[0] не соответствовало с <input type="hidden" name="id_post" value="$row[3]" /> . Спасибо за участие.
Ответ для пользователя: Сергей.Ш
Игорь , 03 Сентября 2017 г. 12:59 пишет:
Гость
Вторая же переменная объявляется после такого знака «&» (Если честно не знаю что это за знак)
И после этого Вы называете себя программистом ;)?
& - амперсанд.
Алексей, 03 Сентября 2017 г. 13:08 пишет:
Автор
Ну это был 2011 год, я тогда во многом ошибался :)
Ответ для пользователя: Игорь