 |
|
 |
Logimissüsteem sessioonide ja MySql baasil
Martin Rebane
Viimati uuendatud 29. detsember 2003
Nii, sa lugesid läbi artikli sessioonidest ja soovid nüüd nendega midagi ette v6tta. Võtame abiks MySqli ja ehitame endale väikese kasutajatuvastussüsteemi.
Eeldused: 1) Sa oled tuttav sessioonidega 2) Sul on olemas server, mis neid toetab 3) Serveril on MySql tugi ja sa tead, kuidas MySqli kasutada
Lets's Rock!
Esiteks loome kasutajate hoidmiseks MySQL tabeli. Seda võid teha otse MySQL käsurealt, phpMyAdmin abil või mõne PHP skripti abil.
create table kasutajad( id int auto_increment primary key not null, kasutajanimi varchar(255) not null unique, password char(32) not null, nimi varchar(255) not null, perenimi varchar(255) not null );
Iga lahtri lõppu panime not null, kuna on vaja, et kõik kasutaja kohta käivad lahtrid oleksid täidetud. Samuti on kasutajanime lõpus kirje 'unique', kuna meil ei ole mingit soovi saada kahte ühesuguse kasutajanimega kasutajat.
Kasutaja lisamiseks teeme vormi, paneme selle faili liitu.php:
<form method="post" action="kasutajalisamine.php"> <label>Sinu eesnimi: </label><input type="text" name="nimi" /> <br /> <label>Sinu tagumine nimi: </label><input type="text" name="perenimi" /> <br /> <label>Soovitav kasutajanimi: </label><input type="text" name="kasutajanimi" /> <br /> <label>Salasõna: </label><input type="password" name="pass1" /> <br /> <label>Salasõna kordus: </label><input type="password" name="pass2" /> <br /> <input type="submit" value="Registreeru" /> </form>
Kui kasutaja selle vormi täidab ja nupule vajutab, satub ta lehele kasutajalisamine.php, kuna vormi actioniga on nii määratud(action="kasutajalisamine.php").
kasutajalisamine.php failis paneme kõigepealt sessiooni püsti. Sessioonimuutujates hakkame hoidma infot kasutaja oleku(sisseloginud või mitte) kohta.
PHP kood:
session_start();
Defineerime mysql muutujad:
PHP kood:
$db_hostname="localhost"; //serveri nimi
$db_username="sinu sql kasutajanimi";
$db_password="sinu sql salas6na";
$db_database="sinu sql andmebaasi nimi";
Kontrollime, kas kõik väljad on täidetud:
PHP kood:
//nimekirja v2ljadest, mis peavad olema t2idetud, hoiame arrays
$mustbe = array(nimi, perenimi, kasutajanimi, pass1, pass2);
for($i=0; $i<sizeof($mustbe);$i++)
{
if (!strlen($_POST[$mustbe[$i]]))
{
$probla .= ' <b style="color: black;">'.$mustbe[$i].'</b>';
}
}
Kõigepealt võtsime kõikide kohustuslike väljade nimed arraysse(ehk koostasime nimekirja) ja siis kontrollisime 'for' tsükli abil järgi, kas kõik need on ka täidetud. For tsükli alguses seadsime $i nulliks ja iga korraga suurendasime seda yhe võrra. Tsüklit korrati nii kaua, kuni tingimus $i<sizeof($mustbe) on tõene ehk kuni $i on väiksem kui array $mustbe suurus.
Niisiis, juhul kui mingil kohustuslikul muutujal ei olnud pikkust, lisatakse muutuja nimi $probla'sse. Nüüd sätime errorteate ja kontrollime $probla üle:
PHP kood:
$correct = '<p>Vajuta brauseri BACK nuppu ja paranda probleem!</p>';
if(strlen($probla))
{
echo '<p style="font-size: 16px;">J2rgmised v2ljad on kohustuslikud: '.$probla.$correct;
}
Kui muutuja $probla omab pikkust, siis anname kasutajale veateate. Ent kui kõik oli korras, siis jätkame: - kontrollime, kas salasõna ikka on vähemalt 4 sümblit pikk ja kas 2 salasõna klapivad(palusime kasutajal ju salasõna 2 korda sisestada) - kontrollime andmebaasist, ega samasugust kasutajat juba olemas ei ole - kui kõik korras, siis lisame kasutaja
PHP kood:
else
{
//siin l2heb meil juba mysqli vaja, seega loome yhenduse
$db = mysql_connect($db_hostname,$db_username,$db_password);
mysql_select_db($db_database,$db);
//mysql loendab ära, mitu sellenimelist kasutajat juba on
$sqlcmd = "select count(id) from kasutajad where kasutajanimi='". addslashes($_POST['kasutajanimi'])."'";
$result = mysql_query($sqlcmd);
$i = mysql_fetch_row($result);
$total = $i[0];
//kontrollime, kas salasõna ikka on vähemalt 4 sümblit pikk
if(strlen($_POST["pass1"]) < 4)
{
$vastus= '<p style="font-size: 16px;">Salas6na peab olema v2hemalt 4 symbolit pikk! '.$correct;
}
//kas 2 passwordi klapivad
elseif($_POST["pass1"] != $_POST["pass2"])
{
$vastus = '<p style="font-size: 16px;">Sinu sisestatud salas6nad ei ole samad. Palun sisesta uuesti!'.$correct;
}
//kui kasutajanimi on juba olemas
elseif($total > 0)
{
$vastus = '<p class="head" style="font-size: 16px;">Kasutajanimi <b>'.$_POST["kasutajanimi"].'</b> on juba olemas, palun vali teine.'.$correct;
}
//kõik on korras, lisame kasutaja
else
{
mysql_query("insert into kasutajad values(0, '".addslashes($_POST["kasutajanimi"])."', password('".addslashes($_POST["pass1"])."'), '".addslashes($_POST["nimi"])."', '".addslashes($_POST["perenimi"])."')") or die('Eba6nnestus: '.mysql_error());
//paneme kasutajanime ja salas6na sessiooni
$_SESSION["kasutaja"] = $_POST["kasutajanimi"];
$_SESSION["password"] = $_POST["pass1"];
//suuname kasutaja salajane.php lehele
header("Location: salajane.php");
exit();
}
//kui mingi probleem oli, siis ütleme kasutajale, mis viga oli
//probleemi korral panime teate ju muutujasse $vastus
if(strlen($vastus))
{
echo $vastus;
}
}
?>
Ja lõpuks kandsime kasutaja andmed sessioonimuutujasse ning suunasime ta salajane.php lehele.
Kasutaja on registreeritud!!
Äsja saatsime ta meie "ainult kasutajatele" lehele. Selleks, nagu sa märkasid, on koodi lõpus header, mis juhatab kasutaja salajane.php faili. Lähme meiegi.
salajane.php on ainult kasutajatele mõeldud fail, seetõttu tuleb kontrollida, kas ikka õiged inimesed siia tulnud on. Faili algusesse lisame kindlasti sessiooni alustamise funktsiooni, et sessioon ikka olemas oleks. Seejärel mysql ühenduseks vajalik kraam.
PHP kood:
<?php
$db_hostname="localhost"; //serveri nimi
$db_username="mysqli_kasutajanimi";
$db_password="salasõna";
$db_database="andmebaasi_nimi";
session_start();
//kui on olemas kasutajanimi ja password
if(strlen($_SESSION["kasutaja"]) && strlen($_SESSION["password"]))
{
//loome mysql yhenduse
$db = mysql_connect($db_hostname,$db_username,$db_password);
mysql_select_db($db_database,$db);
$sqlcmd='select count(id) from kasutajad where kasutajanimi="'. addslashes($_SESSION["kasutaja"]).'" AND password=password("'.addslashes($_SESSION["password"]).'")';
$result = mysql_query($sqlcmd);
$i = mysql_fetch_row($result);
//kui nimi ja pass ei klappinud...
if($i[0]!=1)
{
//saadame kasutaja logimise lehele
header('Location: login.php');
exit();
}
}
//juhul, kui sessioonimuutujal $_SESSION["kasutaja"] ei ole pikkust..
else
{
//...saadame kasutaja logimisele
header("location: login.php");
exit();
}
?>
Kui kasutajatele mõeldud sektsioonis on rohkem faile, kui salajane.php, siis on soovitav ülalolev koodilõik salvestada eraldi faili(nt sellesama nimega salajane.php) ja lisada ta require('salajane.php); abil kõikide kaitsmist vajavate failide päisesse.
Kasutajate sisselogimine
Kuid kui kasutajad hiljem lehele tagasi tulevad, siis on nende sessioon juba aegnud ning neil on vaja uuesti sisse logida juba olemasolevate kasutajatunnustega.
login.php on lihne form, kuha kasutaja sisestab kasutajanime ja salasõna ning nupule vajutades jõuame login2.php peale, kus toimub kasutajanime ning salasõna kontroll.
<!-- login.php --> <form method="post" action="login2.php"> Kasutajanimi: <input type="text" name="kasutaja" /> <br /> Salasõna: <input type="password" name="pass" /> <br /> <input type="submit" value="Logi sisse" /> </form>
ja login2.php on pea samasuguse ülesehitusega nagu iga salajase lehe päises asuv fail salajane.php, ainult sessioonimuutujate asemel on kasutusel $_POST muutujad(ehk vormist tulnud info):
PHP kood:
<?php
$db_hostname="localhost"; //serveri nimi
$db_username="mysqli_kasutajanimi";
$db_password="salasõna";
$db_database="andmebaasi_nimi";
//kui on olemas kasutajanimi ja password
if(strlen($_POST["kasutaja"]) && strlen($_POST["pass"]))
{
$db = mysql_connect($db_hostname,$db_username,$db_password);
mysql_select_db($db_database,$db);
$sqlcmd='select count(id) from kasutajad where kasutajanimi="'.addslashes($_POST["kasutaja"]).'" AND password=password("'.addslashes($_POST["pass"]).'")';
$result = mysql_query($sqlcmd);
$i = mysql_fetch_row($result);
//kui nimi ja pass ei klappinud...
if($i[0]!=1)
{
header('Location: login.php');
exit();
}
elseif($i[0]==1)
{
session_start();
$_SESSION["kasutaja"] = $_POST["kasutaja"];
$_SESSION["password"] = $_POST["pass"];
header("Location: salajane.php");
exit();
}
}
//juhul, kui $_POST["kasutaja"] ei ole pikkust...
else
{
//...saadame kasutaja logimisele
header("location: login.php");
exit();
}
?>
..kui salasõna oli õige, siis saab kasutaja sisse, kui ei olnud, siis läheb uuesti logima.
Muide, ehk märkasid koodis, et MySQLiga ühenduse loomine oli jäetud alles sinna, kus seda ka juba vaja on. Seda selleks, et vältida mittevajalike ühenduste loomist mysqliga(sest äkki ei olegi kasutajanime sisestatud ning meil pole midagi kontrollida - seega server teeks asjata tööd ning skript looks pahalastele eeldused serveri ülekoormamiseks).
Logimissüsteemi kood zip failis: logimissysteem.zip
Artikli kommentaarid
Tänud Allar Olgole ja Andre Voolaidile täpsustuste eest.
|