@some_idk

Проблемы с созданием cookie?

Написал простую регистрацию и авторизацию, которая создает куки, при этом в шапке всегда проверяется есть ли куки и если они есть - показывает имя пользователя, но появилась такая вещь, что при авторизации выдает ошибку:
Warning: Cannot modify header information - headers already sent by (output started at site.ru/includes/header.php:1) in site.ru/login_check.php on line 21

Код с получение куки header.php
<?php
                    if(isset($_COOKIE["id"])) {
                        echo "
                        <div class=\"btn-group\" style=\"margin-right: 10%;\">
                            <div class=\"dropdown\">
                                <a class=\"btn btn-light\" href=\"#\" data-toggle=\"dropdown\" aria-expanded=\"false\">
                                    " . $_COOKIE["nick"] . "
                                    <img src=\"./images/no_avatar.png\" class=\"noavatar\" alt=\"\" loading=\"lazy\">
                                </a>
        
                                <div class=\"dropdown-menu\" aria-labelledby=\"dropdownMenuLink\">
                                    <a class=\"dropdown-item\" href=\"./ucp/notifications.php\">Пункт уведомлений</a>
                                    <a class=\"dropdown-item\" href=\"./ucp/index.php\">Управление аккаунтом</a>
                                    <div class=\"dropdown-divider\"></div>
                                    <a class=\"dropdown-item\" href=\"./exit.php\" style=\"color: red;\">Покинуть систему</a>
                                </div>
                            </div>
                        </div>";
                    } else {
                        echo "<a type=\"button\" class=\"btn btn-light\" href=\"login.php\" style=\"color: rgba(0,0,0,.5);\">Авторизация</a> <a type=\"button\" class=\"btn btn-light\" href=\"/register.php\" style=\"margin-right: 10%; color: rgba(0,0,0,.5);\">Регистрация</a>";
                    }
                ?>


Код из login-check.php
<?php 
    include("includes/header.php");
    include("includes/db_connect.php");

    if (isset($_POST['nickname'])) { $nickname = $_POST['nickname']; if ($nickname == '') { unset($nickname);} }
    if (isset($_POST['pass'])) { $pass = $_POST['pass']; if ($pass == '') { unset($pass);} }

    $nickname = stripslashes($nickname);
    $nickname = htmlspecialchars($nickname);
    $pass = stripslashes($pass);
    $pass = htmlspecialchars($pass);

    $query = "SELECT * FROM users WHERE nickname = '$nickname'";
    $result = mysqli_query($link, $query);
    $row = mysqli_fetch_row($result);

    if (empty($row[5])) exit ("<div class=\"content red\" style=\"text-align: center; padding-top: 0.01em;\">
    <p style=\"margin-bottom: 0; color: white;\">Введённое имя пользователя или пароль неверные</p>
    <a href=\"javascript:history.go(-1);\">Вернутся назад</a></div>");

    setcookie("id", $row[0]);
    setcookie("nick", $row[2]);

    include("includes/footer.php");
?>
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
dyuriev
@dyuriev
A posteriori
Каждый день одно и тоже
  1. Открываем официальную документацию: header();
  2. Офигиваем, что она доступна на русском
  3. Читаем:
    Помните, что функцию header() можно вызывать только если клиенту ещё не передавались данные. То есть она должна идти первой в выводе, перед её вызовом не должно быть никаких HTML-тегов, пустых строк и т.п. Довольно часто возникает ошибка, когда при чтении кода файловыми функциями, вроде include или require, в этом коде попадаются пробелы или пустые строки, которые выводятся до вызова header(). Те же проблемы могут возникать и при использовании PHP/HTML в одном файле.
  4. Ищем, какой вывод попал перед отправкой заголовков


А так же, в конце то концов, внимательно читаем ошибку:
Cannot modify header information - headers already sent by
Вольный перевод:
Невозможно изменить заголовки, так как они уже отправлены


- Но у меня же нет header()! - скажете вы
- А хрен там, есть!

Открываем еще одну интересную страницу: setcookie();

И читаем там:
setcookie() задаёт cookie, которое будет передано клиенту вместе с другими HTTP-заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться до остального вывода, включая вывод тегов <html> и <head>, а также пустые строки и пробельные символы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы