Skip to content

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 100

Query 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()

  1. Argumen 1: SQL template dengan placeholder
  2. Argumen 2: Array of actual values
  3. WordPress meng-escape semua nilai secara aman
  4. Return: string SQL yang aman untuk dieksekusi

Placeholder Types

PlaceholderTipeContoh
%sString'dog', 'green'
%dDigit/Number2018, 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), karena get_results() mengembalikan array of objects secara default.