【问题标题】:Want to use both GET and POST methods想要同时使用 GET 和 POST 方法
【发布时间】:2010-01-10 11:41:02
【问题描述】:

我知道使用 GET 方法的结果页面可以添加书签,而使用 POST 的结果页面不能。我也知道 GET 方法的限制。

现在假设我想构建一个默认使用 GET 允许用户添加书签的搜索引擎,但是当搜索短语的长度超过限制时,切换到 POST。在服务器端,我根据设置使用 $_GET 或 $_POST。

这可行吗?
如果没有,为什么?
如果是,请提供一个简短的大纲。

谢谢

【问题讨论】:

  • 您想在哪里做出决定 - 在服务器端还是在客户端 (javascript)?您是否希望用户进行超过 1024 个字符的搜索?

标签: php http


【解决方案1】:

这是可行的,没问题。

$_REQUEST 数组可以合并 GET、POST 和 COOKIE 值,但更好的方法是在脚本中手动处理 GET 和 POST。

只需让您的引擎同时检查$_GET["variable"]$_POST["variable"] 并使用设置的任何一个。如果在这两种方法中都设置了一个变量,则需要决定要优先考虑哪一个。

这两种方法唯一显着的区别是 GET 参数有大小限制,具体取决于浏览器和接收 Web 服务器(POST 也有限制,但它们通常在几兆字节的范围内)。 我认为一般规则是 GET 字符串不应超过 1024 个字符。

【讨论】:

  • @Pekka:谢谢 :) 我在哪里添加从 GET 切换到 POST 的逻辑?
  • 如果您之前在脚本中使用 $_GET["xyz"],请将其替换为您在脚本的开头。
  • @Pekka:但是我对表单方法参数使用什么?我应该使用say JS来查看是否超过限制,如果是的话..如果从默认GET更改为POST?
  • 您必须为此使用 Javascript。查看docs.jquery.com/Ajax/serialize 以了解表单的(近似)大小。
【解决方案2】:

以下是您可以同时使用 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"

【讨论】:

    【解决方案3】:

    你可以使用类似下面的东西:

    <?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;
        }    
    } 
    

    【讨论】:

    • 您无法控制由 $_REQUEST 完成的合并,因此可能会导致安全问题,请参阅对 Pakka 问题的评论以获取链接。这也是绑定 $_SERVER 和 $_ENV 的便捷方法,而 $_REQUEST 没有这样做。 Zend 框架采用此方法。
    【解决方案4】:

    还需要注意的是,使用 GET 会在某些用户中引诱用户操纵 URL 以“看看会发生什么”,因此绝对有必要确保您的代码适当地清理输入变量。

    当然,无论如何你都在这样做;-)。但是得到它是值得双重偏执的。

    我自己,如果我使用 GET,我通常也会设置一个 cookie 并在其中放入某种 ID,然后将其与 GET 列表中的变量进行交叉关联,以确保绝对没有问题用户 A 操作输入并让他们看到源自用户 B 的任何内容。

    【讨论】:

      【解决方案5】:

      是的,它是可行的,尽管(恕我直言)GET 变得麻烦的限制明显大于用于提供这么多信息的用户界面变得不可用的阈值。此外,您提交给传统搜索引擎的查询越复杂,它就越能有效地解决。

      但我猜你有你的理由。

      根据您提供的信息,实现此目的的最简单方法是在运行时使用 javascript 将表单方法从 GET 更改为 POST,例如

      <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 客户端也能很好地降级。

      C.

      【讨论】:

        【解决方案6】:
        function getQVar($key){
             return isset($_GET[$key]) ? $_GET[$key] : (isset($_POST[$key]) ? $_POST[$key] : null); 
        }
        echo getQVar("name");
        

        在 $_GET 和 $_POST 之间切换,以使 POST 优先于 GET 变量。

        【讨论】:

          猜你喜欢
          • 2011-11-16
          • 1970-01-01
          • 1970-01-01
          • 2011-10-30
          • 1970-01-01
          • 1970-01-01
          • 2012-12-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多