Параметры формы: в строке запроса и во входных данных - разные? - PullRequest
2 голосов
/ 15 января 2012

Есть ли разница, если параметр POST-формы помещается в строку запроса:

<form action="mysite.com/index.php?myparam=myvalue">
    ...more inputs here
</form>

и помещается в качестве скрытого ввода?

<form action="mysite.com/index.php">
    <input type="hidden" value="myvalue">
    ...more inputs here
</form>

I 'Я использую Joomla, но на самом деле это совершенно не связано.Я вижу, что в их уроках есть немного «здесь и там», но имеет ли это значение?Каковы последствия, если я использую один из них?

ПРИМЕЧАНИЕ: Я забыл указать action=post в формах, что полностью изменило вопрос.однако с появлением интересных ответов, которые ответили не только на мой вопрос, я решил оставить их как есть.

Ответы [ 3 ]

4 голосов
/ 15 января 2012

Да, есть разница, технически и концептуально.То, как эта разница влияет на вас, зависит от сервера приложений, который обрабатывает запрос (ну и от ваших предпочтений, конечно).

Техническое различие:

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

Концептуальная разница:

Наиболее логично провести различие между двумя типами параметров запроса:

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

Первые называются идемпотент и должны быть переданы через GET.Хорошим примером будет строка поиска или идентификатор записи.Независимо от того, как часто вы обновляете данные, база данных остается неизменной.

Другой тип параметра - это данные, которые должны храниться в БД.Это было бы разрушительным в том смысле, что фактически изменяет содержимое базы данных.Эти параметры должны быть переданы через POST.

Кстати, это также хороший способ решить, должна ли ваша форма быть method="GET" или method="POST": всякий раз, когда ввод формы идемпотентен в базе данных, используйтеПолучить форму.Например, форма пользовательский поиск должна быть GET, форма пользовательских предпочтений должна быть POST.


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

<form action="mysite.com/index.php?id=1234" method="POST">
    <!-- ...more inputs here -->
</form>

, поскольку GET mysite.com/index.php?id=1234 будет запрашивать именно эту запись.

Однако делать это не нужно - конечно, вы можете опубликовать идентификатор как скрытый ввод.

Однако следует помнить о двух вещах:

  • В этом случае в журналах HTTP-сервера не будет доказательств того, какая запись была опубликована пользователем (если вы заботитесь об этом).
  • Этот вид разделения работает только для форм POST.GET формы игнорируют параметры в атрибуте action, вы должны указать все их как скрытые поля ввода.
2 голосов
/ 15 января 2012

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

1 голос
/ 15 января 2012

Существует разница, потому что параметры GET, переданные атрибуту действия, отклоняются.Вы должны использовать скрытые поля.

Если вы укажете атрибут метода в своей форме и установите для него значение «POST», вам придется анализировать параметры GET и POST.

IДля проверки использовался следующий файл (назовите его «testget.php»):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title>Test GET</title>
    </head>
    <body>
        <p>
            <?php
                if( ! empty( $_GET ) )
                {
                    print_r( $_GET );
                }
                if( ! empty( $_POST ) )
                {
                    print_r( $_POST );
                }
            ?>
        </p>
        <p>No method attribute</p>
        <form action="testget.php?foo=bar">
            <input type="hidden" name="bar" value="foo" />
            <input type="submit" value="Submit" />
        </form>
        <p>method="get"</p>
        <form action="testget.php?foo=bar" method="get">
            <input type="hidden" name="bar" value="foo" />
            <input type="submit" value="Submit" />
        </form>
        <p>method="post"</p>
        <form action="testget.php?foo=bar" method="post">
            <input type="hidden" name="bar" value="foo" />
            <input type="submit" value="Submit" />
        </form>
    </body>
</html>

Вывод:

No method attribute:Array ( [bar] => foo )

method="get":Array ( [bar] => foo )

method="post": Array ( [foo] => bar ) Array ( [bar] => foo )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...