Autor Zpráva
regy
Profil
zdravím,
php mi vypisuje tuto chybu:
Warning: Cannot modify header information - headers already sent by (output started at C:\PHPWebServer\http_docs\obuv\administrace\index.php:81) in C:\PHPWebServer\http_docs\obuv\administrace\scripts\addproduct.php on line 45

Hlášku jsem pochpil tak, že header location nemůže být nastaven¨, protože již byl nastaven v index.php. tam ale žádný header není.

scripts\addproduct.php
<?php
if(isset($_GET['productcat'])) {
$objekt_vysledku = mysqli_query($db_spojeni,'SELECT * FROM kategorie WHERE script = "'.$_GET['productcat'].'" ORDER BY nazev');
$kategorie = mysqli_fetch_array($objekt_vysledku);
$nadpis = $kategorie['nazev']." -";
}
else
  $nadpis = "";
  
if(isset($_POST['nazev']) and $_POST['nazev'] != "") {
  $foto = "";
  if(empty($_POST['zobrazovat']))
    $_POST['zobrazovat'] = "ne";
  if(empty($_POST['akce']))
    $_POST['akce'] = "ne";

  $sql_prikaz =
  "INSERT INTO zbozi(id,nazev,popis,cena,kategorie,zobrazovat,akce,znacka,foto) "
  ."VALUES('null','"
  .mysqli_real_escape_string($db_spojeni,$_POST['nazev'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_POST['popis'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_POST['cena'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_POST['kategorie'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_POST['zobrazovat'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_POST['akce'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_POST['znacka'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$foto)
  ."')";
  $new = mysqli_query($db_spojeni,$sql_prikaz);
  if (!$new)
  {
  echo 'Poslání SQL příkazu se nepodařilo, sorry';
  echo '<br />';
  echo 'Popis chyby: ', mysqli_error($db_spojeni);
  exit();
  }
  if($_POST['next'] == "1"){
    header("location: ?act=addproduct&productcat=".$_POST['kategorie']);
  }elseif($_POST['next'] == "2") {
    header("location: ?cat=".$_POST['kategorie']);
  }
}

echo "<h1>$nadpis Přidání produktu</h1><div class='margin'>";

$objekt_kategorie = mysqli_query($db_spojeni,'SELECT * FROM kategorie ORDER BY poradi');
$znacky = mysqli_query($db_spojeni,'SELECT * FROM znacky ORDER BY znacka');

echo "
<form action='' method='post'>
  <table class='addproduct'>
    <tr><td class='left'>Název </td><td> <input type='text' name='nazev'></td></tr>
    <tr><td class='left'>
      Kategorie </td><td>
      <select name='kategorie'>";
  while($kategorie = mysqli_fetch_array($objekt_kategorie)) {     
    echo "<option value='".$kategorie['script']."'"; if(isset($_GET['productcat']) and $_GET['productcat'] == $kategorie['script']) echo " selected"; echo " >".$kategorie['nazev']."</option>";
  }
echo "
      </select>
    </td></tr>
    <tr><td class='left'>
      Značka </td><td>
      <select name='znacka'>";
  while($znacka = mysqli_fetch_array($znacky)) {     
    echo "<option value='".$znacka['znacka']."'>".$znacka['znacka']."</option>";
  }
echo "
      </select>
    </td></tr>
    <tr><td class='left'>Cena </td><td> <input type='text' name='cena' class='cena'> Kč</td></tr>
    <tr><td class='left'>Popis </td><td> <textarea name='popis'></textarea></td></tr>
    <tr><td class='left'>Vlastnosti</td><td class='check'>
      <input type='checkbox' name='zobrazovat' value='ano' id='ano1' checked><label for='ano1'>Zobrazovat<label><input type='checkbox' name='akce' value='ano' id='ano2'><label for='ano2'>Akční zobží</label>
    </td></tr>
    <tr><td class='left'>
      Po odeslání </td><td>
      <select name='next'>
        <option value='1'>Přidat další</option>
        <option value='2'>Zobrazit vybranou kategorii</option>
      </select>
    </td></tr>
    <tr><td colspan='2' class='submit'><input type='submit' value='Odeslat'></td></tr>
  </table>
</form>
";

echo "</div>";
?>
panther
Profil
regy
přečti si místní FAQ.
regy
Profil
headers already sent...
Pokud už byl generovaný nějaký výstup, tak už nelze používat funkce header(), setcookie() ani session_start(). Jejich volání skončí chybou.
Přesvědčete se, že před začátkem <?php ?> není žádný text (ani mezera) a že nebylo nic odesláno třeba funkcemi jako echo nebo print.
Pokud je text v UTF-8, tím výstupem může být i tzv. BOM signatura, vizte výše zmíněný Divný znak (čtvereček)....


Nikdy jsem s tím neměl problém a hlvně nechápu proč řádek 81 v index.php

index:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="generator" content="PSPad editor, www.pspad.com">;
  <link rel="stylesheet" href="img/styles.css" type="text/css">
  <script src="scripts.js" type="text/javascript" language="JavaScript"></script>
  <title>Dětská obuv - Administrace</title>
  </head>
  <body>
<?php 

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
session_start();
// -- Připojení k databázi a správné nastavení češtiny --
$db_spojeni = mysqli_connect('localhost', 'root', '35vfrd4te3', 'obuv', 3306);
$objekt_vysledku = mysqli_query($db_spojeni, "SET NAMES 'utf8'");

include("scripts.php");
    
//------------------------------------------------------------------------------

echo "
  <div id='body'>
    <div id='head'>Dětská obuv - Administrace</div>
    <div id='left' class='menu'>
    
    
      <h1><a href='?act=addcat' class='plus' title='Přidat kategorii' onclick='newcat(); return false;'>+</a>Kategorie zboží</h1>
      <div id='newcat' style='display: none;'><form action='#' onsubmit=\"newcatsubmit('new','null'); newcat(); return false;\"><input type='text' name='nazev' id='newcatvalue'><input type='submit' value='Přidat'></form></div>
      <ul id='katalog'>";

$objekt_vysledku = mysqli_query($db_spojeni,'SELECT * FROM kategorie ORDER BY poradi');
$posledy = mysqli_query($db_spojeni,'SELECT * FROM kategorie ORDER BY poradi DESC');
$posleda = mysqli_fetch_array($posledy);
$poradi=1;

while($radek = mysqli_fetch_array($objekt_vysledku)) {
  echo "
  <li>
  <a href='#' title='Smazat položku' class='del' onclick=\"newcatsubmit('del','".$radek['poradi']."')\"></a>";
    if($poradi == 1) echo "<div class='jakosmer'></div>";
    else echo "<a href='#' title='Posunout výš' class='up' onclick=\"newcatsubmit('".$radek['script']."','up')\"></a>";
    if($radek['poradi'] == $posleda['poradi']) echo "<div class='jakosmer down'></div>";
    else echo "<a href='#' title='Posunout níž' class='down' onclick=\"newcatsubmit('".$radek['script']."','down')\"></a>";
  echo "  
  <a href='?cat=".$radek['script']."'>".$radek['nazev']."</a>
  </li>";
  
  $poradi++;
}

echo "
      </ul>
      
      
      <h1>Správa zboží</h1>
      <ul>
        <li><a href='?act=addproduct'>Přidat</a></li>
        <li><a href='?act=action'>Akční zboží</a></li>
        <li><a href='?act=brand'>Značky</a></li>
        <li><a href='?act=hidden'>Nezobrazované zboží</a></li>
        <li><a href='?act=all'>Kompletní seznam zboží</a></li>
      </ul>
      
      
    </div>
    <div id='right' class='menu'>


      <h1><a href='?act=addpage' class='plus' title='Přidat položku v menu' onclick='newpage(); return false;'>+</a>Menu</h1>
      <div id='newpage' style='display: none;'><form action='#' onsubmit=\"newpagesubmit('new', 'null'); newpage(); return false;\">
        <input type='text' name='nazev' id='newpagevalue'>
        <select name='typ' id='newpagetyp'>
          <option value=''>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Typ obsahu  </option>
          <option value='text'>Text</option>
          <option value='fotogalerie'>Fotogalerie</option>
        </select>
        <input type='submit' value='Přidat'>
      </form></div>
      <ul id='menu'>";

$objekt_vysledku = mysqli_query($db_spojeni,'SELECT * FROM menu ORDER BY poradi');
$posledy = mysqli_query($db_spojeni,'SELECT * FROM menu ORDER BY poradi DESC');
$posleda = mysqli_fetch_array($posledy);
$poradi=1;

while($radek = mysqli_fetch_array($objekt_vysledku)) {
  echo "
  <li>
  <a href='#' title='Smazat položku' class='del' onclick=\"newpagesubmit('del','".$radek['poradi']."')\"></a>";
    if($poradi == 1) echo "<div class='jakosmer'></div>";
    else echo "<a href='#' title='Posunout výš' class='up' onclick=\"newpagesubmit('".$radek['script']."','up')\"></a>";
    if($radek['poradi'] == $posleda['poradi']) echo "<div class='jakosmer down'></div>";
    else echo "<a href='#' title='Posunout níž' class='down' onclick=\"newpagesubmit('".$radek['script']."','down')\"></a>";
  echo "  
  <a href='?page=".$radek['script']."'>".$radek['nazev']."</a>
  </li>";
  
  $poradi++;
}

echo "
      </ul>
      
      
      <h1>Novinky</h1>
      <ul>
        <li><a href='#'>Přidat novinku</a></li>
        <li><a href='#'>Správa novinek</a></li>
      </ul>
    </div>
    <div id='content'>";
    
//------------------------------------------------------------------------------

if(isset($_GET['act'])) {
  include("scripts/".$_GET['act'].".php");
} elseif(isset($_GET['cat']))
  include("scripts/cat.php");


echo "
    </div>
  </div>";
?>
  </body>
</html>
Joker
Profil
regy:
Nikdy jsem s tím neměl problém
No, pokud se neposílají žádné hlavičky, tak problém není :-) S hlavičkami to dělá problém vždycky.

S tím indexem je to fakt divný, je to ten správný index.php? Hlavně v tomhle případě by mělo zkrachnout už session_start().
regy
Profil
říkám, že jsem s tím nikdy problém neměl, i když jsem nastavoval header v inculudovaném souboru, který byl includován až po nějakém echu (funguje mi to jak na webhostingu tak na localhostu)... A ano je to ten správný index :-)
ninja
Profil
regy: nastaveni headeru po odeslani nejakeho vysputu (echo) je nesmysl, to vam nefungovalo. Jen jste mozna mel nastavenu jinou uroven hlasei chyb a nic to neukazalo. Hlavicku musite odesilat vzdy pred jakymkoliv vystupem, tecka. Upravte si aplikaci.
regy
Profil
ale fungovalo... :-) př. tento script:
<?php 
echo "<h1 id='forumlegend'>";
echo "<a href='?show=dis'>Fórum</a>";
  if(isset($_GET['category'])) {
    $objekt_vysledku = mysqli_query($db_spojeni,"SELECT * FROM fora WHERE id = '".$_GET['category']."' ");
    $radek = mysqli_fetch_array($objekt_vysledku);
    echo " » <a href=\"?show=".$_GET['show']."&amp;category=".$_GET['category']."\">".$radek['nazev']."</a> " ;
  }

  if(isset($_GET['subject'])) {
    $objekt_vysledku = mysqli_query($db_spojeni,"SELECT * FROM temata WHERE id = '".$_GET['subject']."' ");
    $radek = mysqli_fetch_array($objekt_vysledku);
    echo " » <a href=\"?show=".$_GET['show']."&amp;category=".$_GET['category']."&amp;subject=".$_GET['subject']."\">".$radek['nazev']."</a> " ;
  }
echo "</h1>";

//******************************************************************************

if(isset($_POST['prispevektext']) and $_POST['prispevektext'] != "" and $loged == 'true') {
  $text = text($_POST['prispevektext']);
  $sql_prikaz =
  "INSERT INTO prispevky(id,datum,text,textn,autor,tema,forum) "
  ."VALUES(null,NOW(),'"
  .mysqli_real_escape_string($db_spojeni,$text)
  ."','"
  .mysqli_real_escape_string($db_spojeni,fuckingescape($_POST['prispevektext']))
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_SESSION['nick'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_GET['subject'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_GET['category'])
  ."')";
  $newre = mysqli_query($db_spojeni, $sql_prikaz);
  
  Header("Location: index.php?show=dis&category=".$_GET['category']."&subject=".$_GET['subject']);
}

if(isset($_POST['tematext']) and isset($_POST['temanazev']) and $_POST['tematext'] != "" and $_POST['temanazev'] != "" and $loged == 'true') {
  $text = text($_POST['tematext']);
  
  $sql_prikaz =
  "INSERT INTO temata(id,datum,nazev,text,textn,autor,forum) "
  ."VALUES(null,NOW(),'"
  .mysqli_real_escape_string($db_spojeni,$_POST['temanazev'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$text)
  ."','"
  .mysqli_real_escape_string($db_spojeni,fuckingescape($_POST['tematext']))
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_SESSION['nick'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_GET['category'])
  ."')";
  $newforum = mysqli_query($db_spojeni, $sql_prikaz);
  
  $objekt_vysledku = mysqli_query($db_spojeni,'SELECT * FROM temata WHERE forum = "'.$_GET['category'].'" ORDER BY datum DESC');
  $subject = mysqli_fetch_array($objekt_vysledku);
  
  Header("Location: index.php?show=dis&category=".$_GET['category']."&subject=".$subject['id']);
}

if(isset($_POST['forumnazev']) and $admin == 'true') {
  $sql_prikaz =
  "INSERT INTO fora(id,nazev,popis,autor) "
  ."VALUES(null,'"
  .mysqli_real_escape_string($db_spojeni,$_POST['forumnazev'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_POST['forumpopis'])
  ."','"
  .mysqli_real_escape_string($db_spojeni,$_SESSION['nick'])
  ."')";
  $newforum = mysqli_query($db_spojeni, $sql_prikaz);
  Header("Location: index.php?show=dis");
}

if(isset($_GET['x']) and $admin == 'true') {
$objekt_vysledku = mysqli_query($db_spojeni,'DELETE FROM fora WHERE id = "'.$_GET['x'].'"');
  Header("Location: index.php?show=dis");
}

if(isset($_GET['xt']) and $admin == 'true') {
$objekt_vysledku = mysqli_query($db_spojeni,'DELETE FROM temata WHERE id = "'.$_GET['xt'].'"');
  Header("Location: index.php?show=dis&category=".$_GET['category']);
}

if(isset($_GET['xp']) and $admin == 'true') {
$objekt_vysledku = mysqli_query($db_spojeni,'DELETE FROM prispevky WHERE id = "'.$_GET['xp'].'"');
  Header("Location: index.php?show=dis&category=".$_GET['category']."&subject=".$_GET['subject']);
}

if(isset($_POST['edittext']) and $loged == 'true' and $_GET['edit'] == "thema") {
  $text = text($_POST['edittext']);
  $objekt_vysledku = mysqli_query($db_spojeni,'UPDATE temata SET 
  nazev = "'.mysqli_real_escape_string($db_spojeni,$_POST['editnazev']).'", 
  textn = "'.mysqli_real_escape_string($db_spojeni,fuckingescape($_POST['edittext'])).'", 
  text = "'.mysqli_real_escape_string($db_spojeni,$text).'", 
  zmeneno = NOW() 
  WHERE id = "'.$_GET['subject'].'"');
  Header("Location: index.php?show=dis&category=".$_GET['category']."&subject=".$_GET['subject']);
}

if($loged == 'true' and $_GET['close'] == "thema") {
  $objekt_vysledku = mysqli_query($db_spojeni,'UPDATE temata SET zamek = "true" WHERE id = "'.$_GET['subject'].'"');
  Header("Location: index.php?show=dis&category=".$_GET['category']."&subject=".$_GET['subject']);
}

if(isset($_POST['edittext']) and $loged == 'true' and $_GET['edit'] != "thema") {
  $text = text($_POST['edittext']);
  $objekt_vysledku = mysqli_query($db_spojeni,'UPDATE prispevky SET 
  textn = "'.mysqli_real_escape_string($db_spojeni,fuckingescape($_POST['edittext'])).'", 
  text = "'.mysqli_real_escape_string($db_spojeni,$text).'", 
  zmeneno = NOW() WHERE id = "'.$_GET['edit'].'"');
  Header("Location: index.php?show=dis&category=".$_GET['category']."&subject=".$_GET['subject']."#".$_GET['edit']);
}
//******************************************************************************

celé se to nevešlo a header na 60. řádku funguje.
ninja
Profil
regy: komu neni rady, tomu neni pomoci...
nightfish
Profil
dokážu si představit, že to funguje na serveru, který má nastaven nenulový output buffer
nicméně spoléhat na nějakou konkrétní hodnotu nastavení mi nepřijde jako rozumná volba pro přenositelnou aplikaci
regy
Profil
no ale zaráží mě, že mi to funguje jak na localhostu tak na webhostingu. A navíc

Nikdy jsem s tím neměl problém a hlvně nechápu proč řádek 81 v index.php

proč tedy zrovna řádek 81?
reloader
Profil *
pripocitej do toho indexu radky includovanyho scriptu a budes mit ten spravnej radek 81, ne?
AM_
Profil
reloader
to ne, ukazuje to skutečný řádek toho souboru :)
Spíš je možné, pokud je na serveru nastavený nějaký ten buffer, že právě na tom řádku se naplní a odešle.
denCo
Profil
skus dat na uplny zaciatok
<?php
ob_start();
?>

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: