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

269
23 марта 2018, 11:32

Здравствуйте! Такая проблема не работают переходы через 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__
                <script>alert('Вы зарегистрированы.')</script>
    __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> 
                <input name="name" type="text" class="form-control" id="name" placeholder="Введите имя" 
                       value="<?php echo $userName; ?>"> 
                <span class="help-block"><?php print $userNameErr; ?></span> 
            </div> 
            <div class="form-group <?php echo (!empty($emailErr)) ? 'has-error' : ''; ?>"> 
                <label>Email</label> 
                <input name="email" type="email" class="form-control" id="email" placeholder="Введите email" 
                       value="<?php echo $email; ?>"> 
                <span class="help-block"><?php print $emailErr; ?></span> 
            </div> 
            <div class="form-group <?php echo (!empty($passwordErr)) ? 'has-error' : ''; ?>"> 
                <label>Пароль</label> 
                <input name="password" type="password" class="form-control" id="password" placeholder="Введите пароль" 
                       value="<?php echo $password; ?>"> 
                <span class="help-block"><?php print $passwordErr; ?></span> 
            </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') 
?>

Answer 1

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

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

READ ALSO
Определение значения checkbox

Определение значения checkbox

Как определить, поставил пользователь галочку на checkbox или же убрал ее? (Если ставит должно устанавливаться значение aacept = true; , а если убирает...

269
DOM, удалить дочерний узел

DOM, удалить дочерний узел

Надо добавлять и удалять узлы в divДобавлять могу а удалять нет

205
Приходит сообщение с пустым файлов

Приходит сообщение с пустым файлов

Все добрый вечер Решил разобраться с формой отправки файла без перезагрузки, я во всем этом новичок, он не смотря на это получилось отправить...

220