Array
(
[native_type] => double
[pdo_type] => 2
[sqlite:decl_type] => double precision
[table] => product
[flags] => Array
(
)
[name] => price
[len] => -1
[precision] => 0
)
Array
(
[id] => 1
[0] => 1
[name] => Mitsubishi Lancer
[1] => Mitsubishi Lancer
[price] => 320000
[2] => 320000
[vat_rate] => 0.21
[3] => 0.21
)Dotazování pomocí PDO
Příklady na této stránce byly spuštěny nad vzorovou databází produktů.
SQL
Pro připomenutí:
PDOStatement
PDOStatementreprezentuje dotaz, který databáze provedla nebo v budoucnu může provést- Instance
PDOStatementvzniká…- …jako výsledek metody PDO :: query,.
- …jako připravený dotaz.
- Slouží ke spuštění dotazu a získání jeho výsledků
PDOStatement::getColumnMeta(): vrátí metadata o zadaném sloupci- Užitečné pro knihovny pracující s databází
- Volitelná součást PDO rozhraní ⇒ ne vždy musí být dostupné
PDOStatement::setFetchMode(): nastaví režim formátování dat (viz dále)PDOStatement::rowCount(): vrátí počet řádků, které byly dotazem změněnyPDOStatement::newRowset(): přesune ukazatel na další řádek (ovlivňujefetch*()metody, viz níže)PDOStatement::errorCode(): vrátí informace o poslední chybě, ke které v databázi došlo
$statement = $pdo->query('SELECT * FROM `product` WHERE id = 1');
print_r($statement->getColumnMeta(2));
print_r($statement->fetch());Výsledek
Iterování nad daty
PDOStatementimplementuje rozhraníIteratorAggregate, instanci tedy lze použít jako iterátor- Syntaktický cukr pro opakované volání
PDOStatement::fetch() - Databáze stále musí načíst všechna požadovaná data najednou; použitím se nesníží náročnost dotazu.
$statement = $pdo->query('SELECT * FROM `product` WHERE id = 1');
foreach($statement as $row) {
print_r($row);
}Výsledek
Array
(
[id] => 1
[0] => 1
[name] => Mitsubishi Lancer
[1] => Mitsubishi Lancer
[price] => 320000
[2] => 320000
[vat_rate] => 0.21
[3] => 0.21
)Metody pro získávání dat
PDOStatement::fetch(): první zatím nevrácený řádekPříklad použití
$statement = $pdo->query('SELECT * FROM product'); print("== První volání ==\n"); print_r($statement->fetch()); print("== Druhé volání ==\n"); print_r($statement->fetch());Výsledek:
== První volání == Array ( [id] => 1 [0] => 1 [name] => Mitsubishi Lancer [1] => Mitsubishi Lancer [price] => 320000 [2] => 320000 [vat_rate] => 0.21 [3] => 0.21 ) == Druhé volání == Array ( [id] => 2 [0] => 2 [name] => Škoda Octavia [1] => Škoda Octavia [price] => 960000 [2] => 960000 [vat_rate] => 0.21 [3] => 0.21 )PDOStatement::fetchAll(): získání všech řádků z dotazuPříklad použití
$statement = $pdo->query('SELECT * FROM product'); print_r($statement->fetchAll());Výsledek:
Array ( [0] => Array ( [id] => 1 [0] => 1 [name] => Mitsubishi Lancer [1] => Mitsubishi Lancer [price] => 320000 [2] => 320000 [vat_rate] => 0.21 [3] => 0.21 ) [1] => Array ( [id] => 2 [0] => 2 [name] => Škoda Octavia [1] => Škoda Octavia [price] => 960000 [2] => 960000 [vat_rate] => 0.21 [3] => 0.21 ) [2] => Array ( [id] => 3 [0] => 3 [name] => BMW 3 sedan [1] => BMW 3 sedan [price] => 1300000 [2] => 1300000 [vat_rate] => 0.21 [3] => 0.21 ) )PDO::fetchColumn(): vrátí konkrétní sloupec z prvního dosud nevráceného řádku (pořadí sloupce je určeno argumentem)Příklad použití
$statement = $pdo->query('SELECT * FROM product'); $statement->fetchColumn(0); // vrátí 1 $statement->fetchColumn(0); // vrátí 2 $statement->fetchColumn(1); // vrátí BMW 3 sedanPDO::fetchObject(): vrátí první dosud nevrácený řádek jako objekt (ve výchozím stavu využívástdClass, lze použít i jiná třída, viz dále)Příklad použití
$statement = $pdo->query('SELECT * FROM `product`'); $object = $statement->fetchObject(); print_r($object->name); // vypíše Mitsubishi Lancer
Režimy formátování dat
- Formát, v jakém fetch funkce vrátí data, lze upravit předáním příslušného režimu formátování dat (všechny fetch funkce jej přijímají jako argument)
PDO::FETCH_BOTH(výchozí): data vrátí jako pole, jehož indexy jsou čísla i názvy sloupcůPříklad použití
$statement = $pdo->query('SELECT * FROM `product`'); $result = $statement->fetch(PDO::FETCH_BOTH); print_r($result);Výsledek:
Array ( [id] => 1 [0] => 1 [name] => Mitsubishi Lancer [1] => Mitsubishi Lancer [price] => 320000 [2] => 320000 [vat_rate] => 0.21 [3] => 0.21 )PDO::FETCH_ASSOC: data vrátí jako pole, jehož indexy jsou názvy sloupcůPříklad použití
$statement = $pdo->query('SELECT * FROM `product`'); $result = $statement->fetch(PDO::FETCH_ASSOC); print_r($result);Výsledek:
Array ( [id] => 1 [name] => Mitsubishi Lancer [price] => 320000 [vat_rate] => 0.21 )PDO::FETCH_NUM: data vrátí jako pole s číselnými indexy (sloupce jsou v pořadí, v jakém je dotaz vrátil)Příklad použití
$statement = $pdo->query('SELECT * FROM `product`'); $result = $statement->fetch(PDO::FETCH_NUM); print_r($result);Výsledek:
Array ( [0] => 1 [1] => Mitsubishi Lancer [2] => 320000 [3] => 0.21 )PDO::FETCH_COLUMN: vrátí první sloupec dotazuPříklad použití
$statement = $pdo->query('SELECT name FROM `product`'); $statement->fetch(PDO::FETCH_COLUMN); // vrací Mitsubishi LancerPDO::FETCH_FUNC(pouze u funkcePDOStatement::fetchAll()): data předá jako argumenty zadané funkci (názvem argumentu je název sloupce)Příklad použití
Použití:
$statement = $pdo->query('SELECT * FROM `product`'); $result = $statement->fetchAll( PDO::FETCH_FUNC, function ($id, $name, $price, $vat_rate) { // vrací první písmeno řetězce // mb_substr je potřeba kvůli UTF-8 return mb_substr($name, 0, 1); } ); print_r($result);Vypíše:
Array ( [0] => M [1] => Š [2] => B )PDO::FETCH_CLASS: data vrátí jako nově vytvořenou instanci zadané třídy (výchozí jestdClass); více viz níže (doporučujeme spíše nepoužívat)Příklad použití
$statement = $pdo->query('SELECT * FROM `product`'); // potřeba setFetchMode(), protože FETCH_CLASS vyžaduje argument $statement->setFetchMode(PDO::FETCH_CLASS, \stdClass::class); print_r($statement->fetch());Výsledek:
stdClass Object ( [id] => 1 [name] => Mitsubishi Lancer [price] => 320000 [vat_rate] => 0.21 )- Další méně časté režimy jsou popsané v referenční dokumentaci.