1

ページに再度アクセスした場合でも、ページを送信するまで、設定されている 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 が設定されていません。

  1. コードはprint_r.

  2. コードが 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_REGCookie が検出され、サンキュー ページを表示するように変数が設定されます$display

ブラウザを閉じた後のページへのその後のアクセス

フォームが送信されてから 1 か月以内であれば、$COOKIE_RETURNCookie が検出され、$DISPLAY_HIDDENページが描画されます。1 か月が経過した場合、そのページは最初の訪問であるかのように扱われます。

4

0 に答える 0