30

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

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

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

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

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

还有其他想法吗?

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

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

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

4

8 回答 8

8

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

于 2008-11-18T00:40:43.220 回答
3

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

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

按优先顺序,我会

  1. 拆分表单并使用一些服务器端状态保留
  2. 切换到 POST,然后生成并重定向到 POST 上解析为相同结果的较短 URL
  3. 放弃 ;)
于 2008-11-18T00:41:22.843 回答
2

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

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

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

于 2008-11-18T01:16:52.350 回答
2

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

于 2008-11-18T07:27:25.393 回答
1

GET使用 post 并且如果用户为搜索添加书签,将其保存在数据库中并给它一个唯一的令牌,然后使用并将令牌作为参数传递给搜索页面。

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)');
?>
于 2008-11-18T07:51:18.933 回答
1

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

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

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

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

一些缩短输出的策略:

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

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

于 2008-11-18T12:22:21.587 回答
1

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

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

于 2010-02-12T02:24:17.613 回答
1

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

于 2014-02-14T10:25:25.117 回答