Хотите использовать методы GET и POST - PullRequest
11 голосов
/ 10 января 2010

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

Теперь предположим, что я хочу создать поисковую систему, которая по умолчанию использует GET, позволяя пользователям делать закладки, но когда длина поисковой фразы превышает ограничение, переключитесь на POST. На стороне сервера я использую $ _GET или $ _POST, в зависимости от того, какое из них установлено.

Это выполнимо?
Если нет, то почему?
Если да, пожалуйста, кратко опишите.

Спасибо

Ответы [ 6 ]

12 голосов
/ 10 января 2010

Это выполнимо, без проблем.

Существует массив $_REQUEST, который объединяет значения GET, POST и COOKIE, но лучшим способом было бы обрабатывать GET и POST вручную в вашем скрипте.

Просто попросите ваш двигатель проверить и $_GET["variable"], и $_POST["variable"] и использовать в зависимости от того, что установлено. Если переменная установлена ​​в обоих методах, вам нужно решить, какой из них вы хотите иметь приоритет.

Единственное заметное различие между этими двумя методами заключается в том, что параметр GET имеет ограничения по размеру в зависимости от браузера и принимающего веб-сервера (POST также имеет ограничения, но они обычно находятся в диапазоне нескольких мегабайт). Я думаю, что общее правило таково, что строка GET никогда не должна превышать 1024 символа.

10 голосов
/ 10 января 2010

Вот как вы можете использовать GET и POST в одном:

<form action="myfile.php?var1=get1&amp;var2=get2&amp;var3=get3" method="post">

    <input type="hidden" name="var1" value="post1" />
    <input type="hidden" name="var2" value="post2" />

    <input type="submit" />
</form>

PHP:

print_r($_REQUEST);
// var1 = "post1"
// var2 = "post2"
// var3 = "get3"

print_r($_GET)
// var1 = "get1"
// var2 = "get2"
// var3 = "get3"

print_r($_POST);
// var1 = "post1"
// var2 = "post2"
1 голос
/ 24 марта 2014
function getQVar($key){
     return isset($_GET[$key]) ? $_GET[$key] : (isset($_POST[$key]) ? $_POST[$key] : null); 
}
echo getQVar("name");

Переключайтесь между $ _GET и $ _POST, чтобы установить приоритет POST над GET-переменными.

1 голос
/ 11 января 2010

Да, это выполнимо, хотя (ИМХО) предел, при котором GET становится громоздким, значительно превышает порог, при котором пользовательский интерфейс для предоставления такого большого количества информации становится непригодным. Кроме того, чем сложнее запрос, который вы отправляете в обычную поисковую систему, тем эффективнее он может быть разрешен.

Но я думаю, у тебя есть свои причины.

Самый простой способ из предоставленной вами информации - это изменить метод формы во время выполнения с GET на POST, используя javascript, например,

<form method='GET' id='searchform' target='search.php' onsubmit='
  if (document.getElementById("searchdata")) {
    if ((document.getElementById("searchdata").length >$some_threshold) 
         && (document.getElementById("searchform"))) { 
         // 2nd if in case this moved to action for button 
         document.getElementById("searchform").method="POST";
     }
   }
 return true;'>
 <textarea name='searchdata' id='searchdata'>
 </textarea>
 <input type='submit' value='go get it'>
</form>

Что также хорошо подходит для клиентов, не поддерживающих JavaScript.

С * * +1010

1 голос
/ 10 января 2010

Также необходимо знать, что использование GET вызывает искушение среди определенных групп пользователей манипулировать URL-адресом, чтобы «увидеть, что происходит», поэтому абсолютно необходимо убедиться, что ваш код соответствующим образом очищает входные переменные.

Конечно, вы все равно это делали ;-). Но с get это стоит быть вдвойне параноиком.

Сам, если я использую GET, я, как правило, тоже устанавливаю cookie и добавляю в него какой-то идентификатор, а затем взаимно коррелирую его с переменной в списке GET, просто чтобы убедиться, что нет абсолютно никаких проблем. пользователь A управляет вводом и позволяет им увидеть все, что происходит от пользователя B.

1 голос
/ 10 января 2010

Вы можете использовать что-то вроде следующего:

<?php
function getParam($key)
{    
    switch (true) {
        case isset($_GET[$key]):
            return $_GET[$key];
        case isset($_POST[$key]):
            return $_POST[$key];
        case isset($_COOKIE[$key]):
            return $_COOKIE[$key];
        case isset($_SERVER[$key]):
            return $_SERVER[$key];
        case isset($_ENV[$key]):
            return $_ENV[$key];
        default:
            return null;
    }    
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...