4

したがって、イベントのチェーンは次のとおりです。

  1. ユーザーがフォームを送信します。
  2. 送信の処理中に、「レコードが保存されました」などのメッセージが生成されます。
  3. ユーザーは、検索結果などの新しいページにリダイレクトされます。
  4. 新しいページにメッセージを表示する必要があります。

では、問題は、ステップ2からステップ3までのメッセージを取得する方法です。これは1つの単純な例にすぎません...他にもはるかに複雑な例がたくさんあります。

私はPHPを使用しています。

ニーズ:

  • 複数のメッセージをサポートし、必要に応じて受信側のマシンでフォーマットする必要があります
  • メッセージは同じページに追加できます(ステップ4内など)
  • 関数またはオブジェクトの内部から追加されたメッセージ

私が思いついたいくつかのオプション:

  • セッション変数に配列として格納し、各表示後に空にします
  • getまたはqueryパラメーターとして渡します。これを常に処理しているため、煩わしくなり、取得することを忘れないでください。長くなる可能性があるため、クエリ文字列の最大長を簡単に超えてしまう可能性があります
  • セッションごとにデータベースに保存します(ログインしているユーザーが常にそうであるとは限りません)。これには、それらが追加される各ページに追加の挿入が必要になり、場合によっては複数になり、すべてのページに追加の選択が必要になります

現在、セッション内のメッセージを配列に格納していますが、もっと良い方法があるかどうか疑問に思っています。上記の他の2つのオプションはあまり良いとは思いません。

編集:セッションメソッドに2つの関数を使用します:AddStatusMsg()(配列に要素を追加します)とDisplayStatusMsg()(HTML形式のメッセージを返し、配列を空にします)。

4

9 に答える 9

6

これらのメッセージをデータベースまたはセッションに保存しないことをお勧めします。これには、1 つの単純な理由があります。タブです。(まあ、実際には、HTTP のステートレスな性質です。)

Web サイトのさまざまなセクションで複数のタブを開いている人のことを考えてみてください。この人は何らかのアクションを実行し、それがロードされている間に別のタブに切り替えてリンクをクリックします。メッセージをセッション/データベースに保存していて、切り替え先のタブがこれらのメッセージも表示できるページである場合、ユーザーは競合状態に入り、サーバーが最初に応答するリクエストに応じて、メッセージが意図しない場所に表示されます。

現在、これが正当に問題にならない状況がいくつかありますが、場合によっては非常に混乱する可能性もあります.

リクエストにメッセージを入れることは、最初に思われるほど悪いことではありません。おそらく、表示したいすべてのメッセージを数値 (またはボーナスの難読化のためにハッシュ) ID とともにデータベースに保存し、クエリ文字列で ID のリストを渡すことができます。これにより、クエリ文字列が短くなり、コード内のどのメッセージにどの ID が対応するかを追跡するだけで済みます。

于 2008-11-20T03:42:15.800 に答える
3

おそらくマスターページにこのメッセージングシステムのサポートを追加するだけで、セッションアプローチに固執します。他のすべてのアプローチには、より大きなコスト、単純さ、またはパフォーマンスがあるため、あなたは正しい道を進んでいます。

他のすべてのページのテンプレートであるマスターページがあると思います。持っていない場合は、持っているのが妥当な理由です。そのため、メッセージを表示する特定の場所がある限り、必要なすべてのページでのメッセージの表示を処理する必要はありません。

そのためにマスターページによってレンダリングされた特定のdivを使用して、現在のページで位置を処理することもできます。私が正しく理解していれば、メッセージが表示されてからユーザーが別のページにリダイレクトするまでの間に、ある種のタイミングが必要です。これは、任意のAJAXライブラリを使用して、前に言ったdivを表示してから、新しいページにリダイレクトすることで実現できます。

jQueryを調べることをお勧めします。

于 2008-11-20T02:22:25.367 に答える
3

これは私がやりたい方法です:

function set_message($message_type, $message)
{
    $_SESSION['messages'][$message_type][] = $message
}

function get_messages()
{
    $messages_array = $_SESSION['messages'];
    unset($_SESSION['messages']);
    return $messages_array;
}

$message_type「警告」、「エラー」、「成功」などの場合があり、タイプに応じて、ユーザーに異なる画像/色/その他のものを表示できます。

于 2008-11-20T02:34:24.330 に答える
1

この問題は、http のような「ステートレス プロトコル」でデータを保持する方法の典型的な例です。

オプションは次のとおりです。

  1. GET パラメータで渡します (ユーザーフレンドリーではありません)。
  2. DBに格納する
  3. セッションに保存する

オプション 2) と 3) では、ユーザーが Cookie を持っている必要があります (そうでない場合、ユーザーをメッセージに一致させる方法はありません)。それらの間で、PHP の組み込みセッションを使用します。ステップ 2 でセッション変数を設定し、ステップ 4 で常に検索ページに変数をチェックさせるだけです。

それには何もありません。物事を過度に複雑にしないでください。

于 2008-11-20T03:29:11.927 に答える
1

おそらく最良の方法は、セッションに保存することです。それは最も簡単な方法であり、ジョンが言ったように、「物事を複雑にしすぎないでください」.

于 2008-11-20T04:04:00.687 に答える
0

それをデータベースとセッションに保存します。このようにして、ユーザーは必要に応じて履歴にアクセスでき、セッションデータから簡単にアクセスできます。

クエリパラメータは使用しないでください。メッセージが表示されるべきではないときに、ある時点でユーザーを混乱させるだけです。

メッセージの表示は、メインテンプレートの一部である必要があります(つまり、1回だけ実行します)。

于 2008-11-20T02:22:40.673 に答える
0

たぶん、わずかな改善は、配列の代わりに、データが入力され、メッセージを適切に表示する方法を知っているオブジェクトのインスタンスを格納し、表示ルーチンが呼び出された後にデータ自体を削除することです。そうすれば、どこでも表示と削除のロジックを繰り返す必要がなくなり、さらに、必要に応じてオブジェクトにさまざまな出力ルーチンをコーディングできます。

于 2008-11-20T02:24:43.430 に答える
0

あなたは正しい方法でやっていると思います。このためにデータベースに近づかないようにする必要があり、それを URL に入れるのは見苦しいです。これを簡単にするための素敵な小さなクラスを書くことができます。

ここに小さなセッションクラスがあります:

<?php class session

{

public function __construct()
{
    session_start();
}

public function set($name, $value)
{
    $_SESSION[$name] = $value;
}

public function get($name)
{
    return (isset($_SESSION[$name])) ? $_SESSION[$name] : false ;
}

public function delete($name)
{
    unset($_SESSION[$name]);
}

public function destroy()
{
    $_SESSION = array();
    #session_destory();
    #session_regenerate_id();
}

}

その上に小さなメッセージクラスを簡単に構築できます。

于 2008-11-20T02:29:36.087 に答える
0

私自身、この岐路に立たされており、すべての選択肢を広範に検討してきました。

  1. 1 つは page と呼ばれ、もう 1 つは message と呼ばれる 2 つのブラウザー Cookie を保存するのはどうでしょうか。
  2. リダイレクト時に Cookie を上書きします。
  3. ページが読み込まれると、その Cookie が存在するかどうかを確認します (クライアントから送信された http ヘッダーに)。
  4. そのページに対するものかどうかを確認し、そうであれば、メッセージを変数に保存し、Cookie の設定を解除します。
  5. そのページでない場合は無視してください。ロードしている他のタブに出力されます。または、何らかの理由で Cookie の設定を解除しないページの場合は、最終的に有効期限が切れます。

これにより、データベース Cookie とセッション Cookie の使用が回避されます。

于 2008-11-28T21:24:15.440 に答える