Divná chybovka

Dobrý večer,
Co znamená tato hláška? Já ji ještě neviděl díky za odpověd
Ps:A jak se to dá spravit

Warning: session_regenerate_id() [function.session-regenerate-id]: Cannot regenerate session id - headers already sent in /3w/wz.cz/h/hackermanie/login.php on line 19

Warning: Cannot modify header information - headers already sent by (output started at /3w/wz.cz/h/hackermanie/index.php:86) in /3w/wz.cz/h/hackermanie/login.php on line 23

tady login.php
<?php
require_once dirname(__FILE__)."/config.php";

if (!session_is_registered("jmeno"))
session_register("jmeno");

if (!session_is_registered("heslo"))
session_register("heslo");

if (!session_is_registered("prava"))
session_register("prava");

if (isset($_POST['submit'])) {

$select = mysql_query("SELECT `jmeno`,`heslo`,`prava` FROM `uzivatele` WHERE `jmeno`='".addslashes($_POST['jmeno'])."' AND `heslo`='".md5(trim($_POST['heslo']))."'") or die (mysql_error());
$udaje = mysql_fetch_assoc($select);

if (mysql_num_rows($select)==1) { # pokud je zadano platne jmeno a heslo
session_regenerate_id(); # osetreni session stealing
$_SESSION['jmeno'] = $_POST['jmeno']; # nastavime sessiony
$_SESSION['heslo'] = md5($_POST['heslo']);
$_SESSION['prava'] = $udaje['prava'];
header("Location: ./hra/index.php");
} else { # pokud je neco spatne, zasleme chybovy kod
header("Location: ./login.php?code=401", 401);
}

}

if (isset($_GET['logout'])) { # odhlasime se
unset($_SESSION['jmeno']);
unset($_SESSION['heslo']);
unset($_SESSION['prava']);
session_destroy();
}

isset($_GET['code']) && $_GET['code']=="401" ? # pouze titulek
$title = "Špatné jméno nebo heslo" :
$title = "Přihlášení­";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
<head>

<meta http-equiv="content-type" content="text/html; charset=windows-150" />
<title><?php echo $title ?></title>

</head>
<body>

<form action="#" method="POST">
<fieldset>
<legend><b><?php echo $title ?></b></legend>
<p><input name="jmeno" size="20" tabindex="1" type="text" /> <label>Jméno</label></p>
<p><input name="heslo" size="20" tabindex="2" type="password" /> <label>
Heslo</label></p>
<p><input name="submit" type="submit" tabindex="3" value="přihlásit » " class="button" /></p>
</fieldset>
</form>

<?php if (isset($_GET['logout'])) { ?>

<p>Byli jste odhlášeni.</p>

<?php } ?>

<p><a href="./register.php">Zaregistrovat</a></p>
<style type="text/css">
input.button{
background-color : #FF9109;
border-bottom : 2px solid Black;
border-right : 2px solid Black;
border-top : 2px solid #FFD39D;
border-left : 2px solid #FFD39D;
text-align : center;
}
input.text{
border-top : 2px solid Black;
border-left : 2px solid Black;
border-bottom : 2px solid #D9D9D9;
border-right : 2px solid #D9D9D9;
}
</style>
</HEAD>
<BODY>
jo a v indexu používám include na ten login
<HTML>Změny sessions vyžadují poslání příslušné HTTP hlavičky v odpovědi. Tu však nelze poslat, pokud už došlo k odeslání nějakých dat. (Je to dáno strukturou HTTP odpovědi, kdy jdou nejprve hlavičky, potom data, a nejde to míchat.)

<em>Warning: session_regenerate_id() [function.session-regenerate-id]: Cannot regenerate session id - headers already sent in /3w/wz.cz/h/hackermanie/login.php on line 19</em>

Tato hláška říká, že volaná funkce session_regenerate_id() nemůže přegenerovat session id, protože veškeré HTTP hlavičky již byly odeslány (a dále je napsáno, kde byla přesně funkce regenerate_session_id() zavolána). Blbé je, že chybová hláška neříká, ve kterém souboru a řádku jsi začal posílat data. Naštěstí je tu druhá hláška...

