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