Ошибка в заголовке - Warning: Cannot modify header information - headers already sent

Это ошибка:

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\newop\template\header.php:80) in C:\xampp\htdocs\newop\mainindex.php он-лайн 16

Линия 80 из header этот (это единственная линия, только, что descompactada):

<div class="col-md-2 col-xs-2 device-select">
    <a href="budget.php?device=2">
        <img class="full-width" src="res/images/device2.jpg">
        </img>
    </a>
    <center class="popular-devices">
<?php echo $lang['header_dropdown_string_2'];?>
    </center>
</div>

... и этот код:

<?php
session_start();
if (!isset($_SESSION['user'])){ header("Location: index.php"); }
?>
<html>
  <body>
<?php
  include("template/head.php");
  include("template/header.php");
  include ("db_files/db.php");
  $usermail = mysqli_real_escape_string($db, $_SESSION['user']);
  $strSQL = "SELECT nivel FROM usuarios where email ='$usermail'";
  $query = mysqli_query($db, $strSQL);
  while ($result = mysqli_fetch_array($query)){
    if ($result['nivel'] == 1 || $result['nivel'] == 2){
    header("location: userlist:php");
  }
  
}
  $state = array(
    1 => $lang['state_name_string_1'],
    2 => $lang['state_name_string_2'],
    3 => $lang['state_name_string_3'],
    4 => $lang['state_name_string_4'],
  );
?>
  <div class="content container">
    <div class="row no-margin no-padding">
      <div class="col-md-2 hidden-sm hidden-xs">
        <div class="mainuserimage">
          <img class="full-width" src="res/images/users/user1.png"/>
        </div>
        <div>
<?php
            $strSQL = "SELECT nombre, email, telefono FROM usuarios where email ='$usermail'";
            $query = mysqli_query($db, $strSQL);
            while ($result = mysqli_fetch_array($query)){
              echo "<i class='glyphicon glyphicon-user'></i> ".$result['nombre']."<br>";
              echo "<i class='glyphicon glyphicon-envelope'></i> ".$result['email']."<br>";
              echo "<i class='glyphicon glyphicon-earphone'></i> ".$result['telefono']."<br>";
            }
?>
        </div>
      </div>
      <div class="col-md-10 col-xs-12">
      <h3 class="main-title"><?php echo $lang['mainindex_string_1']; ?></h3><br>
        <div class="row">
          <div class="col-md-2 col-xs-3">
            <p><?php echo $lang['mainindex_string_2']; ?></p>
          </div>
          <div class="col-md-2 col-xs-3">
            <p><?php echo $lang['mainindex_string_3']; ?></p>
          </div>
          <div class="col-md-2 col-xs-3">
            <p><?php echo $lang['mainindex_string_4']; ?></p>
          </div>
          <div class="col-md-2 hidden-sm hidden-xs">
            <p><?php echo $lang['mainindex_string_5']; ?></p>
          </div>
          <div class="col-md-2 col-xs-3">
            <p><?php echo $lang['mainindex_string_6']; ?></p>
          </div>
          <div class="col-md-2 hidden-sm hidden-xs">
            <p><?php echo $lang['mainindex_string_7']; ?></p>
          </div>
<?php
            $strSQL = "SELECT id, marca, modelo, imei, descripcion_problema, problem, problem2, problem2_namees, estado, fecha_creacion FROM tickets, problem2 WHERE tickets.email = '$usermail' AND tickets.problem2 = problem2.problem2_id";
            $query = mysqli_query($db, $strSQL);
            while($result = mysqli_fetch_array($query)){ ?>
              <div class="col-md-2 col-xs-3">
                <p><a href="repairdetail.php?id=<?php echo $result['id']; ?>"><i class="glyphicon glyphicon-list-alt"></i></a>  <?php echo $result['marca']; ?></p>
              </div>
              <div class="col-md-2 col-xs-3">
                <p><?php echo $result['modelo']; ?></p>
              </div>
              <div class="col-md-2 col-xs-3">
                <p><?php echo $result['imei']; ?></p>
              </div>
              <div class="col-md-2 hidden-sm hidden-xs">
                <p><?php echo $result['problem2_namees']; ?></p>
              </div>
              <div class="col-md-2 col-xs-3">
                <p><?php echo $state[$result['estado']]; ?></p>
              </div>
              <div class="col-md-2 hidden-sm hidden-xs">
                <p><?php echo $result['fecha_creacion']; ?></p>
              </div>
<?php
            }
?>
          </div>
        </div>
    </div>
  </div>
<?php
  include("template/footer.php");
?>
  </body>
</html>
8
задан 03.07.2017, 20:45
2 ответа

Двинь блок:

include ("db_files/db.php");
$usermail = mysqli_real_escape_string($db, $_SESSION['user']);
$strSQL = "SELECT nivel FROM usuarios where email ='$usermail'";
$query = mysqli_query($db, $strSQL);

while ($result = mysqli_fetch_array($query)){
    if ($result['nivel'] == 1 || $result['nivel'] == 2){
        header("location: userlist.php"); //<= Error: userlist:php !!!
    }
}

перед:

<html>
...

Функции PHP, которые они посылают или изменяют заголовки HTTP должны работать до того, как начали посылать страницу, попросившую у пользователя.

Добавочная информация об ошибке: - headers already sent

Сообщение HTTP состой из заголовка - Header и тело -Body что посланы клиенту в этом порядке - Client. В моменте, который послан Body не возможно посылать уже больше Header.

Если ты пробуешь тогда называния функции header() после, что был послан HTML, он ты идет есть производить знаменитую ошибку: Cannot modify header information - headers already sent.

Не только функция header () изменяет Header если не также следующие функции:

Другие примеры, которые производят также ошибку перед тем, как посылать Header:

  • Место перед тем, как открываться _<?php
  • Место, закрыв ?>_
  • Использовать UTF-8 с BOM
  • Показывать / добавлять информацию / контент или сообщения ошибки:
    HTML, echo, print, var_dump().... и т.д.

Примеры ошибочных кодов:

<?php
echo "Foo Bar"; // Mostrar contenido echo
setcookie("Foo", "Bar");

 <?php // Espacio antes del "<?php"
session_start();
?>

<html> <!-- Mostrando contenido HTML -->
<head>
<?php
session_start();
?>
12
ответ дан 24.11.2019, 12:41
  • 1
    Это правильный ответ, произошел со мной когда-нибудь и поэтому сам –  09.11.2016, 11:50
  • 2
    Очень ú til спроси и очень ú til ответ. +1!! – Adriana Hernández 08.12.2017, 16:31

Ошибка случается, потому что ты посылаешь вывод html перед тем, как изменять header, с чем, назначенные по умолчанию заголовки уже были посланы.

Ты можешь решать это двигая блок html вслед за командой header. Или также используя функцию ob_start() в первых линиях кода. Это будет инициализировать кэш-память буфера вывода и заголовки не будут посланы до того, чтобы заканчивать рукописный шрифт.

4
ответ дан 24.11.2019, 12:41