PDOStatement ce inseamna?

Salutare,

In clasa PDO

PDO {
public __construct ( string $dsn [, string $username [, string $passwd [, array $options ]]] )
public bool beginTransaction ( void )
public bool commit ( void )
public string errorCode ( void )
public array errorInfo ( void )
public int exec ( string $statement )
public mixed getAttribute ( int $attribute )
public static array getAvailableDrivers ( void )
public bool inTransaction ( void )
public string lastInsertId ([ string $name = NULL ] )
public PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
public PDOStatement query ( string $statement )
public string quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] )
public bool rollBack ( void )
public bool setAttribute ( int $attribute , mixed $value )
}

apare:

public PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
public PDOStatement query ( string $statement )

Ce reprezinta PDOStatement?

Multumesc!

http://php.net/manual/en/class.pdostatement.php

http://php.net/manual/ro/pdo.query.php

http://php.net/manual/ro/pdo.prepare.php

PS: Prin anii '90 era o vorba: RTFM :slight_smile:

2 Likes

ideea este ca de acolo vin :slight_smile:

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):

    $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
      $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
      print $data;
    }

Î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).

4 Likes

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 ()

Va multumesc!

Nu stiu daca PDO-ul este cel mai bun exemplu de a invata OOP. Ma uit pe codul sursa si vad ca este implementat in C

Aici ai un tutorial de oop in PHP

Aici poti gasi codul sursa al PDO-ului.

Sper sa te ajute ceea ce am scris pe aici :slight_smile:


Raspunsul lui @redecs este foarte bun !
Am mai invatat cate ceva azi !

1 Like

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.

1 Like

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.

2 Likes