2009-06-22 10 views
6

私のサイトには友人を招待するためのフォームがあります。これは単純なテキストフィールドと送信ボタンです。エラーがある場合は、このページにリダイレクトし、セッション変数が設定されている場合はエラーメッセージを表示します。セッション変数の設定を解除する際の問題

if (isset($_SESSION['invite_error'])) { 
    echo $_SESSION['invite_error']; 
    unset($_SESSION['invite_error']); 
} 

ただし、このページから離れて戻ってきても、エラーメッセージは表示されています。私が離れてもう一度戻ると、それは完了します。私はそのページをリフレッシュするときと同じです... 1リフレッシュはそれを取り除くことはありませんが、2はそれを取り除きます。私はセッション全体を破壊することはできません、私はちょうどこの1つの変数を解除したいです。 PHPのバージョンは5.2.5ビルド6、レジスタグローバルはオフです、私はこのページの一番上にsession_start()を呼び出していますが、ノーキャッシュヘッダも使ってみました。

編集:完全なコードを追加しました。

<?php 
ob_start(); 
session_start(); 

$user_id = $_SESSION['user_id']; 
$user_name = $_SESSION['user_name']; 

if ($user_id==null) header("Location: /login.php"); 

if (isset($_SESSION['invite_errors'])) { 

    $error = $_SESSION['invite_errors']; 
    unset($_SESSION['invite_errors']); 

} 

require_once("ui/header.php"); 
?> 



<div id="invite" class="content"> 

    <?php if($error) { ?> 
     <div class="errors round"> 
      <?php echo $error ?> 
     </div> 
    <?php } ?> 

    <h3>Invite Your Friends</h3> 

    <div class="invite-form"> 
     <form method="post" action="controllers/invite.php"> 
      <div class="row"> 
       <textarea class="txt-area" name="emails" id="emails" rows="5"></textarea> 
       <div class="tip">Separate multiple email addresses with ,</div> 
      </div> 
      <div class="row-submit"> 
       <input type="submit" name="submit" id="submit" class="submit-btn" value="Submit" /> 
      </div> 
     </form> 
    </div> 

</div> 

<?php 
    require_once("ui/footer.php"); 
?> 
+0

未設定($ _ SESSION ['invite_error']; =>未設定の権利)はありません。私はそれがコピーの貼り付けの問題だと思います。 – Macarse

+0

リクエストのどこにAJAXを使用していますか? –

+0

エラーは$ _SESSION varを設定解除する前に設定されている別の変数にある可能性がありますか? – alex

答えて

2

あなたが指定した例はうまくいくはずです。おそらく、何らかの種類のセッションキャッシュがあなたのやり方になっているでしょう。あなたは、次のようにコードを修正してみてください:

if (isset($_SESSION['invite_errors']) && $_SESSION['invite_errors']) { 

    $error = $_SESSION['invite_errors']; 
    $_SESSION['invide_errors'] = false; 
    unset($_SESSION['invite_errors']); 

    // Explicitly write and close the session for good measure 
    session_write_close(); 

} 
1

はたぶん、あなたは出力バッファリングを開始する前にセッションを開始し、エラー

if (isset($_SESSION['invite_error'])) { 
    echo $_SESSION['invite_error']; 
    $_SESSION['invite_error'] = null; 
    unset($_SESSION['invite_error']); 
} 
13

をecho'ing後の値を変更することができます。したがって、ob_start()session_start()コールを切り替えます。

ブラウザに送信されたヘッダーにセッションCookieが定義されているため、バッファを開始するときにヘッダーがブラウザに送信されるため、より前にセッションを開始する必要があります。

+0

ob_start()を実行したときにブラウザにHTTPヘッダーを送信すると、出力バッファリングの主なポイントが無効になります。なぜそれがそうであると言いますか?さらに、それをしても、この文脈では何の違いもありません。なぜ偽りの声明に基づいて非sequiturは、この多くのupvotesを取得しましたか? –

1

私の経験では、PHPセッションは価値がありませんし、すばやく簡単なソリューションとして設計されています。 $ _SESSIONの動作は必ずしも明らかではありませんが、従来の意味でのセッションの使用はほとんど不可避です。あなた自身のidとトークンのクッキーを発行し、セッションの値をデータベースに格納します。これには、サーバー間でスケーラビリティがあるという利点もあります。

関連する問題