【问题标题】:Use GET or POST for a search form使用 GET 或 POST 搜索表单
【发布时间】:2010-09-22 18:51:45
【问题描述】:

我有几个搜索表单,其中一个包含约 50 个字段,另一个包含约 100 个字段。通常,正如 HTML 规范所说,我使用 GET 方法进行搜索,因为没有更改任何数据。我还没有遇到这个问题,但我想知道我是否会很快用完 URL 空间?

Internet Explorer 的限制为 2083 个字符。其他浏览器,有一个much higher limit。我正在运行 Apache,所以限制大约是 4000 个字符,而 IIS 是 16384 个字符。

在 100 个字段中,假设字段名称的平均长度为 10 个字符,这已经是 5000 个字符了……在 100 个字段的表单上真是太棒了,我还没有任何错误。 (25%的字段是多选,所以字段长度要长得多。)

所以,我想知道我的选择是什么。 (缩短表格不是一种选择。)这是我的想法:

  • 使用 POST。我不太喜欢这个,因为目前用户可以为他们的搜索添加书签并稍后再次执行——这是一个非常棒的功能。
  • 让 JavaScript 循环遍历表单以确定哪些字段与默认字段不同,填充另一个表单并提交该表单。用户当然会为缩短的版本添加书签。

还有其他想法吗?

另外,有谁知道长度是编码长度还是纯文本?

我正在使用 PHP 进行开发,但它可能没有什么不同。

编辑:我无法删除任何字段;我无法缩短表格。这是客户所要求的,他们经常使用不同类别的一系列字段。我知道很难想出一个在这么多字段上看起来不错的表单,但是用户理解它的工作原理没有问题。

