PHP – setcookie () не работает

У меня есть эта страница, которая устанавливает cookie и echos из строки, если вы установите флажок. Строка правильно печатается, но cookie никогда не устанавливается, и я понятия не имею, почему.

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post"> <label for="checkbox">Option 1:</label> <input type="checkbox" name="checkbox" id="checkbox"><br> <input type="submit" name="submit" value="Submit"> </form> <?php if (isset($_POST['checkbox'])) { setcookie("cookie", "on", time()+3600*24); echo "You checked the checkbox and a cookie was set with a value of:<br>"; } else { setcookie("cookie", "off", time()+3600*24); echo "You didn't check the checkbox and a cookie was set with a value of:<br>"; } echo $_COOKIE['cookie']; ?> 

Кто-нибудь знает, почему приведенный выше код не работает?

PHP-суперглобалы заполняются во время запуска скрипта, а затем не изменяются или не затрагиваются PHP еще раз для жизни скрипта. Это означает, что $_COOKIE представляет файлы cookie, которые были отправлены на сервер в HTTP-запросе, который $_COOKIE скрипт. Он не будет показывать файлы cookie, которые вы добавили / изменили / удалили в течение срока действия скрипта. Эти изменения будут отображаться только по запросу NEXT.

Единственное исключение – $_SESSION , которое заполняется при вызове session_start() .

Если вам нужно, чтобы эти значения были в $ _COOKIE немедленно, вам придется добавлять их вручную, например

 setcookie('cookie', $value, ....); $_COOKIE['cookie'] = $value; 

Куки-файлы не срабатывают до тех пор, пока они не будут установлены, и будет отправлен новый запрос страницы. Это связано с тем, что файлы cookie отправляются с запросами страниц, они просто не волшебным образом отображаются на сервере.

Ваше решение – обновить страницу после установки файла cookie.

 // set cookie setcookie("cookie", "off", time()+3600*24); // not available because this cookie was not sent with the page request. echo $_COOKIE['cookie']; 

Согласно Руководству PHP в http://php.net/manual/en/function.setcookie.php :

Если выход существует до вызова этой функции, setcookie () завершит сбой и вернет FALSE . Если setcookie () успешно запущен, он вернет TRUE . Это не означает, принял ли пользователь cookie.

Другими словами, функция setcookie() не работает, потому что она находится внутри страницы. Если вы хотите, чтобы он работал, вам нужно будет поставить эту функцию перед страницей, особенно перед любыми заголовками.

Сделай это:

 <?php if ( isset($_POST['checkbox']) ) { setcookie("cookie", "on", time()+3600*24); echo "You checked the checkbox and a cookie was set with a value of:<br>"; } else { setcookie("cookie", "off", time()+3600*24); echo "You didn't check the checkbox and a cookie was set with a value of:<br>"; } echo $_COOKIE['cookie']; ?> <!doctype html> <html> <head>...</head> <body> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post"> <label for="checkbox">Option 1:</label> <input type="checkbox" name="checkbox" id="checkbox"><br> <input type="submit" name="submit" value="Submit"> </form> </body> </html>