質問
1つの〜50フィールドと1つの〜100フィールドの2つの検索フォームがあります。通常、HTMLの仕様にあるように、データは変更されないため、GETメソッドを使用して検索を行います。まだこの問題に遭遇していませんが、すぐにURLのスペースがなくなるかどうか迷っていますか?
Internet Explorer の制限は2083文字です。他のブラウザには、はるかに高い制限があります。 Apacheを実行しているので、制限は約4000文字で、IISは16384文字です。
100フィールドで、たとえばフィールド名の平均長が10文字だとすると、すでに5000文字です... 100フィールドのフォームに驚くほど、エラーはまだありません。 (フィールドの25%は複数選択であるため、フィールドの長さははるかに長くなります。)
だから、私のオプションは何だろうと思っています。 (フォームを短縮することはオプションではありません。)ここで私のアイデア:
- POSTを使用します。現時点ではユーザーが検索をブックマークして後で再度実行できるため、これはあまり好きではありません。これは本当に素晴らしい機能です。
- JavaScriptがフォームをループしてデフォルトと異なるフィールドを判別し、別のフォームにデータを入力して送信します。ユーザーはもちろん短縮版をブックマークします。
その他のアイデア?
また、長さがエンコードされた長さであるか、単なるテキストであるかを知っていますか?
PHPで開発していますが、おそらく違いはありません。
編集:フィールドを削除できません。フォームを短縮できません。これはクライアントが求めているものであり、多くの場合、さまざまなカテゴリのさまざまなフィールドを使用します。このように多くのフィールドで見栄えの良いフォームを考えるのは難しいことは知っていますが、ユーザーはそれがどのように機能するかを理解するのに問題はありません。
解決
ユーザーは実際にすべての50〜100個のフィールドを使用して検索を実行しますか?少数しか使用していない場合は、「間に」に検索をPOSTしないでください。 header()-URLのユーザーが変更したフィールドのみを含む結果ページにリダイレクトするページ結果ページは、URLに存在しないフィールドのデフォルト値を使用します。
他のヒント
あなたの質問に間接的に対処するために、1ページに入力するために100フィールドのフォームに直面した場合、ブラウザを閉じると思います。完全に使いやすい悪夢のようです。
私の答えは、フォームの通常の使用の限界に近づいているという危険がある場合、おそらく間違っています。
優先順に、
- フォームを分割し、サーバー側の状態保持を使用します
- POSTに切り替えて、同じ結果に解決されたPOSTの短いURLを生成してリダイレクトします
- あきらめ;)
コメントの中で、多くのフィールドが「非表示であり、必要に応じて開くことができる」と記載されています。
グレースフルデグラデーションを破棄する場合、フィールドを非表示および表示するだけでなく、実際にフォームにフィールドを追加および削除することができます。ブラウザーは、フォームに含まれていないフィールドを送信しません。
これは、「Make and model」のバリアントです。オンライン保険などのページで使用されるフォーム-メーカーを選択し、サーバーに送信して、そのメーカーのモデルのリストを取得します。
javascriptの使用を気にしない場合は、クエリ文字列の長さを計算し、長すぎる場合は投稿に切り替えることができます。次に、これらの投稿された検索をブックマークするためのURLマッパーを用意します。
投稿を使用し、ユーザーが検索をブックマークした場合、データベースに保存して一意のトークンを付与し、 GET
を使用して検索ページにリダイレクトし、トークンをパラメーターとして渡します。
TinyURLは良い例です:非常に長いURLを与え、DBに保存し、そのURLの一意の識別子を与え、後でその識別子を使用して長いURLをリクエストできます。
PHPでは、次のような行になります。
<?php
if (isset(投稿を使用し、ユーザーが検索をブックマークした場合、データベースに保存して一意のトークンを付与し、 GET
を使用して検索ページにリダイレクトし、トークンをパラメーターとして渡します。
TinyURLは良い例です:非常に長いURLを与え、DBに保存し、そのURLの一意の識別子を与え、後でその識別子を使用して長いURLをリクエストできます。
PHPでは、次のような行になります。
<?php
mysql_query('DELETE FROM searches WHERE save_time < DATE_ADD(NOW(), INTERVAL -200 DAY)');
?>
そして毎日スクリプトを実行します:
<*>GET['token']))
{
$token = addslashes(投稿を使用し、ユーザーが検索をブックマークした場合、データベースに保存して一意のトークンを付与し、 GET
を使用して検索ページにリダイレクトし、トークンをパラメーターとして渡します。
TinyURLは良い例です:非常に長いURLを与え、DBに保存し、そのURLの一意の識別子を与え、後でその識別子を使用して長いURLをリクエストできます。
PHPでは、次のような行になります。
<*>
そして毎日スクリプトを実行します:
<*>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(投稿を使用し、ユーザーが検索をブックマークした場合、データベースに保存して一意のトークンを付与し、 GET
を使用して検索ページにリダイレクトし、トークンをパラメーターとして渡します。
TinyURLは良い例です:非常に長いURLを与え、DBに保存し、そのURLの一意の識別子を与え、後でその識別子を使用して長いURLをリクエストできます。
PHPでは、次のような行になります。
<*>
そして毎日スクリプトを実行します:
<*>POST));
$token = sha1(投稿を使用し、ユーザーが検索をブックマークした場合、データベースに保存して一意のトークンを付与し、 GET
を使用して検索ページにリダイレクトし、トークンをパラメーターとして渡します。
TinyURLは良い例です:非常に長いURLを与え、DBに保存し、そのURLの一意の識別子を与え、後でその識別子を使用して長いURLをリクエストできます。
PHPでは、次のような行になります。
<*>
そして毎日スクリプトを実行します:
<*>SERVER['REMOTE_ADDR'].rand());
mysql_query("INSERT INTO searches (token, fields, save_time) Values ('{$token}', '{$fields}', NOW())");
header('Location: ?token='.$token);
exit;
?>
そして毎日スクリプトを実行します:
<*>また、長さが エンコードされた長さまたは単なるテキストですか?
長さはエンコードされていると推測しました。テキストエリアと単純なPHPスクリプトへの送信ボタンという簡単なテストを行いました。
IE6にページをロードし、2000文字のtextareaにフランス語のテキストを貼り付けました。送信ボタンを押しても何も起こりません。送信するには、テキストの長さを短くする必要がありました。
つまり、2083文字の制限は、GETリクエストを送信した後、アドレスバーで見つかったURLの最大長です。
JavaScriptソリューションを選択します。送信時にフォームを分析し、 hidden
属性を持つセカンダリフォームを作成して送信します。
出力の短縮に関するいくつかの戦略:
- 指摘したように、デフォルトのままになっているすべての値をスキップできます(フィールドなし、値なし)。
- フォーラム検索の処理では、すべてのチェックボックス状態を1つの変数のみにグループ化できます。文字エンコードを使用します。
- 短い
value
属性を使用します(たとえば、select
で)。
注:検索ページが実際に複数の独立したフォームで構成されており、ユーザーが1つのセクションのみに入力している場合、複数の個別のフォームを作成できます。
あなたのケースには当てはまらないかもしれませんし、明白に思えるかもしれませんが、記録のために言及する価値があります... ^ _ ^
検索送信POSTを保存された検索の作成として哲学的に見ることができます(特に、検索がユーザーの作成と同じくらい複雑なオブジェクトの場合)。この場合、検索を作成するために投稿を受け入れてから、GETを使用してリダイレクトし、適切な検索結果を取得します(post / redirect / get)。
これにより、ユーザーは検索結果をブックマークして(GET)いつでも戻って検索を再実行できます。
検索結果を共有できる場合、Getには1つの利点があります。誰かにリンクを送信して投稿をリクエストした場合、その人には検索結果が表示されません