2008-11-18 17 views
27

我有幾個搜索表單,其中1個〜50個字段,另一個〜100。通常,如HTML規範所說,我使用GET方法進行搜索,因爲沒有數據發生變化。我還沒有遇到這個問題,但我想知道我是否會盡快用完URL空間?使用GET或POST進行搜索表格

Internet Explorer的限制是2083個字符。其他瀏覽器,有一個much higher limit。我正在運行Apache,所以限制大約有4000個字符,其中IIS是16384個字符。

在100個字段中,假設平均字段名稱的長度爲10個字符,那已經是5000個字符了......在100字段的表單中,我還沒有出現任何錯誤。 (25%的字段是多重選擇,所以字段長度更長)。

所以,我想知道我的選擇是什麼。 (縮短表格不是一個選項。)在這裏我的想法:

  • 使用POST。我不太喜歡這一點,因爲目前用戶可以爲他們的搜索添加書籤並在稍後再次執行 - 這真是一個非常棒的功能。
  • 讓JavaScript遍歷表單以確定哪些字段與默認字段不同,填充另一個表單並提交該表單。用戶當然會爲縮短版本添加書籤。

還有其他想法嗎?

此外,有沒有人知道如果長度是編碼長度或純文本?

我正在開發PHP,但它可能沒有區別。

編輯:我無法刪除任何字段;我無法縮短表格。這就是客戶要求的,他們經常使用不同類別的一系列領域。我知道很難想象這種形式在很多領域看起來不錯,但用戶在理解它的工作方式時沒有問題。

回答

6

您的用戶是否真的要使用全部50-100個字段來執行搜索?如果他們只使用少數幾個,爲什麼不把搜索結果發佈到header()之間的「in between」頁面中 - 將它們重定向到僅包含URL中用戶更改字段的結果頁面?然後結果頁面將使用URL中不存在的字段的默認值。

+1

如果選擇這種方法,可以肯定的從POST返回「303 See Other」響應,以使瀏覽器通過GET獲取重定向的請求。否則,它可能會嘗試對重定向的URL執行POST。 – 2008-11-18 00:47:54

2

要間接地解決您的問題,如果我面臨一個100頁的表格填寫一頁,我很可能關閉我的瀏覽器,這聽起來像一個完整的可用性夢魘

我的回答是,如果我有任何接近正常的限制的危險,我可能會做錯了。

在優先順序,我會

  1. 分割的形式和使用一些服務器端狀態保持
  2. 切換到POST,然後生成並重定向到POST較短的網址解析成同樣的結果
  3. 放棄;)
+0

嗯,3件事情:(1)用戶一次看不到所有100個字段。它們是隱藏的,可以根據需要打開。 (2)這是一個人們知道如何使用的搜索領域 - 它不是一個100字段的註冊表。 (3)由於我已經優化了很多代碼,所以處理這些字段非常簡單! – 2008-11-18 00:45:50

2

你提到的評論,許多領域的「是隱藏的,可以根據需要打開」。

如果您願意放棄優雅的退化,您總是可以添加和刪除表單中的字段,而不是隱藏和顯示它們:瀏覽器不會提交未包含在表單中的字段。

這是在線保險等網頁使用的「品牌和型號」表單的變體 - 選擇製造商,提交回服務器並獲取該製造商的型號列表。

+0

是的......當我第一次看到表單中的(可見)字段集隨着用戶的經歷而改變時,我的直接想法是「使用AJAX(或類似的)來根據需要添加字段」。在初始頁面加載時,你不需要全部霰彈槍。 – 2008-11-18 01:21:20

+0

不幸的是,只隱藏/顯示某些字段會困難得多,因爲在添加到他們先前的搜索中時,他們看不到有值的字段(但用英文字符串表示)。 – 2008-11-18 07:23:41

2

如果你不介意使用javascript,那麼你可以讓它處理查詢字符串的長度,如果它太長,那麼切換到一個帖子。然後有一些URL映射器允許他們收藏這些張貼的搜索。

1

使用後,如果用戶書籤搜索,將其保存在數據庫中,並給它一個唯一的標記,然後使用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)'); 
?> 
1

而且,沒有人知道如果長度 是編碼的長度或只是純文本?

我的猜測是編碼長度。我做了一個簡單的測試:一個textarea和一個簡單的PHP腳本提交按鈕。
在IE6中加載頁面,在textarea中粘貼一些法文文本,2000個字符。如果我點擊提交按鈕,什麼都沒有。我不得不縮短文本的長度以便能夠提交。

換句話說,2083字符限制正好是提交GET請求後在地址欄中找到的URL的最大長度。

我會去JavaScript解決方案:在提交,分析表單,創建hidden屬性的輔助表單,並提交。

上縮短輸出一些策略:

  • 正如你指出,你已經可以跳過所有值左側爲默認(無場,沒有值)。
  • 如果您的表單類似於Processing forum search,您可以將所有複選框狀態僅組合到一個變量中,例如。使用字母編碼。
  • 使用短value屬性(例如select)。

注意:如果搜索頁面實際上由多個獨立的表單組成,其中用戶只填寫一個或多個部分,則可以製作多個單獨的表單。
可能不適用於你的情況,可能看起來很明顯,但值得一提的記錄...^_^

0

可以從哲學上看待搜索提交POST作爲保存搜索的創建(特別是當搜索作爲用戶正在製作的對象的複雜對象)。在這種情況下,您可以接受創建搜索的帖子,然後使用GET重定向來獲取適當的搜索結果(post/redirect/get)。

這也允許用戶爲搜索結果(GET)添加書籤以隨時返回以重新運行搜索。

0

獲取可以有一個優勢,如果你的搜索結果可以共享,在POST請求的情況下,如果你將鏈接發送給某人,那人將不會看到任何搜索結果