Cu metodele exec() si query() se executa imediat comenzile SQL adaugate in ele. Cu PDO e posibil sa fie pregatita o interogare SQL pentru executie fara ca sa fie transmisa imediat, pentru aceasta se foloseste metoda prepare().
prepare() preia ca argument o declaratie SQL si returneaza un obiect PDOStatement. Acest obiect are o metoda execute() prin care se executa declaratia SQL cand se doreste acest lucru, returneaza TRUE sau FALSE in caz de eroare. Sintaxa generala de aplicare este:
$obj = $obiectPDO->prepare("Interogare SQL");
$obj->execute(Array);
- La "Interogare SQL" se poate aplica orice instructiune pt. SQL: INSERT, SELECT, UPDATE, DELETE.
- Argumentul Array de la execute() e optional, acesta reprezinta un Array cu parametri ce corespund declaratiei SQL de la prepare(), si valorile care vor fi transmise la MySQL.
| id | | nume | | categorie | | adresa | ------------------------------------------------------------------------------------------------------------ | 1 | | Cursuri - Tutoriale | | educatie | | marplo.net | | 2 | | Curs PHP-MySQL | | programare | | marplo.net/php-mysql | | 3 | | Cursuri Engleza | | limbi straine | | marplo.net/engleza |
<?php // Datele de conectare (adresa_server, baza_de_date, nume si parola) $hostdb = 'localhost'; $namedb = 'teste'; $userdb = 'username'; $passdb = 'password'; try { // Conectare si creare obiect PDO $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb); $dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8 // Definire comanda SQL care va fi aplicata in metoda prepare() $sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`= :id OR `categorie`= :categorie"; $prep = $dbh->prepare($sql); // Interogarea e pregatita si stocata in $prep // Variabila Array cu valori ce trebuie adaugate in interogarea SQL pregatita (pt. ':id' si ':categorie') $ar_val = array('id'=>2, 'categorie'=>'educatie'); // Daca se executa cu succes interogarea, folosind execute() si valorile din $ar_val if($prep->execute($ar_val)) { // Parcurge si afiseaza randurile obtinute while($row = $prep->fetch()) echo $row['nume'].' - '.$row['adresa'].'<br />'; } /* Se executa inca o selectare, cu alte valori, aplicata aceleiasi declaratii SQL */ echo 'Select-ul 2<br />'; // Variabila Array cu valori ce trebuie adaugate in interogarea SQL pregatita (pt. ':id' si ':categorie') $ar_val = array('id'=>8, 'categorie'=>'limbi straine'); // Daca se executa interogarea, folosind execute() si valorile din $ar_val if($prep->execute($ar_val)) { // Parcurge si afiseaza randurile obtinute while($row = $prep->fetch()) echo $row['nume'].' - '.$row['adresa'].'<br />'; } $dbh = null; // Deconectare } catch(PDOException $e) { echo $e->getMessage(); } ?>- In expresia $sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`= :id OR `categorie`= :categorie";, ":id" si ":categorie" sunt parametri pentru valorile care vor fi preluate din Array, de la elementele cu aceeasi denumire la chei ('id' si 'categorie'). Datorita acestei notatii se poate folosi aceeasi comanda SQL pregatita, cu valori diferite.
In declaratia SQL pregatita, in loc de sintaxa :nume pentru locul valorilor se poate folosi caracterul ?, dar in acest caz, Array-ul cu valorile trebuie sa fie secvential (adica cu chei numere incepand de la 0), valorile vor fi preluate si adaugate la SQL in ordinea lor.
De exemplu:
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`=? OR `categorie`=?";
$prep = $dbh->prepare($sql);
$prep->execute(array(2, 'programare'));
Un alt mod de a transmite valori la o interogare SQL pregatita cu "prepare()" este utilizarea metodei bindValue() sau bindParam().
Utilizarea acestor metode in loc de Array are avantajul ca ofera un control mai bun asupra valorilor transmise, putand fi specificate prin atributele lor tipul de date si chiar numarul de caractere ce-l va avea valoarea transmisa. Ele se aplica la obiectul PDOStatement obtinut cu "prepare()".
Diferenta dintre bindValue si bindParam este:
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`= :id OR `categorie`= :categorie"; $prep = $dbh->prepare($sql); $prep->bindValue(':id', 2, PDO::PARAM_INT); // Transmite valoarea 2 la coloana "id" $prep->bindValue(':categorie', 'programare', PDO::PARAM_STR, 10); // Transmite valoarea "programare" la coloana "categorie" $prep->execute();
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`=? OR `categorie`=?"; $prep = $dbh->prepare($sql); $id = 2; $cat = 'programare'; $prep->bindParam(1, $id, PDO::PARAM_INT); // Transmite valoarea din variabila $id la coloana de la primul ? (adica "id") $prep->bindParam(2, $cat, PDO::PARAM_STR); // Transmite valoarea din variabila $cat la coloana de la al doilea ? (categorie) $prep->execute();
<?php // Datele de conectare (adresa_server, baza_de_date, nume si parola) $hostdb = 'localhost'; $namedb = 'teste'; $userdb = 'username'; $passdb = 'password'; try { // Conectare si creare obiect PDO $dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb); $dbh->exec("SET CHARACTER SET utf8"); // Setare encoding caractere UTF-8 // Definire comanda SQL care va fi aplicata in metoda prepare() $sql = "INSERT INTO `sites` (`nume`, `categorie`, `adresa`) VALUES (:nume, :categorie, :adresa)"; $prep = $dbh->prepare($sql); // Interogarea e pregatita si stocata in $prep // Se adauga valori cu bindValue $prep->bindValue(':nume', 'Curs Ajax', PDO::PARAM_STR); $prep->bindValue(':categorie', 'programare', PDO::PARAM_STR); $prep->bindValue(':adresa', 'marplo.net/ajax', PDO::PARAM_STR); // Daca datele sunt adaugate cu succes, afiseaza confirmare cu id-ul randului if($prep->execute()) echo 'A fost adaugat randul cu id='. $dbh->lastInsertId(); // Se definesc variabile cu valori ce vor fi incluse cu bindParam $nume = 'Jocuri Flash'; $categorie = 'jocuri'; $adresa = 'marplo.net/jocuri'; // Se includ variabilele $prep->bindParam(':nume', $nume, PDO::PARAM_STR); $prep->bindParam(':categorie', $categorie, PDO::PARAM_STR); $prep->bindParam(':adresa', $adresa, PDO::PARAM_STR); // Daca datele sunt adaugate cu succes, afiseaza confirmare cu id-ul randului if($prep->execute()) echo '<br />A fost adaugat randul cu id='. $dbh->lastInsertId(); $dbh = null; // Deconectare } catch(PDOException $e) { echo $e->getMessage(); } ?>- In browser va afisa:
// incorect $prep = $dbh->prepare("SELECT `coloana` FROM `tabel` WHERE `coloana` LIKE %:cuvant%"); $prep->bindValue(':cuvant', 'valoare'); // E CORECT $prep = $dbh->prepare("SELECT `coloana` FROM `tabel` WHERE `coloana` LIKE :cuvant"); $prep->bindValue(':cuvant', '%valoare%');
<input type="text" name="a_name" value="val" />
h3 { font-variant: small-caps; }
var msg = "Viziteaza CoursesWeb.net"; alert(msg);
$ip = $_SERVER["REMOTE_ADDR"]; echo $ip;
He actually came on time. - De fapt, el a venit la timp.
Hoy hace buen tiempo. - Astazi e vreme frumoasa.