Autor Zpráva
Zirza
Profil *
Ahoj, koupil jsem hosting u wedosu a mám problém. vypisuje mi to spoustu chyb typu:
Warning: Cannot modify header information - headers already sent by (output started at /data/web/virtuals/35289/virtual/www/index.php:30) in /data/web/virtuals/35289/virtual/www/my_bikes.php on line 9

Přitom mi to fungovalo u endory i na localhostu. Kde je problém, co s tím můžu dělat?
Enyeus
Profil
Ahoj, problém je s tím, že upravuje hlavičky a přitom jsi už do prohlížeče poslal data (například mezeru).
Zirza
Profil *
jj, chápu to, ale co s tím? Předpokládám, že bude problém ve verzi php nebo tak něco, když jinde mi to fungovalo. Dá se s tím něco udělat na mé straně?
_es
Profil
Zirza:
Nejčastější potíže s PHP (FAQ) » headers already sent…
Zirza
Profil *
no třeba u této je vypadá soubor my_bikes. php takto:
<?php
    require("common.php");

    if(empty($_SESSION['user'])){
      header("Location: index.php?page=login");
      die();
    }

    $user_id = $_SESSION['user']['id'];

    $query = mysql_query("SELECT id, model, foto FROM bikes WHERE owner = $user_id ") or $err = 1;
    if(isset($err) or mysql_num_rows($query) == 0){
      echo "<h2 id=\"err\">Zatím jste nepřidali žádný bike.</h2>";
      }
    else {
      while ($result = mysql_fetch_array($query)){
        $id = $result['model'];
        ?>
        <div class="my-bike">
          <img src="content-images/bikes/<?php echo $result['foto']; ?>" class="my-bike-image" />
          <p class="my-bike-info"><?php echo $brand." ".$modelname?></p>
        </div>
        <?php
      }
    }

myslím, že vše popsané v odkazu splňuje, tak kde je chyba?
Someone
Profil
co je v souboru common.php ?
Zirza
Profil *
přístup k databázi
Tori
Profil
Zirza:
A do toho index.php na řádek 30 jste kouknul? Bílé znaky, html, doctype,...?
edit: anebo v tom index.php:30 může být třeba použitý neexistující klíč pole, který následně vygeneruje E_NOTICE a to je ten neočekáváný výstup.
Zirza
Profil *
začátek indexu vypadá takto: (je to teď drobně upraveno, chybu vypisuje na řádku 26)
<?php

  session_start();
  require("common.php");
    
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="cs">
<head>
  
  <link href="css/reset.css" rel="stylesheet" type="text/css">
  <link href="css/style.css" rel="stylesheet" type="text/css">
  
  <link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico">
  
  <script src="js/jquery-1.8.3.js" type="text/javascript"></script>
  
  <title>title</title>
  