【问题讨论】:

    标签: forms post get


    【解决方案1】:

    如果您的搜索结果可以共享,Get 可以有一个优势,如果您将链接发送给某人,则在发布请求的情况下,该人将看不到任何搜索结果

    【讨论】:

      【解决方案2】:

      可以从哲学上将搜索提交 POST 视为创建已保存的搜索(尤其是当搜索与您的用户所做的对象一样复杂时)。在这种情况下,您可以接受帖子以创建搜索,然后使用 GET 重定向以获取适当的搜索结果(发布/重定向/获取)。

      这也将允许用户将搜索结果 (GET) 加入书签,以便随时返回以重新运行搜索。

      【讨论】:

        【解决方案3】:

        还有,有谁知道长度 是编码长度还是纯文本?

        我的猜测是编码长度。我做了一个简单的测试:一个文本区域和一个简单的 PHP 脚本的提交按钮。
        在 IE6 中加载页面,在 textarea 中粘贴一些法语文本,2000 个字符。如果我点击提交按钮,什么都没有。我必须缩短文本的长度才能提交。

        也就是说,2083 个字符的限制正是提交 GET 请求后在地址栏中找到的 URL 的最大长度。

        我会选择 JavaScript 解决方案:在提交时,分析表单,创建具有 hidden 属性的辅助表单,然后提交。

        缩短输出的一些策略:

        • 正如您所指出的,您已经可以跳过所有保留为默认值的值(无字段,无值)。
        • 如果您有类似Processing forum search 的表单,您可以将所有复选框状态仅分组到一个变量中,例如。使用字母编码。
        • 使用简短的value 属性(例如在select 中)。

        注意:如果搜索页面实际上是由几个独立的表单组成,而用户只填写一个或另一个部分,您可以制作多个单独的表单。
        可能不适用于您的情况,可能看起来很明显,但值得一提……^_^

        【讨论】:

          【解决方案4】:

          使用 post,如果用户为搜索添加书签,将其保存在数据库中并为其提供唯一令牌,然后使用 GET 重定向到搜索页面并将令牌作为参数传递。

          TinyURL 是一个很好的例子:你给它一个很长的 URL,它把它保存到一个数据库中,给你一个该 URL 的唯一标识符,然后你可以使用该标识符请求长 URL。

          在 PHP 中是这样的:

          <?php
          if (isset($_GET['token']))
          {
              $token = addslashes($_GET['token']);
              $qry = mysql_query("SELECT fields FROM searches WHERE token = '{$token}'");
              if ($row = mysql_fetch_assoc($qry))
              {
                  performSearch(unserialize($row['fields']));
                  exit;
              }
              showError('Your saved search has been removed because it hasn\'t been used in a while');
              exit;
          }
          $fields = addslashes(serialize($_POST));
          $token = sha1($_SERVER['REMOTE_ADDR'].rand());
          mysql_query("INSERT INTO searches (token, fields, save_time) Values ('{$token}', '{$fields}', NOW())");
          header('Location: ?token='.$token);
          exit;
          ?>
          

          每天运行一个脚本:

          <?php
          mysql_query('DELETE FROM searches WHERE save_time < DATE_ADD(NOW(), INTERVAL -200 DAY)');
          ?>
          

          【讨论】:

          • 一个想法,虽然可以在数据库方面加起来——可能每天几千条记录,我认为我永远无法删除它们。系统上的一些“项目”已经活跃了 5 年以上,并且可能会再活跃 10 年......
          • 好吧,每次查询时更新 save_time。除非您要处理超过 50.000.000 条记录,否则如果您在令牌列上放置索引,则无需担心。
          【解决方案5】:

          如果您不介意使用 javascript,那么您可以让它计算出查询字符串的长度,如果太长,则切换到帖子。然后有某种 url 映射器允许他们为这些发布的搜索添加书签。

          【讨论】:

            【解决方案6】:

            您在评论中提到许多字段“是隐藏的,可以根据需要打开”。

            如果您愿意放弃优雅降级,您总是可以在表单中实际添加和删除字段,而不仅仅是隐藏和显示它们:浏览器不会提交未包含在表单中的字段。

            这是在线保险等页面使用的“品牌和型号”表单的变体——选择品牌,提交回服务器并获取该制造商的型号列表。

            【讨论】:

            • 是的...当我第一次看到表单上的(可见)字段集随着用户浏览它而变化时,我立即想到的是“使用 AJAX(或类似的)添加字段如所须”。您无需在初始页面加载时将它们全部枪杀。
            • 不幸的是,仅隐藏/显示某些字段会更加困难,因为他们看不到的字段中可能包含值(但由英文字符串表示),因为它们是添加到他们之前的搜索中。
            • 提示:浏览器不会提交禁用字段。
            【解决方案7】:

            为了间接解决您的问题,如果我面对要在一个页面上填写 100 个字段的表单,我很可能会关闭我的浏览器,这听起来像是一个完整的可用性噩梦。

            我的回答是,如果我有可能接近表单的正常使用限制,那么我可能做错了。

            按照优先顺序,我会

            1. 拆分表单并使用一些服务器端状态保留
            2. 切换到 POST,然后在 POST 上生成并重定向到一个较短的 URL,该 URL 解析到相同的结果
            3. 放弃 ;)

            【讨论】:

            • 嗯,有 3 件事:(1) 用户一次看不到所有 100 个字段。它们是隐藏的,可以根据需要打开。 (2) 这是一个人们知道如何使用的搜索字段——它不是一个 100 字段的注册表单。 (3) 字段处理真的很简单,我对代码做了很多优化!
            【解决方案8】:

            您的用户是否真的会使用全部 50-100 个字段进行搜索?如果他们只使用几个,为什么不将搜索发布到“中间”页面,该页面 header() - 将它们重定向到结果页面,只有 URL 中的用户更改字段?结果页面将使用 URL 中不存在的字段的默认值。

            【讨论】:

            • 如果您选择此方法,请务必从 POST 返回“303 See Other”响应,以使浏览器通过 GET 获取重定向的请求。否则,它可能会尝试对重定向的 URL 进行 POST。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-05
            • 2010-10-10
            • 2014-02-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多