Lompat ke konten utama

Kompetisi Ajak Teman: hadiah total Rp1.000.000 tunai untuk 3 pengajak terbanyak. Berakhir 29 November 2026. Ikut kompetisi

←

PHP Dasar

Pelajaran 13 dari 15

PHP di web: formulir, basis data, dan galat

PDO dan prepared statement

Setelah pelajaran ini kamu bisa memilih kueri PDO yang aman dari injeksi SQL dan menebak hasil kueri berparameter.

±13 menitDiperiksa 5 Okt 2026

Materi

PDO adalah antarmuka PHP untuk berbicara dengan basis data. Koneksi dibuat dengan `new PDO($dsn, $pengguna, $sandi)`; DSN menyebut jenis dan letak basis datanya, misalnya `mysql:host=localhost;dbname=toko` untuk MySQL atau `sqlite::memory:` untuk SQLite di memori, yang dipakai contoh kelas ini.

Kesalahan paling berbahaya adalah menyusun SQL dengan menggabung masukan pengguna, misalnya `"... WHERE nama = '$cari'"`. Bila seseorang mengirim `x' OR '1'='1`, kuerinya berubah makna dan mengembalikan semua baris. Itulah injeksi SQL; kategori dan pertahanan lainnya dibahas di kelas Keamanan Siber untuk Organisasi.

Pertahanan utamanya prepared statement. Kueri ditulis dengan placeholder `?` atau `:nama` lewat `prepare()`, lalu nilainya dikirim terpisah lewat `execute([...])`. Manual PHP menyebut parameter prepared statement tidak perlu dikutip dan pengembang bisa yakin tidak ada injeksi SQL, asalkan bagian lain kueri tidak dibangun dari masukan tanpa escape. Placeholder hanya untuk NILAI, bukan nama tabel atau kolom. Hasil dibaca dengan `fetch()` per baris atau `fetchAll()` sekaligus.

<?php
$db = new PDO("sqlite::memory:");
$db->exec("CREATE TABLE produk (nama TEXT, stok INTEGER)");
$s = $db->prepare("INSERT INTO produk VALUES (?, ?)");
$s->execute(["Kopi Gayo", 12]);
$s->execute(["Teh Tubruk", 0]);
echo $db->query("SELECT COUNT(*) FROM produk")->fetchColumn(); // 2

Latihan

0/3 lulus

Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.

Latihan 1 dari 3

$email berasal dari formulir. Mana yang mengirimnya ke basis data dengan aman?

Pilih satu jawaban

Latihan 2 dari 3

Apa keluaran program ini?

<?php
$db = new PDO("sqlite::memory:");
$db->exec("CREATE TABLE produk (nama TEXT, stok INTEGER)");
$db->exec("INSERT INTO produk VALUES ('Kopi Gayo', 12), ('Teh Tubruk', 0), ('Gula Aren', 5)");

$minimal = 1;
$s = $db->prepare("SELECT nama FROM produk WHERE stok >= ? ORDER BY stok");
$s->execute([$minimal]);
while ($baris = $s->fetch(PDO::FETCH_ASSOC)) {
    echo $baris["nama"] . "\n";
}
Pilih satu jawaban

Latihan 3 dari 3

Tabel produk berisi tiga baris (Kopi Gayo, Teh Tubruk, Gula Aren). Apa keluaran program ini?

<?php
// $db sudah berisi tabel produk dengan tiga baris
$cari = "x' OR '1'='1";
$a = $db->query("SELECT nama FROM produk WHERE nama = '$cari'")->fetchAll();
$s = $db->prepare("SELECT nama FROM produk WHERE nama = ?");
$s->execute([$cari]);
$b = $s->fetchAll();
echo count($a) . " " . count($b);
Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Luluskan semua latihan dulu untuk menandai pelajaran ini selesai.

Lanjutkan ke