Поэтому я попробовал несколько других «решений» своей проблемы (как на этом сайте, так и на других) и не могу найти решение, которое работает для меня.
Я пытаюсь установить cookie для входа в систему моего пользователя, а затем при выходе удалить этот cookie. Вот мой код
list ($check, $data) = check_login($dbc, $_POST['Username'], $_POST['Password']);
if ($check) {
setcookie('Username', $data['Username'], time() + 60*60*24*90);
header('Location: RedirectPage.php');
Который проверяет, что имя пользователя и пароль были введены в форму входа в систему (и приняты). Если это так, файл cookie «Имя пользователя» устанавливается с именем пользователя, полученным из базы данных, и временем, равным 90 дням, и затем пользователь перенаправляется ,
Эта часть работает нормально, она регистрирует пользователя, как и следовало ожидать.
Однако в части удаления,
header('Refresh: 0;');
setcookie('Username', '', time() - 60*60*24*90);
unset($_COOKIE['Username']);
require ('RedirectPage.php');
redirect_user();
Я удаляю cookie таким же образом, как он был установлен, как и ожидалось, удаляя любые данные и устанавливая время в отрицательное значение, а затем для хорошей меры я запускаю неустановленный cookie, чтобы убедиться, что он исчез.
За исключением того, что это не работает. setcookie (для удаления) ничего не делает, а unset cookie работает только на странице после того, как он был запущен (в данном случае index.php), и как только я нажимаю на другую страницу или обновляю страницу, которую он «забывает» что cookie был удален.
Теперь перейдем к элементу проверки Chrome, чтобы проверить куки, которые я получаю.
Username, "Value" (the withdrawn username), r3gamers.com (domain), / (path), 2015-02-03T13:45:00 (Expires/MaxAge), 19 (Size) and HTTP and Secure are both set as empty.
Наблюдая за процессом после нажатия кнопки выхода, этот файл cookie никогда не удаляется. Единственное, что действительно может удалить cookie — это перезаписать его новым cookie (войти снова) или удалить его с помощью элемента inspect.
Есть идеи? Насколько я знаю, я делаю все, что должно быть сделано.
РЕДАКТИРОВАТЬ:
Я также хотел бы отметить, что при тестировании на локальном хосте, в автономном режиме через netbeans, эта функция работает. Однако, когда я загружаю страницы в Godaddy для моего сайта, они перестают работать должным образом.
Я нашел ответ. Это тоже глупый ответ. Вот файл полного кода, который я использовал для выхода из системы.
<?php
require_once ('Connection.php');
header('Refresh: 0;');
if (!isset($_COOKIE['Username'])){
header('Location: LoginFunctions.php');
} else {
setcookie('Username', '', time()-60*60*24*90, '/', '', 0, 0);
unset($_COOKIE['Username']);
header('Location: index.php');
}?>
Проблема, которую я не могу показать здесь, заключалась в том, что у открывающего тега php был один разрыв строки, то есть он начинался со строки 2. Почему изначально так было, я не знаю, но эта маленькая ошибка означала что это работает на localhost и не работает на godaddy. Как расстраивает. По крайней мере, я исправил проблему сейчас.
Для будущего использования, для тех, кто застрял с той же проблемой, очевидно, что godaddy (или большинство хостинговых сайтов) требуют, чтобы любое добавление, редактирование или удаление файлов cookie происходило со строки 1 и далее, поэтому тег php, который включает файл cookie, должен находиться в строке 1, нет HTML-код может предшествовать этому тегу php, или любые разрывы строк, тег php должен начинаться со строки 1.
Вы не устанавливаете путь к вашему куки, я предполагаю, что вы хотите, чтобы он был для всего сайта, поэтому вы должны установить путь к ‘/’:
setcookie('Username', $data['Username'], time() + 60*60*24*90, '/');
А затем, когда отключите его, попробуйте использовать 1 вместо time() - 60*60*24*90
(также по-прежнему указывается путь), в противном случае время истечения срока действия куки может варьироваться в зависимости от часов компьютера пользователя:
setcookie('Username', '', 1, '/');
Я думаю, что ваша проблема на самом деле заключается в том, что путь не установлен: http://php.net/manual/en/function.setcookie.php
Если установлено значение «/», файл cookie будет доступен во всем домене. Если установлено значение «/ foo /», файл cookie будет доступен только в каталоге / foo / и во всех его подкаталогах, таких как / foo / bar / домена. Значением по умолчанию является текущий каталог, в котором устанавливается cookie.
Дело в том, что если вы находитесь в /logout/doit.php и пытаетесь установить время истечения срока действия cookie на отрицательное значение, оно создаст новый файл cookie с путем ‘/ logout /’ и установит время его истечения. (Вместо того, чтобы устанавливать срок действия файла cookie вашего сайта)