0

Делаю админку на сайте,после ввода правильно логина\пароль нужно логинить пользователя создавая cookie,но натыкаюсь на вот такую ошибку

Cannot modify header information - headers already sent by (output started at my path) in my path on line 54.

Знаю что это из-за каких то там заголовков,и знаю,что это можно решить если проверять форму и логинить пользователя в отдельном файле,но мне жуно все это делать в том же файле,в котором находиться сама форма,как быть?
Об sql уязвимости знаю :)
Вот код:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Title</title>

    <link rel="stylesheet" href="src/css/reset.css">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <link rel="stylesheet" href="../src/css/style.css">
    <!-- fonts -->
    <link href="https://fonts.googleapis.com/css?family=Noto+Sans|Open+Sans|Roboto&display=swap&subset=cyrillic" rel="stylesheet">
</head>
<body>

    <svg style="display: none;">
        <symbol id="question" viewBox="0 0 31.357 31.357">
            <path d="M15.255,0c5.424,0,10.764,2.498,10.764,8.473c0,5.51-6.314,7.629-7.67,9.62c-1.018,1.481-0.678,3.562-3.475,3.562
            c-1.822,0-2.712-1.482-2.712-2.838c0-5.046,7.414-6.188,7.414-10.343c0-2.287-1.522-3.643-4.066-3.643
            c-5.424,0-3.306,5.592-7.414,5.592c-1.483,0-2.756-0.89-2.756-2.584C5.339,3.683,10.084,0,15.255,0z M15.044,24.406
            c1.904,0,3.475,1.566,3.475,3.476c0,1.91-1.568,3.476-3.475,3.476c-1.907,0-3.476-1.564-3.476-3.476
            C11.568,25.973,13.137,24.406,15.044,24.406z"/>
        </symbol>
    </svg>

    <?php require_once "includes/header.php";?>

    <?php
        if(isset($_POST['do_auth'])) {
            $username = $_POST['username'];
            $password = $_POST['password'];

            if ($username == '') {
                $error = 'Incorrect username or password';
            }

            else if($password == '') {
                $error = 'Incorrect username or password';
            } 
            // No error
            else {
                $user = $connection->query("SELECT * FROM `admins` WHERE `username` = '$username'");

                if(mysqli_num_rows($user) == 0) {
                    $error = 'Incorrect username or password';

                } else {
                    $user = mysqli_fetch_assoc($user);

                    if( !password_verify($password, $user['password']) ){
                        $error = 'Incorrect username or password';
                    } else {
                        // Access!
                        setcookie('user', $_POST['username'], 300, '/');
                    }
                }
            }
        }
    ?>

    <?php

    if (isset($_COOKIE['user'])) { ?>
            <input type="submit" class="btn btn-access" value="Access!">
    <?php } else { ?>

    <section class="blog">
        <div class="container">
            <div class="row justify-content-center">
                <form action='<?=$_SERVER["SCRIPT_NAME"]?>' method='POST' class="col-4">
                    <h4 style="color: #333;">Log in</h4>
                    <h6 style="color: red;"><?=$error?></h6>
                    <input type="text" name="username" placeholder="username" class="form-control" value="<?=$_POST['username']?>"><br>
                    <input type="password" name="password" placeholder="password" class="form-control"><br>
                    <input type="submit" name="do_auth" value="Log in" class="btn btn-success">
                </form>
            </div>
        </div>
    </section>

    <?php }?>
    <!-- Bootstrap -->
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

</body>
</html>
Denis640Kb
  • 14,089
daladn0
  • 356

1 Answers1

0

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

php.net

Knyaz71
  • 656
  • 4
  • 6