</head>
<body>

    <div id="user-panel">
        <div id="alcen">

    <?php
    if(!empty($_SESSION['user'])){
      
      $id = $_SESSION['user']['id'];
      $query = mysql_num_rows(mysql_query("SELECT id FROM messages WHERE viewed = 0 AND pro = $id "));
      ?>
      
zkoušel jsem vyhodi i doctype, ale nijak to nepomohlo :-(
Tori
Profil
Zirza:
A kde se includuje ten my_bikes.php?
Zirza
Profil *
<?php
 
  session_start();
  require("common.php");
    
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="cs">
<head>
  
  <link href="css/reset.css" rel="stylesheet" type="text/css">
  <link href="css/style.css" rel="stylesheet" type="text/css">
  
  <link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico">
  
  <script src="js/jquery-1.8.3.js" type="text/javascript"></script>
  
  <title>title</title>
  
</head>
<body>
 
    <div id="user-panel">
        <div id="alcen">
 
    <?php
    if(!empty($_SESSION['user'])){
      
      $id = $_SESSION['user']['id'];
      $query = mysql_num_rows(mysql_query("SELECT id FROM messages WHERE viewed = 0 AND pro = $id "));
      ?>
      
          <a href="index.php?page=edit_account" class="move">» Upravit účet</a>
          <a href="index.php?page=messages">» Zprávy (<?php echo $query; ?>)</a>
          <?php if($_SESSION['user']['rights'] == 1) { echo "<a href=\"admin\" class=\"move\">» Administrace</a>"; } ?>
          <a href="logout.php" class="move">» Odhlásit se</a> 
      
      <?php
      }
    else {
      echo "Uživatelský panel <a href=\"index.php?page=my_bikes\" class=\"move\">» Přihlásit se</a>";  
    }
      ?>
      
    </div>
  </div>    
  <div id="content">    
      <div id="header">
        
        <div id="nav">
          <a href="index.php?page=articles">Články</a>
          <a href="index.php?page=documents">Dokumenty</a>
          <a href="index.php?page=find_bike">Motocykly</a>
          <a href="index.php?page=forum">Fórum</a>
        </div>
        
        <a href="index.php"><img src="images/logo.png" alt="ČeskéMotocykly.cz"></a>
        
      </div>
    
      <?php 
      if(isset($_GET['page'])){
        if(file_exists($_GET['page'].".php")){
          include($_GET['page'].".php"); // tady se vloží my_bikes.php, pokud je volán
          }
        else {
          echo "<h2 id=\"err\">Požadovanou stránku se bohužel nepodařilo nalézt...</h2>";
          }
        }
      else {
  
    ?>
_es
Profil
Zirza:
 include($_GET['page'].".php"); // tady se vloží my_bikes.php, pokud je volán
No a v tom skripte my_bikes.php máš volanie funkcie header - čiže si stačilo poriadne prečítať odkazovaný text v [#4].
Zirza
Profil *
no dobře, ale ta fce header je použita pouze když je prázdná $_SESSION['user'] tzn. když uživatel není přihlášen, přesměrovávám ho na login. Jak to mám teda jinak udělat?
_es
Profil
Zirza:
tzn. když uživatel není přihlášen, přesměrovávám ho na login.
Ale cez HTTP hlavičku ho už presmerovať nemôže, lebo HTTP hlavičky musia byť pred obsahom.

Jak to mám teda jinak udělat?
Overovať prihlásenie pred tým, než PHP skript odošle akýkoľvek HTML obsah.
Zirza
Profil *
a proč na localhostu a na hostingu u endory mi to fungovalo?
_es
Profil
Zirza:
Asi bolo nastavené oneskorené odosielanie hlavičiek.
Zirza
Profil *
a ještě jeden dotaz. Stejnej problém je s cookies (setcookie();) a ty můžu jen těžko přesunout před výpis obsahu. Nejde to nějak očůrat?
Amunak
Profil
Zirza:
A proč bys nemohl? To je takový problém mít nejprve logiku skriptu, a teprve potom vykreslení obsahu? Řekl bych, že v tom případě asi píšeš kód špatně. Pokud se ti nechce všechno přepisovat, můžeš použít ob_start.
_es
Profil
Zirza:
Stejnej problém je s cookies (setcookie();) a ty můžu jen těžko přesunout před výpis obsahu.
Prečo by sa to nedalo presunúť pred obsah? Veď výpis obsahu s nastavením a prečítaním cookie nesúvisí.
Zirza
Profil *
no právě že souvisí. Mám v tom indexu includovanou stránku, ta načítá další obsah. A já si chci vytvořit cookie s id toho obsahu.
Jan Tvrdík
Profil
Zirza:
Možná je na čase začít používat nějaký šablonovací systém. Námět + pokračování.
_es
Profil
Zirza:
Mám v tom indexu includovanou stránku, ta načítá další obsah.
No tak to sprav tak, aby sa ten „ďalší obsah“ načítal až po nastavení cookie a odoslaní všetkých hlavičiek. To je len výhovorka: „Mám to zle zbastlené a nechce sa mi to spraviť správne, lebo to je zle zbastlené na veľa miestach“
Zirza
Profil *
ok, ok.
tak ještě poslední dotaz. jen tak nazačátek mé nové programátorské éry :-)
Dejme tomu že mám třeba přihlašovací skript:
<?php
if (isset($_POST['jmeno'])){
  //kontrola správnosti údaju atd.....
  header("Location: index.php");
  }
else {
?>
  <form action=$_SERVER['PHP_SELF'] method=post>
    <input type=text name=jmeno>
    submit
   </form>
<?php
  }
jen tak nástřel ;-)

a to celý includuju do indexu, kde mám hlavičku kódování, nabídku, atd., atd.

a to je podle všecho špatně...
Jak to mám teda správně dělat?
Jan Tvrdík
Profil
Zirza:
Jak to mám teda správně dělat?
Nejtupější řešení (tj. bez použití šablonovacího systému), které mě napadá, je toto:

layout.tpl.php
<!doctype html>
<head>...</head>
<body><?php include $contentPath; ?></body>

login.tpl.php
  <form action=<?php echo $_SERVER['PHP_SELF'] ?> method=post>
    <input type=text name=jmeno>
    submit
   </form>

login.php
<?php
if (isset($_POST['jmeno'])){
  //kontrola správnosti údaju atd.....
  header("Location: index.php");
  exit; // nezapomínat!
}

$contentPath = __DIR__ . '/login.tpl.php';
include __DIR__ . '/layout.tpl.php'

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: