Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kirjautuminen ja käyttäjän tunnistus?

belthaxor [29.08.2007 07:36:27]

#

Hei!

Olen yrittänyt kohta viikon tehdä itse PHP:tä ja tietokantoja (MySQL) apuna käyttäen käyttäjän kirjautumisen sivuille. Olen käyttänyt apuna paljonkin täältä foorumeilta/oppaista löytyviä tietoja, mutta nyt on tullut seinä vastaan enkä pääse enään yhtään eteenpäin, joten tarvitsen kokeneemman apua.

Eli olen luonut tietokannan, jossa on 5 riviä (id, tunnus, salasana, last_load ja istunto). Id on taulukon avain ja istunto on uniikki.

Sitten loin kirjautumislomakkeen eli index.php

<html>
<head>
</head>
<body>

<form method="post" action="kirjautuminen.php">
Tunnus: <input type="text" name="tunnus" id="tunnus" size="20" maxlength="20"><br>
Salasana: <input type="password" name="salasana" id="salasana" size="20" maxlength="20"><br>
<input type="submit" value="Kirjaudu">
</form>
</body>
</html>

tämän jälkeen loin kirjautuminen.php:n, jonka tarkoitus on varmistaa käyttäjän olemassaolo tietokannasta ja näin ollen ohjata käyttäjä sisälle sivustoon (config-tiedostosta löytyy tietokantani kirjautumistiedot):

<?php
/* CONFIG -TIEDOSTO */
include("config.php");
/* YHTEYS SERVERIIN */
$Ink = mysql_connect($db_server,$db_user,$db_passwd) or die ("Yhteys tietokantaan epäonnistui!");
/* YHTEYS TIETOKANTAAN */
mysql_select_db($db_db,$Ink) or die ("Tietokannan valitseminen epäonnistui!");

isset($_POST['tunnus']) && isset($_POST['salasana']);

  //muuttujat turvallisesti talteen
   $tunnus = get_magic_quotes_gpc() ? $_POST['tunnus'] : mysql_real_escape_string($_POST['tunnus']);
   $salasana = get_magic_quotes_gpc() ? $_POST['salasana'] : mysql_real_escape_string($_POST['salasana']);

   //luodaan käyttäjäkohtainen uniikki id
   $avain = time() . $tunnus . $salasana . getenv("REMOTE_ADDR");
   $istuntotunnus = md5($avain);

/* SISÄÄNKIRJAUTUMINEN */
   //lisätään istunto tietokantaan käyttäjän tietoihin
if(mysql_query("UPDATE $tbl_users
   SET istunto = '$istuntotunnus'
   WHERE tunnus = '$tunnus'
   AND salasana = PASSWORD('$salasana')",$Ink) or die (mysql_error()))
{
   //jos lisättyjä rivejä on yksi, kirjautuminen onnistui
   if(mysql_affected_rows($Ink) == 1)
   {
	setcookie("istunto","$istuntotunnus",time()+3600,"/");
      header("Location: http://www.omasivustoni.com/kokeilu/sisalla");
	exit;
   }
   else
   {
         header("Location: http://www.omasivustoni.com/kokeilu/");
	exit;
   }
}
else
{
      header("Location: http://www.omasivustoni.com/kokeilu/");
	exit;
}

?>

tähän asti kaikki näyttää toimivan. Mutta kun kirjaudun sisälle ja haluan että joka sivunlatauksen aikana ohjelma tarkistaa, onko cookie vielä voimassa ja että täsmääkö se tietokannassa olevan cookien kanssa - tulee ongelmia!

tämänhetkinen koodi on seuraavanlainen:

<?php

/* CONFIG -TIEDOSTO */
include("../config.php");
/* YHTEYS SERVERIIN */
$Ink = mysql_connect($db_server,$db_user,$db_passwd) or die ("Yhteys tietokantaan epäonnistui!");
/* YHTEYS TIETOKANTAAN */
mysql_select_db($db_db,$Ink) or die ("Tietokannan valitseminen epäonnistui!");

/* KÄYTTÄJÄN TUNNISTUS */

if(isset($_COOKIE['istuntotunnus']))
{

   //HAETAAN KÄYTTÄJÄN TIEDOT
   $sql = "SELECT
   id,
   tunnus,
   DATE_FORMAT(last_load,'%d.%m.%y %h:%i:%s') AS last_load
   FROM {$tbl_users}
   WHERE istunto = '".mysql_real_escape_string($_COOKIE['istuntotunnus'])."'";
   $sql = mysql_query($sql,$Ink);

   if($sql && mysql_num_rows($sql) == 1)
   {
     //käyttäjä tunnistettu, kaikki kunnossa
      $user = mysql_fetch_assoc($sql);
      //nyt käyttäjän tiedot ovat mukavasti $user[]-taulukossa
      //esim. käyttäjän id löytyy $user['id'] ja tunnus $user['tunnus']

      //lisätään vielä käyttäjän viimeisestä sivunlatauksesta aikaleima
      mysql_query("UPDATE {$tbl_users} SET
      last_load = NOW()
      WHERE id = ".$user['id'], $Ink);

   }
}

?>

Ongelmana näyttää olevan se, että tuossa on paljon if-komentoja, mutta jos if- komento toteutuu niin ei ole määritelty mitä se tekee ja jos taas if-komento ei toteudu niin ei ole määritelty että mitä se tekee sittenkään? Nyt kun menen kokeilemeen tuota koodia, niin se vaan päästää sisään koko ajan, oli cookie käytössä vielä tai ei! :(

Parannusehdotuksia / vastaavaa?

ystävällisin terveisin: Belthaxor

Antti Laaksonen [29.08.2007 10:55:39]

#

Tuosta viimeisestä koodista taitaa tosiaan puuttua pari else-haaraa, jotka estävät sivun katselun kirjautumattomilta. Eli laita molempien tapausten (evästettä ei ole tai istuntoa ei ole tietokannassa) else-kohtaan vaikka samanlainen ohjaus kirjautumissivulle kuin tiedostossa kirjautuminen.php.

Vielä yksi huomautus:

isset($_POST['tunnus']) && isset($_POST['salasana']);

Tämä rivi ei tee mitään, koska sen tuottamaa totuusarvoa ei käsitellä.

belthaxor [30.08.2007 14:04:27]

#

jeps, kiitos vastauksesta.

tosiaankin laitoin samanlailla nuo iffien else-haarat sinne, mutta ei lähtenyt vieläkään toimimaan.

Pidin parin päivän tauon ja otin tänään koodin uudelleen tarkastelun kohteeksi ja huomasin että vika oli siinä, että kirjautumisessa luon "istunto" -nimisen evästeen ja tarkistuksessa yritin hakea "istuntotunnus" -nimistä evästettä käyttöön ja eihän sellaista ollut olemassakaan. :D

heh, aina tää parin päivän tauko näistä koodihommist auttaa...kiitos vielä antille kommentista! O/

Vastaus

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

Tietoa sivustosta