2011-11-14 11 views
0

PHPでCookieを使用してセッション管理をセットアップしようとしています。 次のように私のコードは次のとおりです。Firefoxで履歴を消去した後、Cookieを初めて設定することはできません

if(empty($_COOKIE)) { 
    setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT)); 
    } 
    $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0; 

私はその後、0 SESSION_IDをチェックし、Cookieが無効になっている場合は、エラーメッセージを出力します。 クッキーが実際に無効になっている場合、これは正常に動作します。

問題は、ユーザーが初めて にアクセスしたときに、Cookieが有効になっていてもエラーメッセージが表示されるという問題です。

誰でもこれについての手がかりはありますか? ありがとうございます

答えて

1

setcookie呼び出しを実行すると、ヘッダーがブラウザに出力されたときにCookieが送信されます。つまり、次のページが読み込まれるまで(クライアントがクッキーをサーバーに送り返すまで)、クッキーは使用できなくなります。これはますsetcookie http://php.net/manual/en/function.setcookie.phpためのPHPマニュアルに記載されている:

ますsetcookie()は、HTTPヘッダーの残りの部分と一緒に送信するクッキーを定義します。他のヘッダーと同様に、スクリプトからの出力の前にクッキーを送信する必要があります(これはプロトコルの制限です)。これには、タグや空白を含む出力の前に、この関数を呼び出す必要があります。

クッキーが設定されると、の次のページにアクセスできます。には$ _COOKIEまたは$ HTTP_COOKIE_VARSの配列があります。 $ _COOKIEのようなスーパーグローバルは、PHP 4.1.0で利用可能になったことに注意してください。クッキー値は$ _REQUESTにも存在します。

ページがリロードされるまで(phpから)Cookieが有効か無効かを判断することはできません。私はJavaScriptでこのチェックを行う必要があると思う、またはPHPに滞在し、初めてのクッキーを設定した後のようなものリダイレクトを実行します。

if(empty($_COOKIE)) { 
      if (isset($_GET['cookieset'])) { 
        // do error message, cookie should be set 
      } 
      setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT)); 
      header('location: http://mysite.com/index.php?cookieset=1'); 
      exit; 
    } 
    $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0; 
+0

クッキーが無効になっていると、ユーザーは常にindex.phpにリダイレクトされます。そのため、ループに巻き込まれます。とにかく$ _GET変数を使わないでチェックするのですか? – user1045922

+0

index.phpにリダイレクトする必要はありません。$ _SERVER ['REQUEST_URI']を使用して現在のページにリダイレクトすると、ユーザーが現在いるページを取得できます。または、エラーを表示する別のページにリダイレクトできるエラーを表示するか、エラーを表示して処理を停止するように言いました。それはあなたがしたいことによって異なります。 – bencoder

0

@bencoder:私はiPad上でテストを行っているがChrome/PC:あなたはiPadに適していますが、Cookieデータを読む前にページを更新する必要がありますが、Chrome/PCではすべてのCookieを削除した後、PHPから新しいものを設定すると、最初のページの読み込み時の値。どうして ?もっと正確な説明が必要です。なぜ2つの異なる行動ですか?この出力/データの可用性の順序は、サーバーへのブラウザー要求によって異なりますか?興味深いことに...

関連する問題