Заголовок PHP дает мне ошибку

1

Прежде всего, не думайте, что это вопрос о нем. Я пробовал все решения, но мне ничего не помогает.

Я получаю следующую ошибку: "Невозможно изменить информацию заголовка - уже отправленные заголовки (вывод запущен в /home/gogiavag/public_html/maxkapital/user.php:7) в /home/gogiavag/public_html/maxkapital/func.php в режиме онлайн 4"

Все страницы, которые я преобразовал в utf8 (без спецификации). У меня нет начального пространства в начале, но, кроме того, ничего не помогает.

Вот мой код:

login.php

<?php session_start();?> 
 <html>
 <head>
 <meta charset="utf-8" /> 
 <link rel="stylesheet" type="text/css" href="style.css"/>
 </head>    
 <body>
 <?php include "header.php"; require_once 'func.php';?> 
    <form method="POST" action="user.php">
    <table style="margin-top: 10px;">
    <tr>
    <td><label for ="txtuser">name:</label></td>
    <td><input type="text" style="padding:5px;" id="txtuser" name="txtuser" value="<?php if (isset($_SESSION['txtuser'])
    ){echo $_SESSION['txtuser'];}else{echo '';} ?>"  </input></td>
    </tr>
    <tr>
    <td><label for ="txtpassword">password:</label></td>
    <td><input type="password" style="padding:5px;" id="txtpassword" name="txtpassword"> </input></td>
    </tr>

    <tr>
    <td></td>
    <td><input type="submit" value ="Enter" style="padding:5 55 5 55;background-color:#3f4194;color:#fff;" name="btnsubmit" id="btnsubmit"> </td>
    </tr>   

    </table>    
    </form>

    <?php 
    if (isset($_SESSION['err'])){
        if ($_SESSION['err']===true){
            echo gg_stringformat("<img src='error.png' style='margin-left:50px;'><img/> <span style='font-size:10pt; color:#ff0000'>{0}</span>",     $_SESSION['errmsg']);
        }   
    }

    if(isset($_SESSION['err'])){unset ($_SESSION['err']);};
    if(isset($_SESSION['errmsg'])){unset ($_SESSION['errmsg']);};
    if(isset($_SESSION['txtuser'])){unset ($_SESSION['txtuser']);};
    if(isset($_SESSION['txtpassword'])){unset ($_SESSION['txtpassword']);};
    ?>

</body> 

</html>

user.php

<?php session_start();?>
<html>
<head>
<meta charset="utf-8"/> 
</head>
<body>
<?php require_once'func.php';
if (!isset($_POST['btnsubmit'])){
    gg_redirect('block.php');
    exit;
}
$user=$_POST['txtuser'];
$pass=$_POST['txtpassword'];
$_SESSION['txtuser'] = $user;
$_SESSION['txtpassword'] = $pass;
if (gg_trim($user)===''){
    $_SESSION['err']=true;
    $_SESSION['errmsg']='User name required';
    gg_redirect('login.php');
    exit;
}elseif(gg_trim($pass)===''){$_SESSION['err']=true;$_SESSION['errmsg']='Password required';gg_redirect('login.php');
 exit;  
} 
echo $user, "<BR>", $pass;
?>
</body>
</HTML>

header.php

<div id="divheader" >
<p> <img src="coins.png"></img>MAX_KAPITAL</p>
</div>

func.php начинается с...

<?php
    mb_internal_encoding("UTF-8");
    function gg_redirect($url){
        header("location: $url");
    }

....

Это дает мне ошибку, когда пользователь не вводит пароль или имя пользователя.

Пожалуйста, найдите ошибку в моем коде. заранее спасибо.

касается Джорджа Годжава

  • 1
    Вызов exit(); после header() , иначе выполнение скрипта будет продолжено. Одной только настройки заголовка недостаточно для перенаправления.
  • 0
    Боюсь, это дубликат! Вы отправляете HTML в браузер перед запуском gg_redirect()
Показать ещё 1 комментарий
Теги:
header

2 ответа

3
Лучший ответ

PHP не лжет вам, вы действительно уже начали вывод строки 2 в user.php - вы печатаете <html> для ответа там.

Затем вы печатаете <head> и еще несколько HTML, затем вы вызываете функцию gg_redirect() из func.php if !isset($_POST['btnsubmit']), что вызывает ошибку, потому что больше невозможно отправить перенаправить заголовок, поскольку уже был запущен вывод.

Вам нужно проверить входные данные и, возможно, перенаправить, прежде чем отправлять что-либо обратно клиенту (кроме других заголовков ответов). В частности, не печатайте HTML-код, прежде чем вы будете обрабатывать возможные переадресации:

<?php
    // includes here - they must have no output!
    // check if all is OK, set $redirectURL if redirect is needed to that URL
    if ($redirectUrl) {
        header("location: $redirectUrl");
        exit(); // header() won't cause the script to stop executing
    }
?>
<html>
<head>
...

Файлы, включенные до перенаправления, не должны печатать какой-либо вывод - даже пустую строку, поэтому все они должны иметь <?php в качестве первых символов файла, весь файл должен быть PHP без вывода в тело ответа и должен заканчиваться?> без новой строки или пробела после этого (PHP может обрезать некоторые пробелы в этом случае, но не полагаться на это).

Вызов session_start() является безопасным и может быть до перенаправления (полезно, если вам нужны переменные сеанса), поскольку он не будет отправлять тело ответа. Он может установить cookie, но это нормально, потому что файлы cookie отправляются в заголовках.

  • 0
    @ Джин, спасибо за быстрый ответ. но я не знаю, как изменить свой код сейчас. пожалуйста, коротко об основных принципах.
  • 0
    @Jiri Tousek, следите за включениями до перенаправления. Если OP содержит скрипт php, который уже имеет заголовки, может возникнуть та же проблема.
1

Хотя @Jiri уже объяснил это правильно, чтобы быть более явным:

переместите это:

<?php require_once'func.php';
if (!isset($_POST['btnsubmit'])){
    gg_redirect('block.php');
    exit;
}

к самому верху вашего скрипта php, возможно, даже добавив первую строку к нему следующим образом:

<?php 
if (!isset($_POST['btnsubmit'])){
    gg_redirect('block.php');
    exit;
}
require_once'func.php';
session_start();
?>

а затем остальную страницу.

EDIT func.php добавляет заголовки, вставляя их перед перенаправлением, вы получаете эту ошибку. Переместите строку inlude в какое-то место после перенаправления или проверьте func.php, см. Отредактированный код выше

  • 0
    спасибо попробую.
  • 1
    session_start() должно быть проблемой, и сессия может потребоваться для решения о перенаправлении в общем случае. Хорошо, что вы упомянули об этом, поэтому мы можем обсудить это.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню