Site icon Mawan.NET

Begini Penggunaan PDO Yang Benar

Sudah lama saya tidak menulis di Blog ini. Mungkin penyebabnya karena saya terlalu sibuk dengan pekerjaan dan diklat. Ceritanya begini teman-teman. Saya sedang menggarap suatu proyek berbasis Laravel yang ternyata di balik hambatan yang ditemui, saya mendapat banyak pelajaran berharga yang beberapa akan saya bagikan di tulisan ini.

Saya juga sibuk menempuh program Pendidikan Calon Guru Penggerak angkatan 7 yang ketika artikel ini diketik, saya telah menempuh modul 2.2. (Sayang, artikel ini tidak bisa dijadikan setoran tugas Aksi Nyata).

Oke, tidak usah berbasa-basi terlalu lama. Ini dia oleh-oleh dari kegiatan pembuatan aplikasi komputer yang sering memaksa saya harus begadang sampai larut malam.

Penggunaan PDO yang benar

Umumnya programmer web memakai PHP dan MySQL atau MariaDB. Saya pun begitu. Sampai suatu saat, saya mencoba membuat versi lain dari sebuah aplikasi yang telah berjalan. Yang dipakai adalah PostgreSQL.

Saya pikir, “Cukup ganti connection string-nya. Maka aplikasi pun berjalan lancar.”

Ohoho ternyata tidak semudah itu.

PostgreSQL ternyata lebih “kaku” dibandingkan dengan MySQL. Ibarat manusia, JavaScript dan MySQL adalah pemaaf. Di Guru Penggerak mungkin seperti guru yang memerankan posisi kontrol “teman”. Sedangkan bahasa C dan PostgreSQL mirip guru bertipe “pemantau”. Guru bertipe “pemantau” akan bertanya seperti ini ketika bertemu dengan murid yang terlambat masuk sekolah. “Kamu tahu sekarang jam berapa? Kamu tahu peraturan masuk sekolah jam berapa? Apa hukumannya untuk yang terlambat?”

Mana yang lebih baik? Semua baik. Ada yang suka cara MySQL yang pemaaf. Ada juga yang suka cara PostgreSQL yang “harus sesuai peraturan”.

Contohnya pada variabel bertipe Boolean. Bagi MySQL, true bisa ditulis 1. Malah bisa ditulis “1” (string). Sedangkan PostgreSQL akan menolak bila yang seharusnya boolean tapi ditulis string. Di sinilah bindValue dan bindParam berperan sebagai dewa penolong.

Agar aman, ini “rumus” yang bila diikuti, maka anda akan terhindar dari penyakit migren akibat men-debug source program komputer yang error.

<?php
$dbhost = '127.0.0.1';
$dbname = 'test';
$dbuser = 'user';
$dbpass = 'p4ssw0rd';

// Bila PostgreSQL:
$charset = 'utf8';
$dsn = "pgsql:host=$dbhost;dbname=$dbname;options='--client_encoding=$charset'";

// Bila MySQL atau MariaDB, ubah menjadi seperti ini:
// $charset = 'utf8mb4';
// $dsn = "mysql:host=$dbhost;dbname=$dbname;charset=$charset"; 

$options = [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $dbuser, $dbpass, $options);

// Contoh melakukan select yang memakai variabel.
$status = true;
$stmt = $pdo->prepare('select kode from barang where lunas = :status');
$stmt->bindValue(':status', $status, PDO::PARAM_BOOL);
$stmt->execute();
$hasil = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (count($hasil) > 0) {
  echo '<p>Kode barang yang telah lunas adalah:</p>';
  echo '<ol>';
  foreach ($hasil as $item) echo "<li>$item</li>";
  echo '</ol>';
}
else {
  echo '<p>Tidak ditemukan barang yang telah lunas.</p>';
};

Kode di atas berjalan lancar pada MySQL maupun PostgreSQL.

Selain PDO::PARAM_BOOL untuk data bertipe boolean, kita juga bisa memakai:

Mungkin di antara pembaca blog ini, ada yang bertanya, “Bukankah sebelum melakukan fetchAll() kita harus mengecek dengan memakai rowCount() untuk mengetahui apakah ada record yang sesuai kriteria?”.

Jawabannya: “Tidak perlu!”. Malah jangan, karena rowCount() sesungguhnya hanya untuk menghitung baris yang terpengaruh oleh perintah INSERT, UPDATE, dan DELETE. Pada beberapa driver, penggunaan rowCount() setelah select() hasilnya tidak bisa dipastikan.

Jadi simpulannya: Langsung saja lakukan fetchAll(). Tidak akan menimbulkan error seandainya tidak ditemukan record yang cocok. Bila record tidak ditemukan, $hasil tetap berupa array tapi jumlah itemnya nol.

Bagaimana untuk fetch()?
Jawabannya sama. Tidak perlu memakai rowCount().
Contohnya seperti ini:

$stmt->execute();

while ($hasil = $stmt->fetch(PDO::FETCH_ASSOC)) {
  echo $hasil['kode'];
};

Atau bila anda suka data bertipe object, kodenya seperti ini:

$stmt->execute();

while ($hasil = $stmt->fetch(PDO::FETCH_OBJ)) {
  echo $hasil->kode;
};

Semoga artikel singkat ini bermanfaat. Sila dibagikan (share).

Exit mobile version