Query Database & Keamanan SQL
Gambaran Umum
Video ini membahas cara query custom table menggunakan $wpdb->get_results(), keamanan SQL dengan $wpdb->prepare(), dan menampilkan data di template HTML.
Dasar SQL di Adminer
Sebelum menulis PHP, praktik SQL langsung di Adminer:
sql
-- Semua pet, 50 pertama
SELECT * FROM wp_pets LIMIT 50
-- Hanya kucing
SELECT * FROM wp_pets WHERE species = 'cat'
-- Kucing lahir setelah 2017
SELECT * FROM wp_pets WHERE species = 'cat' AND birthyear > 2017
-- Urutkan berdasarkan tahun lahir
SELECT * FROM wp_pets WHERE species = 'cat' AND birthyear > 2017 ORDER BY birthyear ASC
-- Hanya kolom tertentu
SELECT petname, birthyear FROM wp_pets LIMIT 100Query dari PHP: $wpdb->get_results()
Query Dasar
php
global $wpdb;
$tableName = $wpdb->prefix . 'pets';
$pets = $wpdb->get_results("SELECT * FROM $tableName LIMIT 100");get_results()→ return array of objects- Setiap object memiliki property sesuai kolom tabel
- Akses:
$pet->petname,$pet->species, dll.
Keamanan SQL: $wpdb->prepare()
Masalah SQL Injection
php
// BERBAHAYA — jangan pernah lakukan ini:
$species = $_GET['species']; // Bisa berisi kode SQL jahat!
$pets = $wpdb->get_results("SELECT * FROM wp_pets WHERE species = '$species'");Solusi: Prepare Statement
php
global $wpdb;
$tableName = $wpdb->prefix . 'pets';
$ourQuery = $wpdb->prepare(
"SELECT * FROM $tableName WHERE species = %s AND birthyear > %d LIMIT 10",
array('hamster', 2018)
);
$pets = $wpdb->get_results($ourQuery);Cara Kerja $wpdb->prepare()
- Argumen 1: SQL template dengan placeholder
- Argumen 2: Array of actual values
- WordPress meng-escape semua nilai secara aman
- Return: string SQL yang aman untuk dieksekusi
Placeholder Types
| Placeholder | Tipe | Contoh |
|---|---|---|
%s | String | 'dog', 'green' |
%d | Digit/Number | 2018, 50 |
Kapan prepare() Diperlukan?
- WAJIB saat ada nilai dinamis/user-generated di query
- Tidak perlu jika seluruh SQL string di-hardcode oleh developer
- Best practice: Selalu gunakan
prepare()kalau ragu
Menampilkan Data di Template
Template HTML dengan PHP Loop
php
<?php
global $wpdb;
$tableName = $wpdb->prefix . 'pets';
$pets = $wpdb->get_results(
$wpdb->prepare("SELECT * FROM $tableName LIMIT 100")
);
?>
<table>
<tr>
<th>Name</th><th>Species</th><th>Weight</th>
<th>Birth Year</th><th>Hobby</th><th>Color</th><th>Food</th>
</tr>
<?php foreach($pets as $pet) { ?>
<tr>
<td><?php echo $pet->petname; ?></td>
<td><?php echo $pet->species; ?></td>
<td><?php echo $pet->petweight; ?></td>
<td><?php echo $pet->birthyear; ?></td>
<td><?php echo $pet->favehobby; ?></td>
<td><?php echo $pet->favecolor; ?></td>
<td><?php echo $pet->favefood; ?></td>
</tr>
<?php } ?>
</table>Data dari custom table menggunakan
->(object notation), bukan['key'](array notation), karenaget_results()mengembalikan array of objects secara default.