În partea anterioară a ghidului complet în PHP am discutat despre lucrurile elementare: variabile, funcții și integrarea formularelor cu PHP. Partea a doua a ghidului este o completare la prima și nu numai, tot în aceasta putând fi găsite  informații despre loops, arrays și câteva funcții noi ce le-ai putea utiliza în proiectele tale. Ținând cont că formele HTML sunt principalul loc unde apare PHP, m-am gândit că ar fi mai bine dacă aș amănunți și mai mult acest capitol.

În tutorialul anterior s-a discutat despre $_POST și $_GET. În acesta vom discuta de încă 3 variabile superglobale: $_FILES, $_COOKIES și $_SESSION.

 

1.$_FILES – încărcarea unei imagini

Mai jos este un exemplu edificator care va arată cum puteți maxima utilizarea funcției $_FILES. Puteți găsi o mulțime de informații pe manualul php.net, dar în exemplul de mai jos o să găsiți toate informațiile necesare pentru a înțelege exemplul. Totuși, înainte de a vedea exemplul o să vă spun unde puteți utiliza aceasta funcție. Funcția $_FILES se utilizează în special la încărcarea imaginilor, videoclipurilor sau mai bine spus a aplicațiilor media.

<?php
//Verificam daca forma este trimisa
if (isset($_POST['submit'])) {
        //Am creat un nou folder pentru a hosta imaginilor numit uploads
    $target="uploads/";
        //Verificam care este numele fisierului
    $file_name=$_FILES['file']['name'];
        //Verificam care este numele temporar al imaginii
    $tmp_dir=$_FILES['file']['tmp_name'];

        //Incercam daca fisierele inacarcate au un anumit format
    try {
        if(!preg_match('/(gif|jpe?g|png)$/i', $file_name))
        {
            throw new Exception("Nu e prea bine...incearca alt format!");
            exit;
        }
                //Mutam imaginea recent incarcata din fisierul temporar in folderul uploads
        move_uploaded_file($tmp_dir, $target.$file_name);
        $status=true;
    }
    catch (Exception $e){
        $e->getMessage();
    }
}

?>
<html>
<body>
<form action="" method="POST" enctype="multipart/form-data">
<label for="mesaj">Incarca propria imagine:</label><br/>
<input type="file" name="file" id="file"/><br/>
<input type="submit" name="submit" value="Incarca!"/>
</form>
<?php
if(isset($status)) {
    $path=$target.$file_name;
    echo $alt;
}
?>
</body>
</html>

Iar acum, să explicăm codul de mai sus. Forma HTML știm cu toții pentru ce este, dar singurul lucru nou ce l-am adăugat este enctype(type of encoding). El anunță browser-ul că prin acest formular se vor încărca pe server fișiere, date în general și de aceea vom avea nevoie ca acesta să ne furnizeze niște mici elemente particulare.

Cum funcționează file upload? Chiar și în absența codului PHP, imaginea este încărcată într-un fișier temporar, cu un nume temporar de asemenea. Codul PHP doar preia imaginea din folderul temporar și o plasează în folderul creat de noi, uploads. Simplificat spus, va trebui să luăm o imagine dintr-un loc și să o punem în alt loc.

Începem cu două variabile, $file_name respectiv $tmp_dir. Prima variabilă ne ajută să aflăm numele imaginii, iar $tmp_dir ne furnizează numele temporar al imaginii.

În pasul următor identificăm formatul imaginii și aruncăm o excepție dacă nu am găsit un format corespunzător. În acest exemplu prindem excepția cu blocul catch, deși adesea preferăm doar să o aruncăm și să o prindem în altă parte. Pentru a realiza verificarea formatului utilizăm funcția preg_match. Preg_match este o funcție care verifica dacă un parametru sau mai mulți există într-un anumit string sau o variabilă în cazul nostru. Fără $ de la final, userul ar putea încărca un fișier de forma gif.exe, lucru nedorit. Deci…după cum vă așteptați $-ul forțează ca imaginea să aibă extensiile specificate numai la final.

Adăugarea operatorului ! la început semnalează dacă cerința nu este respectată – dacă nu s-a găsit vreo extensie corespunzătoare atunci afișează un anumit mesaj. Dacă cerința este respectată atunci vom muta fila recent încărcată în folderul uploads. De asemenea, dacă am ajuns în acel punct înseamnă ca toți parametrii au fost adevărați – vom actualiza variabila $status, căreia îi vom asigna parametrul true.

Apoi scriptul PHP merge sub forma HTML.Dacă scriptul a ajuns în stadiul în care a încărcat imaginea, înseamnă că totul a fost adevărat => $status este „pornit”. Dacă variabila este „pornită”, atunci putem în final să-i dăm userului un link pentru a-și vedea imaginea.

 

2.$_COOKIE – Când și unde să-l utilizăm?

Un cookie este utilizat adesea pentru a identifica un user. El conține o cantitate redusă de informații pe care site-ul și-ar dori să le insereze în computerul userului. De fiecare dată când intri pe aceeași pagină într-un browser, se va trimite cookie-ul deja existent, iar în acest fel se oferă un grad de permanentizare site-ului(ex. username și parola gata completate până săptămâna viitoare). Putem utiliza PHP pentru a crea și citi cookie-uri.

În exemplul de mai jos puteți vedea un caz simplu de utilizare a cookie-urilor – afișarea unui mesaj de bun venit. Dacă intri pentru prima oară pe acea pagina te va întâmpina cu un mesaj de bun venit! Dacă intri a doua, a treia sau a n-oara te va întâmpina cu un alt mesaj. Când userul intră pe pagina recent creată el nu are nici un cookie în calculator de la acea pagină. Fiindcă nu are, afișăm mesajul de bun venit și creăm un cookie. Cookie-ul va rămâne stocat pe PC și, la următoarea vizită, îi vom arată alt mesaj…simplu! Iar acum să transpunem în cod.

<?php

//Verificam daca exista respectivul cookie pe calculatorul userului
if(!isset($_COOKIE['cookie1'])) {
    //Daca nu exista trimitem un mesaj de bun venit
    $status="Bine ai venit la noi pe site!Inregistreaza-te si fi activ in comunitate!";

    //Cream cookie-ul
    setcookie('cookie1', 1, time()*3600*24);
    /*
    Se observa ca functia setcookie are 3 parametrii:
       1.Primul este numele cookie-ului
       2.Al doilea este pur si simplu o valoare numerica pusa la intamplare
       3.Al treilea este pentru a vedea cand va expira cookie-ul;
                    in cazul nostru intr-o zi.
    */

}
else {

    //Daca exista vom arata mesajul acesta
    $status="Bine ai revenit la noi pe website!";
}
?>
<html>
<body>
<?php if(isset($status)) echo $status."<br/>"; ?>
<h1>MarianPC - Numai tutoriale</h1>
<p>Doar un fel de continut dummy ce il puteti schimba cu orice doriti!</p>
<!--Linkul catre pagina care va sterge cookie-ul-->
<a href="elimina.php">Elimina cookie-ul</a>
</body>
</html>

Iar acum codul pentru eliminare.php, pagina ce ne va ajuta să ștergem cookie-ul. Ștergându-l vom primi din nou mesajul de întâmpinare pentru un nou venit.

<?php

/*Setam cookieul la o data din trecut.
In modul acesta cookie-ul va expira*/
setcookie('cookie1', 1, time()-3600);

//Redirectionam userul din nou la pagina cookies.php
header ("location:cookies.php");

?>

 

3.$_SESSION

