Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ongelmia kirjautumissysteemissä

luffy [05.06.2010 15:25:54]

#

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?

Chiman [05.06.2010 15:32:25]

#

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_'Headers_already_sent'-virheilmoitus?

Macro [05.06.2010 15:33:12]

#

Laita ob_start() funktio sivun alkuun. Virhe tulee, koska tulostat tekstiä ennen session_start() funktiota.

trilog [05.06.2010 15:36:34]

#

Ä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.

luffy [05.06.2010 16:58:48]

#

Aivan, joo.. no etsimällä mureakuhasta tämä olisikin selvinnyt mutta kiitoksia nyt. Systeemi toimii nyt moitteetta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta