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.
sangat bagus gan, makasih contohnya. bermanfaat baget bagi kami
Terimakasih gan, saya juga senang tutorialnya bisa bermanfaat..
saya masih bingung dengan tanda "->" dan "=" . mau tanya mas , biasa untuk tanda "->" itu untuk apa saja ya ?
Itu untuk mengakses method dalam pemrograman objek PHP gan.
Agar lebih paham, silahkan pelajari pemrograman Objek di PHP. Sudah ada kok tutorialnya di duniailkom: https://www.duniailkom.com/tutorial-belajar-oop-php-pemrograman-berbasis-objek-php/
gan kenapa yg pdo sdikit skali ya ? yg dengan mysql extension itu sampe ada 9 tutorial, knp yg pdo sdikit ya gan?
Karena pada saat awal tutorial PHP MySQL tentang mysql extension, saya masih membahas dasar-dasarnya gan. Misalnya untuk menampilkan data MySQL kita menggunakan fungsi mysql_fetch_row, mysql_fetch_array, dan mysql_fetch_object. Ketiga cara ini saya bahas dalam tutorial terpisah agar lebih detail.
Tetapi sewaktu membahas PDO, kode yang dibutuhkan untuk menampilkan data MySQL relatif sama, sehingga saya tidak perlu lagi membahasnya satu persatu. Karena itu tutorial tentang PDO lebih singkat, tapi contoh kodenya lebih banyak :)
Artikel yang menarik.
Mau tanya, jika sudah menggunakan “prepare” apakah sudah aman dari SQL Injection?
Apakah perlu menambahkan script php yg lain [htmlspecialchars(), abs((int)),dll ] pada proses bind?
Terima kasih :)
Secara teori, sudah aman dari SQL injection, namun masih banyak ‘celah’ yang harus dijaga, dan tidak hanya SQL saja.
Sebagai contoh, fungsi htmlspecialchars() digunakan untuk menghapus script HTML dan JavaScript yang bisa digunakan untuk Cross-site scripting atau HTML injection, dan ini bukan termasuk SQL Injection :)
Trimakasih atas penjelasannya,
$sth->bindParam(‘:calories’, $calories);
$sth->bindParam(‘:colour’, $colour);
$sth->execute();
$sth->execute(array(‘:calories’ => $calories, ‘:colour’ => $colour));
Untuk script, apakah menggunakan array sama amannya dengan menggunakan bind?
Iya, sama amannya kok, karena inti dari prepared statement adalah pemisahan antara query dengan variabel yang ingin diinput.
MANTEB tutorial PDOnya mas,
boleh dong ditambah lagi tutorial tentang PDOnya :D
soalnya aku langsung lari ke PDO gak k mysql/mysqli :D
suwun
Hehe, sebaiknya juga pelajari yang mysqli mas, soalnya penggunaan mysqli lebih umum daripada PDO, terutama untuk aplikasi sederhana :)
makasih mas atas tutorial nya, gile saya seminggu ini dari tutorial awal ampe pdo, untuk input prepare statement pdo saya lebih milih yang pertama soalnya kedua dan ketiga menurut saya agak ribet, kalau mas andre lebih enakan mana mas ?
Yup betul mas, lebih sederhana cara penulisan yang pertama. Tapi tergantung situasi juga. Kalau kita cuma membuat aplikasi sederhana atau untuk tugas kuliah, malah lebih simple pakai mysqli extension, hehe…
titik 2 :
pada bagian values maksudnya apa ya mas
Penulisannya memang demikian mas :)
udah paham om, kemarin cuman baca code doang haha
thanks banget lho om, materi-materinya
Siip, sama2 gan, semoga bermanfaat :)
thanks gan,.bisa buat belajar codingannya ;)
gan FUNGSI -> ITU UNTUK APA ????
Itu untuk pengaksesan objek gan. Untuk lengkapnya, nanti bisa di pelajari di tutorial OOP PHP Duniailkom :)
terimakasih,
ilmunya sangat bermanfaat mas. Tapi ada tutorial CI+PDO gak mas ?
Saat ini tutorial CI masih belum tersedia nih…
om mau tanya kalau di hubungkan ke form itu cara nyimpen nya data gimana ya
Yup, itu sudah gabungan HTML, PHP dan MySQL gan. HTML digunakan untuk membuat form, PHP untuk memproses isi datanya dan sekaligus untuk input datanya ke database.
Pemrosesan form merupakan salah satu konsep yang paling kompleks di web programming. Karena cukup panjang, saat ini tutorial lengkapnya baru ada di eBook PHP Uncover Duniailkom. Disana untuk pemrosesan form saja saya butuh 80 halaman lebih, hehe. Karena termasuk proses validasi (memeriksa apakah inputan sudah benar atau belum). Ini juga belum termasuk gimana cara pemrosan file upload.
Sebenarnya di duniailkom tutorialnya sudah ada, tapi terpisah2. Kalau agan membaca seluruhnya mulai dari HTML, CSS, PHP dan MySQL, akan bisa sendiri kok.
gan, mau tanyak ??.
kenapa kita harus menggunakan bind param ?? mohon pencerahan.
Untuk menggunakan PDO dengan prepared statement memang pakai perintah itu gan. Kalau g, ya g jalan query MySQLnya.
Kalau agak bingung, bisa pakai mysqli extension saja gan (tanpa prepared statement). Lebih sederhana.
bagaimana kalo pakai OOP om? oh iya facebooknya apa ya? saya mau banyak belajar om, secara langsung
Group facebook duniailkom belum ada gan, baru fanspage saja.
Untuk tanya2 bisa di bagian komentar tiap artikel. Sedangkan pembahasan yang lebih detail terkait PHP saya bahas di eBook PHP Uncover (sudah 600an halaman), tapi untuk OOP memang tidak dibahas.
maksud saya prepare statement di OOP om, ada contohnya? thanks
Saat ini di duniailkom belum ada gan…
Bisa dibuatlan tutornya om? Mungkin lebih panjang dari biasanya tutor yg om buat tapi tutor "membuat crud dengan oop, mysqli/pdo yg ada prepare statement" atau "crud oop mysqli" itu walau b ing juga di google gk ada om. Thanks
Requestnya di tampung ya gan :)
mas apakah untuk mysqli prepared statement bisa menggunakan bind_param 2 atau 3 kali penulisannya seperti pdo
biasanya untuk pdo kan seperti ini.
$stmt->bindParam(1, $nim_mhs);
$stmt->bindParam(2, $nama_mhs);
$stmt->bindParam(3, $umur_mhs)
mohon pencerahaannya ?
gan kalo mau nampilin data dengan prepared stmt gmn ya gan ,, kalo dgm mysqli kan pake $result = $stmt->get_result() kalo di PDO penulisan fungsi get_result nya apa ya gan ?
ane uda coba pake yang ini $result = $stmt->getResult(); tapi error gan.
mohon bantuannya ya gan !!!
Untuk menampilkan data dari PDO sudah saya bahas di tutorial part sebelumnya gan: https://www.duniailkom.com/tutorial-php-mysq-cara-menampilkan-data-dengan-mysqli-prepared-statements/
maaf mas, di link yg mas kasih, adanya cara mysqli, dan itu menggunakan get_result(). kalo prepared statements pada PDO , fungsinya apa ya mas untunk mengambil hasil execute.
karena, jika menggunakan get_result() pada PDO. yg keluar
Fatal error: Call to undefined method PDOStatement::get_result() in D:\xampp\htdocs\belajar\debug.php on line 10
kalau untuk pdo, tidak memakai gunsi get_result. Sehabis menggunakan execute(), lgsg bisa menggunakan fungsi fetch();
contoh :
<?php
try{
$dbh = new PDO('mysql:host=localhost;dbname=universitas','root','');
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare('select * from mahasiswa_ilkom where nama=?');
$nama = "Andi Suryo";
$stmt->bindParam(1, $nama);
$stmt->execute();
$row = $stmt->fetch();
echo $row[0];
}
catch(PDOException $e){
echo $e->getMessage();
}
?>
Terimakasih sudah bantu menjawab.. :)
Mas mau tanya, apakah PDO sering digunakan di farmwork – farmwork PHP?
Kalau sudah masuk ke framework, biasanya framework itu punya cara koneksi ke database sendiri. Kita tidak akan berhubungan langsung dengan fungsi2 mysqli maupun PDO. Istilah programmingnya "Abstraction Layer".
Secara internal mungkin framework itu menggunakan PDO, tapi kita menggunakan fungsi khusus yang disediakan framework. Misalnya kalau di Code Igniter akan menggunakan Database Class.
Oiya terus apakah PDO ini erat kaitannya dengan OOP PHP?
Makasih untuk ilmunya sangat bermanfaat.
Oh, tentu gan. Sebelum belajar PDO sebaiknya sudah paham pemrograman object PHP dulu, soalnya PDO itu sudah menggunakan object.
Oke terimakasih.
mas kenapa saya menggunakan statement Prepared gak bisa.. malah saya pake $dbh->query()
Mas request framework laravel dong ?