Tutorial PHP MySQL Part 23: Cara Menggunakan Prepared Statements dengan PDO PHP

Dalam 2 tutorial PDO PHP sebelumnya, kita telah membahas cara menampilkan dan menginput data MySQL dengan cara "normal". Pada tutorial belajar PHP MySQL kali ini kita akan membahas cara menjalankan query MySQL dengan metoda yang lebih advanced menggunakan prepared statements dengan PDO.


Cara Menginput Data MySQL dengan Prepared Statement PDO

Pembahasan mengenai apa itu prepared statement telah saya bahas dengan lengkap dalam Tutorial PHP MySQL: Pengertian dan Cara Penggunaan Prepared Statements mysqli. Kali ini kita akan lihat bagaimana cara menggunakannya di dalam extension PDO.

Langsung saja kita masuk kedalam contoh program. Kali ini saya ingin menambahkan 1 data kedalam tabel mahasiswa_ilkom menggunakan prepared statement dengan PDO:

<?php
try {
   // buat koneksi dengan database
   $dbh = new PDO('mysql:host=localhost;dbname=universitas', "root", "");
 
   // set error mode
   $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
   // siapkan query (prepare)
   $stmt = $dbh->prepare('INSERT INTO mahasiswa_ilkom 
   VALUES (?, ?, ?, ?, ?)');
 
   // hubungkan data dengan variabel (bind)
   $stmt->bindParam(1, $nim_mhs);
   $stmt->bindParam(2, $nama_mhs);
   $stmt->bindParam(3, $umur_mhs);
   $stmt->bindParam(4, $tempat_lahir_mhs);
   $stmt->bindParam(5, $ipk_mhs);

   // siapkan "data" query
   $nim_mhs="109023031";
   $nama_mhs="Jerry Kurniawan";
   $umur_mhs=23;
   $tempat_lahir_mhs="Malang";
   $ipk_mhs=3.1;
 
   // jalankan query (execute)
   $stmt->execute();
 
   // tampilkan hasil proses query
   echo $stmt->rowCount()." data berhasil ditambahkan";
 
   // hapus koneksi
   $dbh = null;

} catch (PDOException $e) {
   // tampilkan pesan kesalahan jika koneksi gagal
   print "koneksi/query bermasalah: " . $e->getMessage() . "<br/>";
   die();
}
?>

Seperti yang pernah kita bahas pada mysqli extension, untuk menjalankan prepared statement, kita membutuhkan 3 langkah: prepare, bind dan execute.

Proses prepare dijalankan menggunakan method $dbh->prepare(). Method ini membutuhkan 1 argumen berupa perintah query yang akan dijalankan. Hasil dari method kemudian disimpan kedalam variabel $stmt. Variabel inilah yang akan kita gunakan selama menjalankan proses prepared statement.

Proses bind dilakukan menggunakan method $stmt->bindParam(). Method ini membutuhkan 2 argumen. Argumen pertama adalah angka urutan dari "tempat data" yang ditulis pada proses prepare. Karena pada proses prepare saya menuliskan: 'INSERT INTO mahasiswa_ilkom VALUES (?, ?, ?, ?, ?)', maka setiap tanda "?" harus di bind. Urutan tanda "?" inilah yang digunakan dalam argumen pertama method $stmt->bindParam().

Untuk argumen kedua method $stmt->bindParam() adalah variabel penampung yang nantinya akan diisi data. Selanjutnya setiap variable yang di defenisikan akan saya input nilai yang sesuai.

Setelah seluruh data diinput kedalam variabel, kita tinggal menjalankan method $stmt->execute() untuk menjalankan query prepared statement.

Jika anda menjalankan kode program diatas, hasilnya adalah sebagai berikut:

1 data berhasil ditambahkan

Agar lebih yakin, anda bisa menambahkan kode program diatas untuk menampilkan seluruh isi tabel mahasiswa_ilkom.

Selain menggunakan tanda "?" untuk menandakan bagian dari data, PDO PHP juga menyediakan cara lain, yakni dengan menuliskan 'nama untuk data' atau dikenal dengan "named parameters prepared statements".

Berikut adalah revisi contoh program menggunakan named parameters prepared statemant:

<?php
try {
   // buat koneksi dengan database
   $dbh = new PDO('mysql:host=localhost;dbname=universitas', "root", "");
 
   // set error mode
   $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
   // siapkan query (prepare)
   $stmt = $dbh->prepare('INSERT INTO mahasiswa_ilkom VALUES
   (:nim_mhs, :nama_mhs, :umur_mhs, :tempat_lahir_mhs, :ipk_mhs)');
 
   // hubungkan data dengan variabel (bind)
   $stmt->bindParam(':nim_mhs', $nim_mhs);
   $stmt->bindParam(':nama_mhs', $nama_mhs);
   $stmt->bindParam(':umur_mhs', $umur_mhs);
   $stmt->bindParam(':tempat_lahir_mhs', $tempat_lahir_mhs);
   $stmt->bindParam(':ipk_mhs', $ipk_mhs);
                
   // siapkan "data" query
   $nim_mhs="109023031";
   $nama_mhs="Jerry Kurniawan";
   $umur_mhs=23;
   $tempat_lahir_mhs="Malang";
   $ipk_mhs=3.1;
 
   // jalankan query (execute)
   $stmt->execute();
 
   // tampilkan hasil proses query
   echo $stmt->rowCount()." data berhasil ditambahkan";
 
   // hapus koneksi
   $dbh = null;

} catch (PDOException $e) {
   // tampilkan pesan kesalahan jika koneksi gagal
   print "koneksi/query bermasalah: " . $e->getMessage() . "<br/>";
   die();
}
?>

Perbedaan dari kode program sebelumnya adalah pada cara penulisan query dan argumen method bindParam(). Kali ini kita menggunakan named variable (diawali dengan tanda ":"), seperti :nim_mhs, :nama_mhs, atau :umur_mhs. Named variable ini selanjutnya menjadi argumen pertama method $stmt->bindParam().

Versi penulisaan terakhir prepared statement yang akan kita pelajari adalah dengan menggabungkan proses bind dan execute sekaligus. Agar cara ini bisa dijalankan, data dari prepared statement harus dibuat dalam bentuk array. Berikut contohnya:

<?php
try {
   // buat koneksi dengan database
   $dbh = new PDO('mysql:host=localhost;dbname=universitas', "root", "");
 
   // set error mode
   $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
   // siapkan query (prepare)
   $stmt = $dbh->prepare('INSERT INTO mahasiswa_ilkom VALUES
   (:nim_mhs, :nama_mhs, :umur_mhs, :tempat_lahir_mhs, :ipk_mhs)');
                
   // siapkan "data" query
   $nim_mhs="109023031";
   $nama_mhs="Jerry Kurniawan";
   $umur_mhs=23;
   $tempat_lahir_mhs="Malang";
   $ipk_mhs=3.1;
 
   // jalankan query (execute)
   $stmt->execute(array(':nim_mhs' => $nim_mhs, ':nama_mhs' => $nama_mhs,
   ':umur_mhs' => $umur_mhs, ':tempat_lahir_mhs' => $tempat_lahir_mhs,
   ':ipk_mhs' => $ipk_mhs ));
 
   // tampilkan hasil proses query
   echo $stmt->rowCount()." data berhasil ditambahkan";
 
   // hapus koneksi
   $dbh = null;

} catch (PDOException $e) {
   // tampilkan pesan kesalahan jika koneksi gagal
   print "koneksi/query bermasalah: " . $e->getMessage() . "<br/>";
   die();
}
?>

Perbedaan dalam kode program diatas terletak dalam $stmt->execute(). Kali ini method $stmt->execute() kita input dengan array sebagai argumen yang akan menjadi 'data' untuk query. Dengan cara ini kita tidak perlu menggunakan method $stmt->bindParam().


Metode prepared statement yang kita pelajari disini bisa menjadi alternatif dari cara menjalankan query MySQL dengan metode biasa menggunakan $dbh->query(). Prepared statements mungkin masih relatif jarang anda jumpai, namun metoda ini menawarkan keamanan yang lebih dan banyak digunakan di dalam aplikasi PHP yang lebih luas seperti framework PHP.

46 Comments

  1. aemana
    23 Dec 14
    • Andre
      23 Dec 14
  2. Robby Agustinus
    19 May 15
    • Andre
      21 May 15
      • Robby Agustinus
        21 May 15
        • Andre
          24 May 15
  3. Xabi Corazon
    10 Aug 15
    • Andre
      19 Jan 16
  4. rendy
    18 Jan 16
    • Andre
      19 Jan 16
  5. saidqb
    16 Feb 16
    • Andre
      18 Feb 16
      • saidqb
        19 Feb 16
        • Andre
          20 Feb 16
  6. asenk'kwan
    24 Mar 16
  7. DYON
    27 Mar 16
    • Andre
      28 Mar 16
    • agans
      26 Nov 19
      • Andre
        27 Nov 19
  8. riyanto
    29 Apr 16
    • Andre
      30 Apr 16
  9. namamu
    01 May 16
    • Andre
      02 May 16
  10. heikal gibran
    27 May 16
    • Andre
      28 May 16
      • heikal gibran
        30 May 16
        • Andre
          31 May 16
        • Haikal gibran
          31 May 16
        • Andre
          01 Jun 16
  11. Bonar
    08 Jun 16
  12. Dandi Rahmadani
    26 Aug 16
    • Andre
      26 Aug 16
      • Malik
        10 Mar 17
    • Malik
      13 Mar 17
      • Andre
        13 Mar 17
  13. Hana
    27 Sep 16
    • Andre
      28 Sep 16
  14. Hana
    27 Sep 16
    • Andre
      28 Sep 16
      • Hana
        28 Sep 16
  15. Dahri
    28 Nov 16
  16. Anonymous
    17 Oct 19

Add Comment

Leave a Reply to rendy Cancel reply