<em>Warning: Cannot modify header information - headers already sent by (output started at /3w/wz.cz/h/hackermanie/index.php:86) in /3w/wz.cz/h/hackermanie/login.php on line 23</em>

A tato hláška naráží na to, že nelze změnit hlavička příkazem header() o pár řádků níže, a to z téhož důvodu. Ale (a je to zhovadilost PHP, že to nepíše u té první hlášky a máš víceméně štěstí, že tu funkci header() voláš) tentokrát se dozvídáš v závorkách, PROČ konkrétně nejde HTTP hlavička přidat - v souboru index.php, řádek 86, jsi začal generovat nějaká data (echo, nebo mimo blok PHP kódu).

Vyznat se v chybových hláškách je pro začátečníka těžké, navíc PHP je nepíše (pro začátečníka) příliš srozumitelně (vlastně málokdo je píše srozumitelně).

PS: Dá se to spravit vhodnou změnou pořadí příkazů - nejprve hlavičky, potom výpisy dat. Případně, pokud si nevíš rady, využij bufferování výstupu (funkce ob_*).</HTML>
index je vlastně jenom html a jeden include toho loginu
A v tom je právě ten problém. Nemůžeš vložit include "login.php" do již rozjetého výstupu.
Pokud voláš funkce, které ovlivňuji hlavičku, tak před ním NESMÍ být žádný výstup. To znamená, že před include "login.php" nesmí být nic.

S ohledem na předchozí vlákno, se i zde potvrzuje fakt, že neumíš pracovat s funkcí include.

Include NENÍ ekvivalent rámců! Jeho vlastnost je pouze to, že se PŘIPOJÍ DO JIŽ EXISTUJÍCÍHO OBSAHU. Nejedná se o samostatný HTTP požadavek, kde musí být vlastní hlavička a vlastní HTML struktura.

Pro pochopení funkčnosti include ti dám příklad.

Máš soubor neco.php a v něm:

< html >
<head><title>Něco</title></head>
<body>
<h1>Ahoj</h1>
</body>
</ html>

Pak máš index.php a v něm:

< html >
<head><title>Něco</title></head>
<body>
<?php include "neco.php"; ?>
</body>
</ html>

Jaký si myslíš, že bude výsledek?

< html >
<head><title>Něco</title></head>
<body>
< html >
<head><title>Něco</title></head>
<body>
<h1>Ahoj</h1>
</body>
</ html>
</body>
</ html>

Připadá ti to správně? Asi ne. HTML struktura se tam musí objevovat pouze jednou. Kde tedy děláme chybu? Chybu děláme v pochopení funkce include.
Funkce include pouze připojuje obsah do obsahu. Takže v souboru neco.php musí být pouze:

<h1>Ahoj</h1>

Pak bude výsledek:

< html >
<head><title>Něco</title></head>
<body>
<h1>Ahoj</h1>
</body>
</ html>
Díky už jsem to pochopil dám si na to pozor
require by asi nepomohlo
Require by opravdu nepomohlo, viz php.net/require.

Obávám se, že Tomíkovo tvrzení, že jsi nepochopil include, je pouze špičkou ledovce -- zřejmě jsi vůbec nepochopil rozdíl mezi zpracováním/zobrazováním obsahu na serveru a u klienta.
krulik (hackermanie.wz.cz)
Zkusim to tez vysvetlit :)
Kdyz mas na strance echo nebo html kod, a pak php, tak server v beznem nastaveni odesle vse, co muze, i s hlavickou. A tim padem uz ji nemuses menit dalsim php prikazem, treba session_start.

soubor.php
---
<?php session_start(); ?>
---

<?php session_start(); ?>
---
Protoze je prvni radek mezera (1) nebo novy radek (2), server odesle, co muze i s hlavickou a pak se pusti do zpracovani dalsiho kodu.
--- je tam jen oddeleni, aby bylo videt, kde zacina text souboru.

Co s tim?
Zkus se podivat do manualu na ob_flush.
Nebo to delej, jak ja, ze vsechen php kod zpracuji predem do promennych a pak ho jen vypisuji.

soubor.php
---
<?php
session_start();
$aaa = 1;


?>

<?php echo $aaa; ?>
---