Memanggil data dengan PDO PHP

Topik ini merupakan sambungan dari dua topik sebelumnya. Topik ini membutuhkan tabel toko.barang dan variabel PDO bernama $db pada file sambung.php pada topik koneksi PDO. Dan juga data pada topik eksekusi sql dengan PDO. Tetapi Anda juga dapat menggunakan data Anda sendiri untuk ujicoba di sini.

Memanggil data dari database menggunakan PDO dapat dilakukan dengan PDO::query() atau PDOStatement::execute(). Data yang diambil dari database dapat diatur ke dalam bentuk array berindex angka, array berindex sesuai nama kolom, atau dalam bentuk objek dengan field sesuai nama kolom.

Memanggil data dengan PDO::query

<?php
include "sambung.php";
$sth = $db->query("SELECT * FROM barang");
while ($barang = $sth->fetch()) {
  echo "<pre>".print_r($barang,true)."</pre>";
}
?>

Output:

stdClass Object
(
    [id] => 1
    [tipe] => Chitato
    [kategori] => Snack
    [harga] => 7000
)
stdClass Object
(
    [id] => 2
    [tipe] => Mr. P
    [kategori] => Snack
    [harga] => 4500
)
stdClass Object
(
    [id] => 3
    [tipe] => Silver Queen Chunky Bar
    [kategori] => Snack
    [harga] => 9000
)
stdClass Object
(
    [id] => 4
    [tipe] => Sprite
    [kategori] => Minuman
    [harga] => 7500
)
stdClass Object
(
    [id] => 5
    [tipe] => Fanta
    [kategori] => Minuman
    [harga] => 7500
)
stdClass Object
(
    [id] => 6
    [tipe] => Coca Cola
    [kategori] => Minuman
    [harga] => 7500
)
stdClass Object
(
    [id] => 7
    [tipe] => Gudang Garam Surya
    [kategori] => Rokok
    [harga] => 17000
)
stdClass Object
(
    [id] => 8
    [tipe] => Dji Sam Soe
    [kategori] => Rokok
    [harga] => 13500
)

Pada contoh di atas, perintah $db->query() menghasilkan sebuah objek PDOStatement yang kita tampung di dalam variabel $sth. Variabel $sth tersebut langsung dapat kita pakai untuk memanggil data dengan perintah $sth->fetch()$sth->fetch() akan mengembalikan nilai selama masih ada baris data. Bila tidak ada baris data, maka $sth->fetch() akan mengembalikan false, sehingga pernyataan $baris=$sth->fetch() dapat kita letakkan di dalam kondisi while. Ketika masih ada data, maka akan masuk ke dalam struktur while, jika data sudah habis, maka akan keluar dari struktur while.

Perintah $sth->fetch() dapat mengembalikan nilai dalam berbagai format. Karena di dalam sambung.php terdapat baris program $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);, maka $sth->fetch() mengembalikan nilai dalam bentuk object. Kita juga dapat menentukan format nilai tersebut dengan menyertakan parameter pada method $sth->fetch(). Seperti dapat dilihat pada contoh berikut:

<?php
include "sambung.php";
$sth = $db->query("SELECT * FROM barang");
echo "<b>Fetch Obj</b><br />";
$barang = $sth->fetch(PDO::FETCH_OBJ);
echo "<pre>".print_r($barang,true)."</pre>";
echo "<b>Fetch Assoc</b><br />";
$barang = $sth->fetch(PDO::FETCH_ASSOC);
echo "<pre>".print_r($barang,true)."</pre>";
echo "<b>Fetch Num</b><br />";
$barang = $sth->fetch(PDO::FETCH_NUM);
echo "<pre>".print_r($barang,true)."</pre>";
echo "<b>Fetch Both</b><br />";
$barang = $sth->fetch(PDO::FETCH_BOTH);
echo "<pre>".print_r($barang,true)."</pre>";
?>

Output:

Fetch Obj
stdClass Object
(
    [id] => 1
    [tipe] => Chitato
    [kategori] => Snack
    [harga] => 7000
)
Fetch Assoc
Array
(
    [id] => 2
    [tipe] => Mr. P
    [kategori] => Snack
    [harga] => 4500
)
Fetch Num
Array
(
    [0] => 3
    [1] => Silver Queen Chunky Bar
    [2] => Snack
    [3] => 9000
)
Fetch Both
Array
(
    [id] => 4
    [0] => 4
    [tipe] => Sprite
    [1] => Sprite
    [kategori] => Minuman
    [2] => Minuman
    [harga] => 7500
    [3] => 7500
)

Selain mengambil nilai satu-persatu seperti di atas, kita juga dapat mengambil seluruh baris data secara sekaligus ke dalam array dengan $sth->fetchAll() seperti contoh berikut:

<?php
include "sambung.php";
$kat = $db->quote("Snack");
$sth = $db->query("SELECT * FROM barang WHERE kategori=$kat");
$barangs = $sth->fetchAll();
echo "<pre>".print_r($barangs,true)."</pre>";
?>

Output:

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [tipe] => Chitato
            [kategori] => Snack
            [harga] => 7000
        )

    [1] => stdClass Object
        (
            [id] => 2
            [tipe] => Mr. P
            [kategori] => Snack
            [harga] => 4500
        )

    [2] => stdClass Object
        (
            [id] => 3
            [tipe] => Silver Queen Chunky Bar
            [kategori] => Snack
            [harga] => 9000
        )

)

Sama seperti method $sth->fetch(), $sth->fetchAll() juga dapat diberi parameter untuk mengatur format data yang dikembalikan, seperti misalnya $sth->fetchAll(PDO::FETCH_ASSOC). Pada contoh di atas, kita juga menggunakan $db->quote() untuk mengamankan $kat dari SQL Injection, seandainya $kat berasal dari input oleh user.

Memanggil data dengan PDOStatement::execute

Sama seperti mengeksekusi perintah SQL, mengambil data melalui PDO juga dapat dilakukan dengan prepared statement. Untuk penjelasan lebih lengkap mengenai prepared statement, dapat membaca topik sebelumnya.

<?php
include "sambung.php";
$sth = $db->prepare("SELECT * FROM barang WHERE kategori=?");
$sth->execute(["Minuman"]);
$barangs = $sth->fetchAll();
echo "<pre>".print_r($barangs,true)."</pre>";
?>

Output:

Array
(
    [0] => stdClass Object
        (
            [id] => 4
            [tipe] => Sprite
            [kategori] => Minuman
            [harga] => 7500
        )

    [1] => stdClass Object
        (
            [id] => 5
            [tipe] => Fanta
            [kategori] => Minuman
            [harga] => 7500
        )

    [2] => stdClass Object
        (
            [id] => 6
            [tipe] => Coca Cola
            [kategori] => Minuman
            [harga] => 7500
        )

)

Seperti telah dijelaskan pada topik sebelumnya. Jika kita menggunakan prepared statement, tidak perlu khawatir akan SQL Injection. Tentunya kita juga dapat menghindari SQL Injection dengan gabungan $db->query() dan $db->quote(). Silahkan pilih cara yang paling efektif bagi Anda :) .