Față de funcția $_COOKIE, unde putem seta timpul până la autodistrugerea cookie-ului, funcția $_SESSION se va autodistruge imediat după ce ieși din browser. Iar acum te întrebi? La ce ne-ar ajuta asta? Nu ar fi mai bine să utilizăm atunci funcția $_COOKIE? Principala trăsătură a unui cookie este timpul său de expirare. Acela este un parametru fix, dar există foarte multe cazuri când am vrea un cookie mai special, activ doar când user-ul este pe site. Odată ce userul pleacă, am vrea să ștergem acel cookie. Totuși o astfel de abordare presupune un timp de expirare variabil…userul e asincron…pleacă și vine când vrea. Tocmai de aceea, apare necesitatea unei noțiuni noi, sesiunea(studenții înțeleg ((-: ).

De asemenea, și din motive de siguranță, utilizăm $_SESSION fiindcă cine știe…un hacker ar putea să descarce acel cookie și ar putea să îți vadă astfel username-ul și parola.

Mai jos este un exemplu elocvent care vă arată importanța funcției session; este un script de logare ce conține 3 file PHP. Prima conține pagina de logare, a doua este pagina destinată membrilor, iar a treia este cea de delogare.

<?php
session_start();
$_SESSION["username"]=$username;
$_SESSION["password"]=$password;
?>

<html>
<body>
<form action="index.php" method="POST">
Your username:<input type="text" name="user" id="user"/><br/>
Your password:<input type="password" name="pass" id="pass"/><br/>
<input type="submit" name="submit"/>
</form>
</body>
</html>

<?php
// Definim doua constante de logare la baza de date
define("DB_USER", "root");
define("DB_PASS", "");

//Verificam daca forma a fost trimisa
if(isset($_POST['submit'])) {
    //Preluam informatiile din forma HTML
    $user=$_POST['user'];
    $pass=$_POST['pass'];
    //Ne conectam la baza de date
    try {
        // Folosim obiectul PDO cu parametrii corespunzatori
        $conn = new PDO('mysql:host=localhost;dbname=login', DB_USER, DB_PASS);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        /* Cream un empty query pe care il trimitem la server - deschiderea unui 
        canal la baza de date MySQL - prepaired statements */
        $data = $conn->prepare("SELECT username, password FROM users WHERE username=:user AND password=:pass");
        // Executam structura de date pe canalul deschis
        $data->execute(array(
            ':user' => $user,
            ':pass' => $pass
        ));
        foreach($data as $row) {
            $username=$row['username'];
            $password=$row['password'];
        }
    } catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    } //Verificam daca informatiile introduse de utilizator coincid cu cele din baza de date 
    if ($user==$username&&$pass==$password) { 
        echo "Combinatia este ok!<br/>"; 
        echo "Username:<b>".$username."</b>"."<br/>Password: <b>".$password."</b>"; 
        echo "Mergi la pagina membrilor <a href=\"login.php\">Members page</a>"; 
    } else { 
        echo "Te rog introdu un username si parola corespunzatoare"; 
    } 
    echo "<br/>"; 
} 
?>

Acum să explicăm ce este cu pagina de mai sus. Singurul lucru pe care îl punctez este că pentru a ne conecta la baza de date folosim PDO(PHP Data Objects). El este de fapt o clasă ce conține o mulțime de metode. Pentru a accesa aceste metode trebuie desigur să ne-o instanțiem printr-un obiect și să accesăm metodele de bază, pentru a ne putea conecta și interoga baza de date. Dacă studiați mai atent codul o să observați că este și un pic de MySQL. În tutoriale nu am acoperit și MySQL, dar puteți afla o mulțime de lucruri pe mysql.com sau php.net. Dar ca să vă fie mai ușor, mai jos este codul MySQL necesar pentru a crea tabelele și baza de date.

CREATE DATABASE  `login`;
CREATE TABLE  `login1`.`users` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,`username` VARCHAR( 60 ) NOT NULL ,`password` VARCHAR( 11 ) NOT NULL) ENGINE = MYISAM ;

După ce am creat baza de date, cu tabelul și cele 3 câmpuri am introdus un username și o parolă.

Se observă ca sus, în antet am creat o sesiune care să memoreze parola și username-ul. Acestea provin de la variabilele din partea de jos a scriptului.

<?php

//Pornim sesiunea
session_start();
//Verificam daca sesiunea din index.php exista
if (!$_SESSION["username"]&&!$_SESSION['password']) {
header ("location:index.php");
}
//Daca totul este bine atunci vei vedea pagina membrilor
else {
?>
<html>
<body>

<h1>Welcome to the members area</h1>
<p>Just a dummy text only for design purposes</p>
<a href="logout.php">Logout</a>

</body>
</html>
<?php
}
?>

Iar acum pagina de logout:

<?php
session_start();

session_destroy();
//Redirectionam userul pe index.php
header("location:index.php");
?>

Din exemplele de mai sus putem observa un lucru.Pentru a initializa o sesiune trebuie declarata sus în antetul paginii. Pentru a face acest lucru utilizăm funcția session_start(); și pentru a termina o sesiune, inclusiv cu informațiile ce le conține vom utiliza funcția session_destroy(); care trebuie să fie desigur după session_start();

Pentru sugestii sau eventuale completări nu evitați să lăsați un comentariu.

Alătură-te conversației

1 comentariu

Lasă un comentariu

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Send this to a friend