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