Tein yksinkertaisen kirjautumissivuston ja yritän sisällyttää systeemin etusivulle eli index.php ja kuitenkin jostain syystä tulee index.php seuraava virheilmoitus. Muuten toimii mutta ilmoitus häiritsee.
lainaus:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/ftp/luffy/index.php:9) in /home/ftp/luffy/index.php on line 10
index.php
<HTML> <HEAD> <TITLE>site</TITLE> </HEAD> <BODY> <CENTER> <body bgcolor="black"> <FONT COLOR=white><img src="1.gif"><br><br><br><br> <?php include("tarkista.php"); ?> </CENTER> </BODY> </HTML>
tarkista.php
<?php //aloitetaan sessionit session_start(); //asetukset $tiedosto = "userit.txt"; //tiedosto jossa tiedot usereista $tarkastus = "tarkista.php"; //TÄMÄ tiedosto $etusivu = "userfilu.php"; //sivu jonne mennään kirjautumisen jälkeen //jos tiedostoa ei ole, tehdään se if(!file_exists($tiedosto)) { touch($tiedosto); chmod($tiedosto, "0766"); } $data = file($tiedosto); $userit = array(); //kerätään tiedot usereista for ($i=0; $i<count($data); $i++) { $entry = explode("|", $data[$i]); $userit[$i] = $entry[0]; } //tietojen siistimistä varten function clean ($string) { $string = str_replace("|", "", $string); $string = strip_tags($string); $string = ereg_replace("\n", "", $string); return strtolower($string); } //jollei olla sisällä näytetään kirjautumislomake if (empty($_SESSION["sess_tunnus"]) || $_SESSION["sess_iposoite"] != $_SERVER["REMOTE_ADDR"]) { $tunnus = clean($_POST["tunnus"]); $email = clean($_POST["email"]); $salasana = clean($_POST["salasana"]); $salasana2 = clean($_POST["salasana2"]); //kirjautuminen if (isset($_POST["kirjaudu"])) { if (in_array($tunnus, $userit) != "") { $entry = explode("|", $data[array_search($tunnus, $userit)]); if ($entry[2] == md5($salasana)) { //sessionit kuntoon session_register("sess_tunnus"); $_SESSION["sess_tunnus"] = $tunnus; session_register("sess_iposoite"); $_SESSION["sess_iposoite"] = $_SERVER["REMOTE_ADDR"]; echo "<b>Kirjauduit sisään!</b><br>\n"; echo "Jatka klikkaamalla <a href=\"". $etusivu ."\">tästä</a>."; } else { echo "<b>Virheellinen salasana.</b><br>\n"; echo "Voit kirjautua uudelleen klikkaamalla <a href=\"". $tarkastus ."\">tästä</a>."; } } else { echo "<b>Tunnusta \"<i>". $tunnus ."</i>\" ei löydy.</b><br>\n"; echo "Voit kirjautua uudelleen klikkaamalla <a href=\"". $tarkastus ."\">tästä</a>."; } } //rekisteröityminen elseif (isset($_POST["rekisteroidy"])) { if (in_array($tunnus, $userit) == $null) { if ($salasana == $salasana2) { if (strlen($tunnus) >= 3) { if (strlen($salasana) >= 3) { $fo = fopen($tiedosto, "a"); flock($fo, 2); //lukitaan tiedosto fwrite($fo, $tunnus ."|". $email ."|". md5($salasana) ."|\n"); flock($fo, 3); //ja vapautetaan se fclose($fo); echo "<b>Kiitos rekisteröitymisestäsi!</b><br>\n"; echo "Voit nyt kirjautua sisään <a href=\"". $tarkastus ."\">tästä</a>."; } else { echo "<b>Epäkelpo salasana.</b><br>\n"; echo "Voit rekisteröityä toisella salasanalla klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>."; } } else { echo "<b>Epäkelpo tunnus \"<i>". $tunnus ."</i>\".</b><br>\n"; echo "Voit rekisteröityä toisella tunnuksella klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>."; } } else { echo "<b>Salasanat eivät täsmää.</b><br>\n"; echo "Voit rekisteröityä uudelleen klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>."; } } else { echo "<b>Tunnus \"<i>". $tunnus ."</i>\" on jo käytössä.</b><br>\n"; echo "Voit rekisteröityä toisella tunnuksella klikkaamalla <a href=\"". $tarkastus ."?act=rekisteroidy\">tästä</a>."; } } else { if ($_GET["act"] == "rekisteroidy") { echo "<form action=\"". $tarkastus ."\" method=\"post\">\n"; echo "<b>Rekisteröidy</b><br>\n"; echo "Jos sinulla on jo tunnus, <a href=\"". $tarkastus ."\">kirjaudu</a>.<br>\n"; echo "Tunnus: <input type=\"text\" name=\"tunnus\"><br>\n"; echo "E-mail: <input type=\"text\" name=\"email\"><br>\n"; echo "Salasana: <input type=\"password\" name=\"salasana\"><br>\n"; echo "Salasana uudelleen: <input type=\"password\" name=\"salasana2\"><br>\n"; echo "<input type=\"submit\" value=\"Rekisteröidy\" name=\"rekisteroidy\">\n"; echo "</form>"; } else { echo "<form action=\"". $tarkastus ."\" method=\"post\">\n"; echo "<b>Kirjaudu sisään</b><br>\n"; echo "Ole hyvä ja kirjaudu sisään. Jos sinulla ei ole tunnusta, <a href=\"". $tarkastus ."?act=rekisteroidy\">rekisteröidy</a>.<br>\n"; echo "Tunnus: <input type=\"text\" name=\"tunnus\"><br>\n"; echo "Salasana: <input type=\"password\" name=\"salasana\"><br>\n"; echo "<input type=\"submit\" value=\"Kirjaudu\" name=\"kirjaudu\">\n"; echo "</form>"; } } exit(); } ?>
Mikä tässä on vikana ja mitä pitäisi korjata?
Virheilmoitus kertoo, ettei voida enää totella cookien (sessioon liittyvä) lähetyskäskyä, koska se olisi pitänyt lähettää ennen kuin tulostat mitään sisältöä nettisivulle. Olet tulostanut (lähettänyt selaimelle) nämä rivit ennen minkään php-koodin suorittamista:
<HTML> <HEAD> <TITLE>site</TITLE> </HEAD> <BODY> <CENTER> <body bgcolor="black"> <FONT COLOR=white><img src="1.gif"><br><br><br><br>
Lisätietoa esim.: http://wiki.mureakuha.com/wiki/Mitä_tarkoittaa_
Laita ob_start() funktio sivun alkuun. Virhe tulee, koska tulostat tekstiä ennen session_start() funktiota.
Älä tulosta mitään ennen otsakkeita. Kuten virheilmoitus sanoo: tulostat index.php:ssä tavaraa ennen session_start
-funktiota eli otsakkeet on lähetetty jo.
Tulostuksen puskurointi on vain viritysratkaisu tuon korjaamiseen; parempi on suunnitella sovelluksen rakenne uudestaan, ettei mitään tarvitse tulostaa ennen otsakkeita.
Aivan, joo.. no etsimällä mureakuhasta tämä olisikin selvinnyt mutta kiitoksia nyt. Systeemi toimii nyt moitteetta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.