我有几个搜索表单,1个有~50个字段,另一个有~100个。通常,正如HTML规范所说,我使用GET方法进行搜索,因为没有数据被更改。我还没有遇到过这个问题,但我想知道我是否会很快耗尽URL空间?
Internet Explorer的限制为2083个字符。其他浏览器有much higher limit。我正在运行Apache,所以限制大约有4000个字符,IIS是16384个字符。
在100个字段中,假设平均字段名称长度为10个字符,那已经是5000个字符...在100字段表单上很惊人,我还没有任何错误。 (25%的字段是多个选择,因此字段长度要长得多。)
所以,我想知道我的选择是什么。 (缩短表格不是一种选择。)在这里我的想法:
还有其他想法吗?
另外,有人知道长度是编码长度还是纯文本?
我正在开发PHP,但它可能没有什么区别。
修改:我无法删除任何字段;我无法缩短表格。这是客户要求的,他们经常使用不同类别的一系列字段。我知道很难想到一个在这么多领域看起来不错的表单,但是用户在理解它是如何工作时没有问题。
答案 0 :(得分:6)
您的用户实际上是否会使用所有50-100个字段进行搜索?如果他们只使用少数,为什么不将搜索发布到“中间”页面哪个header() - 将它们重定向到结果页面,只有URL中的用户更改字段?然后,结果页面将使用URL中不存在的字段的默认值。
答案 1 :(得分:2)
为了间接解决您的问题,如果我面对一个100字段的表单填写一页,我很可能关闭我的浏览器,这听起来像一个完整的可用性噩梦。
我的回答是,如果我有可能接近表格正常的限制,我可能会做错了。
按照优先顺序,我会
答案 2 :(得分:2)
您在评论中提到许多字段“已隐藏,可根据需要打开”。
如果您愿意放弃优雅降级,您可以随时添加和删除表单中的字段,而不是隐藏和显示它们:浏览器不会提交表单中未包含的字段。
这是在线保险等页面使用的“制作和模型”表单的变体 - 选择制作,提交回服务器并获取该制造商的模型列表。
答案 3 :(得分:2)
如果你不介意使用javascript那么你可以让它计算出查询字符串的长度,如果它太长,那么切换到一个帖子。然后有一些url映射器,允许他们为这些发布的搜索添加书签。
答案 4 :(得分:1)
使用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 :(得分:1)
另外,有没有人知道长度 是编码长度还是纯文本?
我的猜测是编码长度。我做了一个简单的测试:一个textarea和一个简单的PHP脚本的提交按钮 在IE6中加载页面,在textarea中粘贴一些法语文本,2000个字符。如果我点击提交按钮,没有。我不得不缩短文本的长度才能提交。
换句话说,2083字符限制正好是提交GET请求后在地址栏中找到的URL的最大长度。
我会选择JavaScript解决方案:提交,分析表单,创建具有hidden
属性的辅助表单,然后提交。
缩短产量的一些策略:
value
属性(例如select
)。注意:如果搜索页面实际上由几个独立的表单组成,用户只填写一个或另一个部分,您可以制作几个单独的表单。
可能不适用于您的情况,可能看起来很明显,但值得一提的是...... ^ _ ^
答案 6 :(得分:0)
人们可以在哲学上将搜索提交POST视为创建已保存的搜索(特别是当搜索与用户正在进行的搜索一样复杂时)。在这种情况下,您可以接受创建搜索的帖子,然后使用GET重定向以获取相应的搜索结果(post / redirect / get)。
这也允许用户将搜索结果(GET)添加为书签以便随时返回以重新运行搜索。
答案 7 :(得分:0)
如果您的搜索结果可以共享,则获取可以有一个优势,如果您发送链接给某人,如果发布请求,该人将看不到任何搜索结果