ページに再度アクセスした場合でも、ページを送信するまで、設定されている Cookie が読み取られないという問題があります。
基本的に、ページに小さなフォームがあります。ページが送信されてプロセスが完了すると、2 つの Cookie が設定されます。1 つ目はブラウザ セッションで期限切れになり、ページに感謝のメッセージを表示するように指示します。2 つ目は 1 か月で期限切れになり、ページに別のメッセージを表示するように指示します。適切な Cookie が見つからない場合、ページはデフォルトでフォームを表示します。
上記の上DOCTYPE
に、Cookie を検索し、正しいページを表示する変数を設定する次のコードがあります。
$display = $DISPLAY_FORM;
if ((!empty($_COOKIE[$COOKIE_RETURN])) && ($_COOKIE[$COOKIE_RETURN] == $COOKIE_RETURN))
{
// If a return visitor, show DISPLAY_HIDDEN
$display = $DISPLAY_HIDDEN;
}
if ((!empty($_COOKIE[$COOKIE_REG])) && ($_COOKIE[$COOKIE_REG] == $COOKIE_REG))
{
// If a new registration, show DISPLAY_THANKS
$display = $DISPLAY_THANKS;
}
それに続いて、フォームをチェックして処理するロジックがあります。すべてが正しければ、2 つの Cookie が設定され、$display
変数が$DISPLAY_THANKS
setcookie($COOKIE_REG, $COOKIE_REG, 0, "/");
setcookie($COOKIE_RETURN, $COOKIE_RETURN, strtotime("+1 month"), "/");
$display = $DISPLAY_THANKS;
コードはサブディレクトリで実行されているため、私の理解では、"/"
パスを使用すると、Cookie がサイト全体に表示されるはずです。$COOKIE_REG
同じ名前と値の Cookie を設定する必要があります。この Cookie は、ブラウザーを閉じると期限切れになります。$COOKIE_RETURN
同じ名前と値の Cookie を設定し、1 か月で有効期限が切れる必要があります。
これはすべてDOCTYPE
要素の前にあり、Cookie が設定されているときにエラーはスローされません。このページには、変数をチェックして表示する状態を確認BODY
する単純な phpif
ステートメントがあります。$display
初めてページを使用すると、フォームが表示されます。フォームに入力して送信すると、ページがお礼のメッセージに戻ります。すべては順調です。しかし、クリックしてサイトの別のページに移動し、再度 Cookie ページに移動すると、お礼のメッセージではなく、フォームが表示されます。ブラウザーを閉じて (最初の Cookie を終了する必要があります)、ページに戻ると、もう一度フォームが表示されます。
このことから、Cookie が設定されていないようです。ただし、setcookie
コードと Cookie 読み取りif
ステートメントの前に、 を追加しましecho print_r($_COOKIE, true);
た。私のページへの最初のアクセスでは、期待される Cookie は表示されませんでしたが、フォームを送信すると表示されます。この送信では、次のように Cookie が設定されていません。
コードは
print_r
.コードが Cookie を出力していたとしても
$_COOKIE
、次にページにアクセスするまで配列に表示されません。
初めてのprint_r
返品
Array
(
[17a7190f9ad90db58025cb2dea23788f] => 73fcd0caf5e997e47097a4eade799c59
)
2回目、フォームを送信した後、それが返されます
Array
(
[returnVisitor] => returnVisitor
)
どんな助けでも素晴らしいでしょう。
--- 編集 - 以下にメインコード本体を追加 ---
<?php
// These variables define what is displayed on the page.
$DISPLAY_HIDDEN = 0;
$DISPLAY_FORM = 1;
$DISPLAY_THANKS = 2;
// This variable is where the display type is set, it defaults to show the form
$display = $DISPLAY_FORM;
// Cookie variables
$COOKIE_REG = "formComplete";
$COOKIE_RETURN = "returnVisitor";
// echo print_r($_COOKIE, true);
// Check for a cookie to see if the form has been completed already.
// If there is a cookie, check to see if it's a new registration cookie or a return visitor
if ((!empty($_COOKIE[$COOKIE_REG])) && ($_COOKIE[$COOKIE_REG] == $COOKIE_REG))
{
// If a new registration, show DISPLAY_THANKS
$display = $DISPLAY_THANKS;
}
else if ((!empty($_COOKIE[$COOKIE_RETURN])) && ($_COOKIE[$COOKIE_RETURN] == $COOKIE_RETURN))
{
// If a return visitor, show DISPLAY_HIDDEN
$display = $DISPLAY_HIDDEN;
}
// If no cookie exists, check to see if the form has been submitted
else if ( !empty($_REQUEST['formSubmit']) )
{
// -- REMOVED FOR STACK OVERFLOW - Processes form data --
// Create and set 2 cookies
// Cookie 1: Expires when the browser closes and is for new registrants
setcookie($COOKIE_REG, $COOKIE_REG, 0, "/");
// Cookie 2: Expires in a month and is for returning visitors
setcookie($COOKIE_RETURN, $COOKIE_RETURN, strtotime("+1 month"), "/");
// Set the page to display the thanks screen
$display = $DISPLAY_THANKS;
}
?>
<!DOCTYPE html>
<html lang="en-gb">
<head>
-- REMOVED FOR STACK OVERFLOW --
</head>
<body>
<?php if ($display == $DISPLAY_FORM) { ?>
--- REMOVED FOR STACK OVERFLOW - This is where the form is drawn. ---
<?php } else if ($display == $DISPLAY_THANKS) { ?>
--- REMOVED FOR STACK OVERFLOW - This is where the thank you message is drawn. ---
<?php } else if ($display == $DISPLAY_HIDDEN) { ?>
--- REMOVED FOR STACK OVERFLOW - This is where the returning visitor message is drawn. ---
<?php } // endif ?>
</body>
</html>
期待される動作
ページへの最初の訪問
Cookie が設定されておらず、フォームが送信されていないため、フォームを表示するデフォルトのオプションが使用されます。期待どおりに動作します
フォーム送信によるページへの 2 回目のアクセス
Cookie は設定されていませんが、フォームは送信されています。フォーム データが処理され、Cookie が設定され、内部$display
変数がありがとうメッセージを表示するように指示されます。期待どおりに動作するようです
ブラウザが閉じられるまでのページへの後続のアクセス
$COOKIE_REG
Cookie が検出され、サンキュー ページを表示するように変数が設定されます$display
。
ブラウザを閉じた後のページへのその後のアクセス
フォームが送信されてから 1 か月以内であれば、$COOKIE_RETURN
Cookie が検出され、$DISPLAY_HIDDEN
ページが描画されます。1 か月が経過した場合、そのページは最初の訪問であるかのように扱われます。