トップへ(mam-mam.net/)

setcookieでクッキーを設定しても$_COOKIE変数に設定されない

検索:

「setcookieでクッキーを設定しても$_COOKIE変数に設定されない」

setcookie("a", time()+3600, "/");
echo $_COOKIE["a"];

を実行すると
Notice: Undefined index: a in a.php on line 2
エラーが表示され、
setcookieでクッキーを設定しても$_COOKIE変数に設定されていない。

回答

1つのリクエストで、setcookieでクッキーを設定しても$_COOKIE変数に即時に値は設定されていません。
ただし1つ目のリクエストでsetcookieでクッキーを設定すると、次のリクエスト時には$_COOKIE変数に値が設定されています。
これはPHPの仕様です。

ソース

test.php
------------------------------------------------------------
<?php
if(isset($_COOKIE["a"])){
  $a=$_COOKIE["a"]+1;
}else{
  $a=1;
}
//ここでクッキーに$iの値を設定している
setcookie("a", $a, time()+3600, "/");
//$aとクッキーは同じ値になるはずだが実際は違う値になる。
echo "\$a=".$a." : \$_COOKIE[\"a\"]=".$_COOKIE["a"];
?>
------------------------------------------------------------
上記test.phpをブラウザで実行してF5キーを何度か押すと、$aと$_COOKIE["a"]は1ずれて表示されます。
$a=1 , $_COOKIE["a"]=
$a=2 , $_COOKIE["a"]=1
$a=3 , $_COOKIE["a"]=2
・・・

1つのリクエストでsetcookieでクッキーが更新されるが、$_COOKIEは更新されない。
同一リクエストで変更されたクッキーの値を使用する場合は
setcookieでクッキーを設定したら$_COOKIE変数にも同じ値を設定する必要があります。

--------------------------------------------------------
$a=1;
setcookie("a", $a, time()+3600, "/");
$_COOKIE["a"]=$a;
echo "\$a=".$a." , \$_COOKIE[\"a\"]=".$_COOKIE["a"];
--------------------------------------------------------
上記を実行すると
$i=1 , $_COOKIE["a"]=1

となります。