30

2 つの検索フォームがあり、1 つはフィールドが 50 以下、もう 1 つはフィールドが 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 のフィールドすべてを使用して検索を行うでしょうか? 少数しか使用していない場合は、ユーザーが変更した URL のフィールドのみを含む結果ページにヘッダー () リダイレクトする「中間」ページに検索を POST してみませんか? 結果ページでは、URL に存在しないフィールドのデフォルト値が使用されます。

于 2008-11-18T00:40:43.220 に答える
3

あなたの質問に間接的に答えると、1 ページに 100 フィールドのフォームに入力する必要がある場合、ブラウザを閉じる可能性が高く、完全なユーザビリティの悪夢のように聞こえます。

私の答えは、フォームの通常の使用でその制限に近づく危険がある場合、おそらく間違ったことをしているということです。

好ましい順に、私は

  1. フォームを分割し、サーバー側の状態保持を使用する
  2. POST に切り替えてから、同じ結果に解決された POST の短い URL を生成してリダイレクトします。
  3. あきらめる ;)
于 2008-11-18T00:41:22.843 に答える
2

JavaScript を使用してもかまわない場合は、クエリ文字列の長さを計算し、長すぎる場合は投稿に切り替えることができます。次に、これらの投稿された検索をブックマークできるように、ある種の URL マッパーを用意します。

于 2008-11-18T07:27:25.393 に答える
2

フィールドの多くは「非表示で、必要に応じて開くことができる」とコメントで述べています。

グレースフル デグラデーションを破棄したい場合は、フィールドを非表示にして表示するだけでなく、実際にフォームからフィールドを追加および削除することもできます。ブラウザーは、フォームに含まれていないフィールドを送信しません。

これは、オンライン保険などのページで使用される「メーカーとモデル」フォームの変形です。メーカーを選択し、サーバーに送信して、そのメーカーのモデルのリストを取得します。

于 2008-11-18T01:16:52.350 に答える
1

検索送信POSTは、保存された検索の作成と哲学的に見なすことができます(特に、検索がユーザーが作成しているオブジェクトと同じくらい複雑な場合)。この場合、検索を作成するための投稿を受け入れてから、GETを使用してリダイレクトし、適切な検索結果をフェッチすることができます(post / redirect / get)。

これにより、ユーザーはいつでも検索結果(GET)をブックマークして戻ってきて、検索を再実行できます。

于 2010-02-12T02:24:17.613 に答える
1

また、長さがエンコードされた長さなのか、プレーンテキストなのか誰かが知っていますか?

私の推測では、エンコードされた長さでした。簡単なテストを行いました。テキストエリアと単純なPHPスクリプトへの送信ボタンです。
IE6でページを読み込み、テキストエリアにフランス語のテキストを2000文字貼り付けました。送信ボタンを押しても何もありません。送信できるようにするには、テキストの長さを短くする必要がありました。

つまり、2083文字の制限は、GET要求を送信した後にアドレスバーに表示されるURLの最大長とまったく同じです。

hidden私はJavaScriptソリューションを選びます。送信時にフォームを分析し、属性を使用してセカンダリフォームを作成し、それを送信します。

出力を短縮するためのいくつかの戦略:

  • ご指摘のとおり、デフォルトのままになっているすべての値をスキップできます(フィールドなし、値なし)。
  • 処理フォーラム検索のようなフォームがある場合は、すべてのチェックボックスの状態を1つの変数にのみグループ化できます。文字エンコーディングを使用します。
  • 短いvalue属性を使用します(selectたとえば)。

注:検索ページが実際に複数の独立したフォームで構成されており、ユーザーが1つのセクションまたは別のセクションにのみ入力する場合は、複数の個別のフォームを作成できます。
あなたのケースには当てはまらないかもしれませんし、明白に思えるかもしれませんが、記録のために言及する価値があります... ^ _ ^

于 2008-11-18T12:22:21.587 に答える
1

検索結果を共有できる場合、Get には 1 つの利点があります。投稿リクエストの場合、リンクを誰かに送信すると、その人には検索結果が表示されません。

于 2014-02-14T10:25:25.117 に答える
1

投稿を使用し、ユーザーが検索をブックマークした場合は、それをデータベースに保存して一意のトークンを付与しGET、トークンをパラメーターとして使用して渡すことで検索ページにリダイレクトします。

TinyURL は良い例です。非常に長い URL を指定すると、DB に保存され、その 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 に答える