質問

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フィールドのフォームに直面した場合、ブラウザを閉じると思います。完全に使いやすい悪夢のようです。

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

優先順に、

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

コメントの中で、多くのフィールドが「非表示であり、必要に応じて開くことができる」と記載されています。

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

これは、「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つの利点があります。誰かにリンクを送信して投稿をリクエストした場合、その人には検索結果が表示されません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top