PDO sau Mysqli ce imi recomandati ?

Pana acum am lucrat cu mysql simplu cel vechi…
Acum vreau sa ma slefuiesc un pic sa incep cu ceva nou.
Ce imi recomandati PDO sau Mysqli ?
Sau ce alt limbaj mai modern

Pai recomandarea mea este PDO, functiile MySQLi_* ofera posibilitatea de a lucra doar cu o singura baza de date, si anume, MySQL, in timp ce PDO iti ofera posibilitatea de a lucra cu mai multe baze de date.Functiile MySQL_* sunt scoase din ultima versiune PHP, PHP 7.O alta recomandare, daca continui pe acest limbaj de scripting, foloseste ultima versiune PHP, aceasta oferind multe lucruri interesante.De asemenea, daca simti ca te repeti mereu folosind PDO, poti sa folosesti o librarie, de exemplu, Doctrine, ce ofera o interactionare “mai usora” cu baza de date, aceasta folosind, de altfel, PDO.

Daca inca folosesti stilul de programare procedurala, ei bine, aceasta este bun pentru proiectele mai mici, dar pentru proiectele mai mari, OOP ( Programare Orientata pe Obiecte ) este ceea ce trebuie sa folosesti deoarece te ajuta sa iti organizezi codul mult mai bine, in componente refolosibile, fiecare componenta avand un rol specific.

Javascript pare limbajul “momentului” daca doresti sa inveti un alt limbaj de scripting.

1 Like

Am observat la codul pdo

$stmt = $pdo->prepare("INSERT INTO users SET $set");
$stmt->execute($values);

acel $stmt , este recomandat incluirea lui cu functia care o face ? gen in loc de $stmt sa pun $insert_user ?

Ma gandesc ca daca in index.php am interogarea pt titltu_site,descriere_site,cuvinte_cheie cu interogarea $stmt
Iar in config.php am aceias interogare $stmt pentru logo,nume_site

si config vine cu include (); in index.php

Afecteaza cu ceva ? si atunci trebuie sa inlocuiesc $stmt ?

Unul din avantajele folosirii PDO sau chiar MySQLi, este ca iti ofera posibilitatea de a scapa de SQL Injection folosind prepared statments, de unde si numele variabilei tale $stmt, insa, tu, acolo, nu te folosesti de aceasta caracteristica, si de asemenea, ceea ce faci tu nu este bine deloc, deoarece propozitia SQL este vulnerabila.

Uite, un exemplu, simplu:

$username = 'Catalin';

// pregatim propozitia SQL
$stmt = $db->prepare("SEECT * FROM users WHERE username = :username");

// executam propozitia SQL si atribuim o valoare pentru :username
$stmt->execute(['username' => $username]);

// preluam rezultatul sub forma unui obiect
$user = $stmt->fetch(PDO::FETCH_OBJ);

// daca variabila $user nu are valoarea NULL
if ($user) {
    echo $user->username;
}

Cand propozitia SQL este executat, :username este inlocuit cu valoarea variabilei $username.

Folosind prepared statments te asiguri ca propoztiile SQL nu sunt vulnerabile SQL Injection.Mai sunt si alte avantaje ale folosirii acestui concept.

Numele variabilei $stmt trebuie sa reprezinte ceea ce vrei sa faci, daca introduci un nou utilizator un tabelul users, poti avea $createUser s.a.m.d

PDO::FETCH_OBJ reprezinta forma sub care vrei sa stochezi rezultatul/rezultatele, mai exista si alte variante precum PDO::FETCH_ASSOC ( matrice asociativa ) s.a.m.d

1 Like

Eu am dat un exemplu de functie

de folosit am folosit-o asa

$add_bonat = $pdo->prepare("INSERT INTO cotos_abonament (email, data_add) VALUES (:email, NOW())");
  $add_bonat->execute(array(':email' => $_POST['email']));

Perfect, apropo, ai grija si cu gestionarea erorilor/exceptiilor emise de PDO in cazul in care ceva nu este bine.

1 Like

Am sa incerc sa invat PDO exersand, lucrez la un site de imobiliare acum pur si simplu din lipsa de ocupatie…
Astfel vreau sa invat si PDO practicand.

Sper sa nu gresesc procedand asa , sa invat in stilul acesta !

O chestie iar interesanta

try {
$dbh = new PDO("mysql:host=$hostname;dbname=pressgym_press", $username, $password);
/*** echo a message saying we have connected ***/
$qry = $dbh->prepare('INSERT INTO contact (Name, Email Address, Message, Date) VALUES (?, ?, ?, ?');
$qry->execute(array('Brandon', '[email protected]', 'test message', '3.12.12'));

echo 'entry succesfull';

}
catch(PDOException $e)
{
echo $e->getMessage();
}

si codul fara TRY

