Jdi na navigaci předmětu

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

$statement = $pdo->query('SELECT * FROM `product` WHERE id = 1');
print_r($statement->getColumnMeta(2));
print_r($statement->fetch());
Výsledek
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
)

Iterování nad daty

  • PDOStatement implementuje 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ý řádek

    Pří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 dotazu

    Pří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 sedan
  • PDO::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 dotazu

    Příklad použití
    $statement = $pdo->query('SELECT name FROM `product`');
    $statement->fetch(PDO::FETCH_COLUMN); // vrací Mitsubishi Lancer
  • PDO::FETCH_FUNC (pouze u funkce PDOStatement::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í je stdClass); 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.