Kod:
= = = = = = = = = = = = = = =
Naziv:
Osnova konekcije na mysql i logovanje korisnika- sessija
- - - - - - - - - - - - - - -
Oblast:
PHP/HTML
- - - - - - - - - - - - - - -
Autor:
Nikola Djokic
- - - - - - - - - - - - - - -
Dodatno:
Težina ovog tutorijala je na srednje-osnovnom nivou.
Znaci morate da posedujete osnovno znanje php-a i programiranja da biste razumeli.
= = = = = = = = = = = = = = =
Ovde cu vam prestaviti jednu mogucu osnovu vase php/database aplikacije. Ona sadrzi:
/inc/config.php - Osnovni config fajl
/inc/dbclass.php - Klasa za bazu podataka i sesiju, mozda i nije najbolja praksa da se obe klase stave u jedan fajl
login.php - Login forma
index.php - Provera da li je korisnik ulogovan i slanje na login formu ako nije.
logout.php - Odjava korisnika
config.php - Ovde mislim da je sve jasno, samo smo nabrojali 6 konstanti
PHP kod:
<?php
= = = = = = = = = = = = = = = PART I
define('MY_SERVER_ADR', "http://localhost/"); //adresa do aplikacije
define('MY_PATH', "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs");//fizicka putanja do aplikacije na disku
define("MY_SQL_HOST", "localhost"); //adresa mysql servera
define("MY_SQL_USER", "user"); //korisnicko ime
define("MY_SQL_PASS", "pass"); //lozinka
define("MY_SQL_DB", "database"); //ime baze koju koristite
= = = = = = = = = = = = = = =
?>
dbclass.php
PHP kod:
= = = = = = = = = = = = = = = PART II
<?php
include'/config.php';
class MyDb //Nasa database klasa, u nju treba stavljati vase upite koje cesto koristite u oblicima funkcija, 2 primera imaju dole
{
var $MyHost; //host za bazu
var $MyUser; //Korisnicko ime
var $MyPass; //Lozinka
var $MyDbName; //Ime baze sa kojom radimo
var $con; //nasa konekcija
var $lastERR; // Zadnja greska koja se javila
function __construct() //konstruktor klase
{
$this->MyHost= MY_SQL_HOST;
$this->MyUser= MY_SQL_USER;
$this->MyPass= MY_SQL_PASS;
$this->MyDbName= MY_SQL_DB;
$this->db_connect();
}
function db_connect() //konektovanje na bazu, moze i da se pozove u konstruktoru
{
$this->con=mysql_connect($this->MyHost,$this->MyUser,$this->MyPass);
$n=10; //Broj koliko ce puta pokusati da se konektuje
for($n=0;$this->con==false and $i<n;$i++)
{
$this->con=mysql_connect($this->MyHost,$this->MyUser,$this->MyPass);
}
if(! $this->con)echo mysql_error($this->con);
mysql_select_db($this->MyDbName,$this->con);
}
function db_query($my_query) //Osnovni sirovi upit
{
$this->lastERR = "";
$result=mysql_query($my_query,$this->con);
if(!$result){
$this->lastERR = mysql_error();
}
return $result;
}
function db_delete($table,$id) //brisanje iz tabele po ID-u, napomena: tabela mora imati ID kolonu
{
$this->lastERR = "";
$my_query="DELETE FROM ".$table ." WHERE id='". $id . "'";
$result=mysql_query($my_query,$this->con);
if(!$result){
$this->lastERR = mysql_error();
}
return $result;
}
function is_there($table, $key, $value) //Da li postoji neki podatak u bazi
//Na primer da li postoji korisnik nnnn, u tom slucaju bi bilo: $table='korisnici'; key='nick'; $value='nnnn';
//Ovako nesto je korisno imati, jel ce cesto trebati neka provera pre unosa, neko ce reci dobro ako je element u bazi unique,
//baza ce prijaviti gresku, ali to onda znaci proveru koji je tipa greska pa, onda odluciti sta dalje.
{
$my_query="SELECT COUNT(*) FROM ".$table." WHERE ".$key." = '".$value."' ";
//echo $my_query;
//die();
$result=mysql_query($my_query,$this->con);
$rez=mysql_fetch_assoc($result);
if($rez['COUNT(*)']>0)
return true;
else return false;
}
}
class Mysession //Klasa za sesiju
{
public static function start() //Jasno, startovanje sesije
{
session_start();
}
public static function auth($user,$pass)//Autentikacija korisnika
{
global $db; //Znaci da cemo koristiti globalni objekat klase Mydb, a ne neku lokalnu promenjivu
$result= $db->db_query("SELECT * FROM korisnici WHERE korisnicko_ime='".addslashes($user)."' and
lozinka ='".addslashes($pass)."';");
//addslashes - funkcija koja dodaje escape znak ispred specijalnih karaktera koji bi mogli da uticu na upit O'nill postaje O\'Nill
if($row=mysql_fetch_assoc($result)) //vraca red iz rezultata u niz na asocijativan nacin, detaljno pojasnjenje dole
{
$_SESSION['user']=$row['ime']; //$_SESSION - to je globalna promenjiva nase sesije
$_SESSION['access']=$row['access']; //ovde dodeljujemo 2 vrednosti user i access, promenjivama sessije. One se cuvaju sve dok korisnik
//ne zatvori pretrazivac
return(true);//Prosla je autentifikacija korisnika iliti postoji u bazi.
}
return(false);//Nije prosla. Ovde se mogu raditi neke dodatne provere, da li je korisnicko ime neispravno, password i vratita ta informacija.
}
public static function is_admin() // Da li je logovani korisnik administrator? Ovo se moze koristiti za razne nivoe pristupa, rankove itd
{
if($_SESSION['user']!="")
{
return $_SESSION['access']; // U mom slucaju 1 je bio administator, 0 obican korisnik
}
else return -1; //ukoliko nije ulogovan
}
public static function get_name() // Vraca ime trenutno logovanog korisnika
{
if($_SESSION['user']!="") return $_SESSION['user'];
else return "";
}
public static function is_logged() //Da li je neko logovan na sistem
{
if ($_SESSION['user']!="")
return 1;
else
return 0;
}
}
$db=new MyDb(); // Pravljenje objekta MyDb;
Mysession::start(); //Startovanje sessije.
?>
= = = = = = = = = = = = = = =
$row=mysql_fetch_assoc($result) - Vec sam rekao da ovo vraca red iz rezultujuce tabele kao associjativan niz. Sta to znaci pa to znaci da ako ste imali tabelu u bazi |ID| |Ime| |email| imacete niz koji je indeksiran associjativno, znaci po nazivma kolona. znaci imacemo $row['ID'], $row['Ime'], $row['email'] Preporucujem da kotisti ovakav nacin indeksiranja, jel u realnom radu mnogo lakse i pregledniji kod postane. Napomena, index je case sensitive sto znaci da ako vam je u bazi Ime mora da bude ne a ne ime ili IME.
Login forma, ovde cemo videti jednostavnu login formu. Supstina je da imamo formu koja na submit "baca"opet na sebe gde se vrsi provera, ako provera prodje, on na vraca na onu stranicu sa koje smo dosli. Primer pozivanja je sledeci
login.php
PHP kod:
= = = = = = = = = = = = = = = PART III
<?php
require_once "inc/config.php";
require_once "inc/dbclass.php";
$prebaci_na=$_GET["prebaci_na"]; //prebaci_na - adresa gde se vracamo
//Stranicu uvek pozivamo sa neke druge stranice, na primer imamo 4 stranice u aplikacij, dve su dozvoljene za
//citanje svakome a dve zahtevaju da se korisnik uloguje, kada korisnik pokusa da otvori "zabranjenu" stranicu ona ga baca vamo,
// i kada prodje login opet vraca odkale je dosao
if (empty($prebaci_na)) $prebaci_na=MY_SERVER_ADR; //Ukoliko ne postoji vrati na pocetnu stranu
if(isset($_REQUEST["potvrdi"])) //isset - proverava da li je unesena forma
{
if(Mysession::auth($_POST["user"],$_POST["pass"])) //Pokusaj logavanja, pogledati dbclass.php
{
header("Location: ".$prebaci_na); //Ukoliko je proslo logovanje prebaci gde trba
die();
}
else
{ Ako nije izbaciti prozorce korisniku
?>
<script type="text/javascript">
alert("Greska u loginu, molimo pokusajte opet");
</script>
<?php
}
}
?>
<center><br>
<font class="Arial12"><b>Prijava na sistem</b></font>
<form method="POST" <!--Klasicna forma sa metodom post-->
action="login.php?prebaci_na=<?=urlencode($prebaci_na)?>"> <!--Ovde smo koristili short tags umesto <?php echo urlencode($prebaci_na); ?>-->
Korisnicko ime: <input type="text" name="user" size=15><br>
<br>
Lozinka: <input type="password" name="pass" size=15><br>
<br>
<input type="submit" name="potvrdi" value="Prijavite se"></form>
</center>
I evo mali primer kako izlgeda kada neka stranica
index.php
PHP kod:
= = = = = = = = = = = = = = = PART IV
<?php
require_once "inc/config.php";
require_once "inc/dbclass.php";
if(Mysession::is_logged()!=1)//Da li smo ulogovani?
{
header("Location: login.php?prebaci_na=".urlencode($_SERVER['PHP_SELF'])); //Nismo, prebaci nas na login
die();
}
?>
I za sam kraj
logout.php
PHP kod:
= = = = = = = = = = = = = = = PART V
<?php
session_start();
session_unset();
session_destroy();
header("Location: index.php");
die();
?>
Ako imate nekih pitanja slobodno pitajte. Mozda kod i nije najlepsi, ali mislim da se moze svatiti i da sluzi kao osnova za dalje unaredjivanje.
Bookmarks