if (!empty($_POST)) {

  require 'config.php';

  $add_bonat = $pdo->prepare("INSERT INTO cotos_abonament (email, data_add) VALUES (:email, NOW())");
  $add_bonat->execute(array(':email' => $_POST['email']));

  // Redirectionat catre index.php
  header ('Location: index.php');
  exit;
} 
else 
{
header ('Location: index.php');
  exit;	
}

Se procedeaza la fel ca in mysql si in cazul pdo, atunci cand informam asupra unei restrictii ?

if( preg_match( "/[^[.,_,0-9a-z]/i" , $email)){
	echo '<table width="753">
	<tr valign="center">
		<td valign="center" style="border:1px dashed #0078ff;" align="center" bgcolor="White">
			<font color="Black" size="1"><b>Emailul trebuie sa contina numai caractere alfanumerice 0-9 A-Z</b></font>
		</td>
		</tr></table>';
	}

Exceptiile sunt modul in care se gestioneaza “erorile” unui obiect.Sunt o caracteristica foarte importanta, asa ca iti sugerez sa te documentezi bine.Dupa ce stii ce si cum, cauta informatii despre gestionarea “erorilor” atunci cand folosesti PDO.Poti deschide alte subiecte pe devforum, sunt persoane mult mai bine pregatite care te pot ajuta.

Apropo, foarte important, separa codul HTML de codul PHP.

1 Like

Si anume cum ? :-?

Pai muta codul HTML din fisierele PHP, in alte fisiere intr-un folder, sa zicem, views si apoi include aceste fisiere in fisierele PHP.

poti incerca si clasa mea http://sqlclassphp.sourceforge.net/ de fapt e o colectie de clase pentru a porta mai usor un proiect de pe mysql pe mysqli sau alte tipuri de bd. Ai in arhiva zip exemple de folosire si nu trebuie sa inveti nimic nou.

cauta pe net tutoriale despre design patterns si mvc sau mva sau alte tipuri de design patterns si vezi exemple de cum se separa codul. uite aici o sursa (nu stiu cat va mai fi valabil domeniul ala asa ca citeste-le repede sau salveaza-le local)

Nu inteleg la ce ma ajuta sa despart codul php de cel html , avand in vedere ca nu fac un site cu teme care se schimba… e ceva static :slight_smile:

Iti organizezi mai bine aplicatiile separandu-le in 3 componente: controllers, models si views; poti cauta mai multe informatii pe net :smiley: Nu e musai sa folosesti aceasta forma de structurare a aplicatiilor, dar iti ofera foarte multe beneficii, mai ales atunci cand lucrezi folosind stilul de programare orientat pe obiecte.

function setari_pagini($pagina) {

$setari_pag = $pdo->query('SELECT * FROM cotos_pagini WHERE tip_pagina = "despre_noi"');
while ($row = $setari_pag->fetch())
{
 echo '<title>'.$row['titlu_pagina'].'</title>
<meta name="keywords" content="'.$row['keywords_pagina'].'" />
<meta name="description" content="'.$row['descriere_pagina'].'" />';
}

}

Notice: Undefined variable: pdo in C:\xampp\htdocs\core.php on line 14

Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\core.php:14 Stack trace: #0 C:\xampp\htdocs\despre-noi.php(9): setari_pagini(‘despre_noi’) #1 {main} thrown in C:\xampp\htdocs\core.php on line 14

Nu inteleg de ce-mi da eroarea asta :frowning:

Suntem în anul de graţie 2016.

Părerea mea este că ar trebui să începi să foloseşti un framework care să aibă integrat un ORM.
Poţi încerca Symphony, Laravel, Codeigniter, mai sunt multe altele care au un ORM mai simplu sau mai complex.

Nu poţi fi competitiv ca programator şi să lucrezi cu query-uri scrise de mână. Atât dpdv al siguranţei cât şi al reutilizării codului.

Da, în query-uri directe se pot face optimizări, se pot face treburi mai avansate, dar acelea sunt deja pentru experţi şi atunci când site-ul are câteva sute de vizite pe secundă şi discutăm de optimizare de costuri, sau de purişti care vorbesc în propoziţii SQL şi-n somn :slight_smile:

Tutoriale sunt peste tot, trebuie doar să alegi unul şi să mergi pe el.

1 Like

Nu recomand sa lasam orm-ul sa faca interogarile. Unul din principalele motive e faptul ca aplicatia va creste incet spre un monstru neoptimizat, in care echipa de programare pierde controlul resurselor. Am vazut de prea multe ori scenariul acesta incat sa nu il semnalez.

Sunt de acord cu asta, dar tot timpul trebuie să găsim un echilibru între mai multe lucruri, timp, bani, maintainability optimizare etc.

Orice framework decent îţi dă posibilitatea să faci tu manual query-uri care se pot optimiza, iar apoi se încărca în obiecte.

Nu sunt nici adeptul optimizărilor înainte de a fi necesare.