Переход через header не работает

Suhoy571

Здравствуйте! Такая проблема не работают переходы через header, сам код работает, выдает ошибки и регистрирует.

Текст ошибки: Warning: Cannot modify header information - headers already sent by (output started at E:\Programmes\OpenServer\OSPanel\domains\Registr\views\layouts\header.php:1) in E:\Programmes\OpenServer\OSPanel\domains\Registr\scripts\registration.php on line 85

Сам код: registration.php

<!--?php

$userName = $password = $email = "";
$userNameErr = $passwordErr = $emailErr = "";

ob_start();

require_once '../database/config.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty(trim($_POST["name"]))) {
    $userNameErr = 'Вы не ввели имя пользователя.';
} else {
    $sql = "SELECT id FROM users WHERE name = :username";

    if ($stmt = $db--->prepare($sql)) {
        $stmt->bindParam(':username', $paramUsername, PDO::PARAM_STR);

        $paramUsername = trim($_POST["user"]);

        if ($stmt->execute()) {
            if ($stmt->rowCount() == 1) {
                $userNameErr = 'Такой логин уже занят';
            } else {
                $userName = trim($_POST["name"]);
            }
        } else {
            print 'Ошибка';
        }
    }
    unset($stmt);
}

if (empty(trim($_POST["password"]))) {
    $passwordErr = 'Введите пароль';
} elseif
(preg_match('/^[_!)(.a-z\d]{6,16}$/i', $_POST["password"]) == false) {
    $passwordErr = 'Только латинские буквы, минимальная длина - 6, максимальная - 16';
} else {
    $password = trim($_POST['password']);
}

if (empty(trim($_POST['email']))) {
    $emailErr = 'Введите электронную почту.';
} elseif (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) == false) {
    $emailErr = 'Почта не прошла валидацию.';
} else {
    $email = trim($_POST['email']);
}

if (empty($userNameErr) && empty($passwordErr) && empty($emailErr)) {
    $sql = "INSERT INTO users (email, name, password) VALUES (:email, :name, :password)";

    if ($stmt = $db->prepare($sql)) {
        $stmt->bindParam(':email', $paramEmail, PDO::PARAM_STR);
        $stmt->bindParam(':name', $paramUsername, PDO::PARAM_STR);
        $stmt->bindParam(':password', $paramPassword, PDO::PARAM_STR);

        $paramEmail = $email;
        $paramUsername = $userName;
        $paramPassword = password_hash($password, PASSWORD_DEFAULT);

        if ($stmt->execute()) {
            echo <<<__HTML__
                
    __HTML__;
            header('Location: login.php'); //Переход на вход
        } else {
            print 'Error';
        }
    }
    unset($stmt);
}

unset($db);
}

Файл с HTML:

<!--?php
require_once("layouts/header.php");
require_once('../scripts/registration.php');
?-->
<div class="register-form">
    <div class="container">
        <form action="<?php echo htmlspecialchars($_SERVER[" php_self"]);="" ?="">" method="post" >
            <div class="form-group <?php echo (!empty($userNameErr)) ? 'has-error' : ''; ?>">
                <label>Логин</label>
                
                
            </div>
            <div class="form-group <?php echo (!empty($emailErr)) ? 'has-error' : ''; ?>">
                <label>Email</label>
                
                
            </div>
            <div class="form-group <?php echo (!empty($passwordErr)) ? 'has-error' : ''; ?>">
                <label>Пароль</label>
                
                
            </div>
            <button type="submit" name="Submit" class="btn btn-primary">Зарегистрироваться</button>
            <p>Уже зарегистрированы? <a href="login.php">Войти здесь</a>.</p>
        </form>
    </div>
</div>

<!--?php
require_once ('layouts/footer.php')
?-->
2 ответа

Suhoy571

Проверьте как вы сохранили файл. Если в кодировке utf-8 c BOM, то пересохраните без него. Так же посмотрите, чтобы небыло пустых символов перед тегом < ?php

Кстати да, вам в комментарии правильно указали: header должен идти до всех выводов (echo выводов, html тегов, пустых строк). А у вас в файле прямо перед ним вывод echo.


Suhoy571

Проблема решилась изменением параметра output_buffering = 0 на output_buffering = 4096 в файле php.ini. После измениения не забудьте перезагрузить сервер!

licensed under cc by-sa 3.0 with attribution.