Citeste rubrica “Valori intoarse” sau “Returned Values”
PDO::query() returns a PDOStatement object, or FALSE on failure.
If the database server successfully prepares the statement, PDO::prepare() returns a PDOStatement object. If the database server cannot successfully prepare the statement, PDO::prepare() returns FALSE or emits PDOException (depending on error handling).
De asemenea vezi si exemplele. Iti arata cum sa le folosesti
Pe scurt: PDOStatement este o interogare “abstractă”, ca să zic așa, nu este chiar o interogare SQL, ci una cu care PDO poate lucra mai ușor (o poate refolosi, optimizând anumite operațiuni).
Într-o interogare de genul SELECT * FROM products WHERE color = :color; vei avea o instanță de PDOStatement în care tu poți substitui valoarea lui color cu ce vrei tu, fără să fie nevoie creezi o instanță nouă.
Un alt caz în care în care PDOStatement este util (din documentație):
În loc să citește toate înregistrările din tablela ta (presumunem că sunt multe) și să le ții în memorie, vei citi rezultatele rând cu rând, și în felul ăsta aplicația ta va consuma mai puține resurse (memorie).
Sunt la inceput de drum in ceea ce priveste OOP/PDO si incerc sa-mi lamuresc cateva neclaritati.
Imi imaginez clasa PDO ca un arbore de forma cu urmatoarele metode:
PDO
|-- public exec ()
|-- public prepare ()
|-- public query ()
Cautand informatii mai multe despre pdo.query() pe http://php.net/manual/ro/pdo.query.php am dat peste:
public PDOStatement PDO::query ( string $statement )
public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_COLUMN , int $colno )
Din cunostintele mele cand dau peste ceva de genul PDO::query ma duce cu gandul la metode statice, dar query() in clasa PDO nu este definit ca static, dar o apelez sub forma $query = $conn->query() nu sub forma $query = $conn::query()
Cautand mai profund in query() ma duce cu gandul la urmatorul arbore
PDO
|-- public exec ()
|-- public prepare ()
|-- public query ()
|-- public fetch ()
|-- public fetchAll ()
|-- public fetchColumn ()
Am urmatorul cod:
$conn = new PDO (.....);
$sql = "SELECT * FROM table";
\\ apelez la una din metodele din clasa PDO si anume query()
$query = $conn->query()
Daca verific ce este cu $query prin var_dump($query);
primesc ca rezultat: object(PDOStatement)#2 (1) { [“queryString”]=> string(19) “SELECT * FROM table” } element necunoscut pentru mine (lucru care m-a determinat sa intreb aici), dar ma face sa gandesc ca variabila $query este un obiect al unui fel de metoda/clasa query()
// ca sa vad coloanele aferente codului $sql trebuie sa apelez la una din metodele care se afla in query()
$row = $query->fetch() // care are o multitudine de argumente
Iar arborele meu imaginar ajunge sa arate cam asa:
PDO
|-- public exec ()
|-- public prepare ()
|-- public query ()
|-- public fetch ()
|-- PDO::FETCH_ASSOC
|-- PDO::FETCH_CLASS
|-- PDO::FETCH_NUM
|-- public fetchAll ()
|-- public fetchColumn ()
PDO::query() nu prea are cum să fie static. De exemplu, ce s-ar întampla dacă ai deschis două conexiuni, la baze de date diferite? Pe care dintre ele ar apela-o metoda ta statică?
Legat de utilizarea lui PDO::query() in sine… Nu prea mi se pare utilă functia asta, pentru ca nu ai nicio metodă (corectă) de a pasa argumente interogării. De exemplu, cum faci un query care să-ţi aducă un set de inregistrări care să corespundă unor condiţii, fară a mânări sql-ul şi făra a escape variabilele? Well… va trebui să foloseşti prepare() şi execute() (ceea ce de fapt face query(), intern.
Din ce ai zis până acum nu e reieşit în mod clar că ştii ce anume este prepared statement.
Logica ta este bună, am văzut multe clase pentru lucru cu baza de date făcute de diverși (care aveau o strctură similiară cu ce ai descris tu.
Între timp a apărut PDO care este mult mai versital și ține cont atât de paradigme OOP cât și de cele în lucrul cu baze de date (cum ar fi cursoare sau prepared statements, de care zicea și @serghei).
Lucrurile astea vor căpăta mai mult sens pe măsură ce înveți mai multe despre OOP și lucrurl cu baze de date.