Salah satu fitur baru yang tersedia di dalam mysqli extension yang tidak ada pada mysql extension adalah dukungan untuk prepared statements MySQL. Dalam tutorial belajar PHP MySQL kali ini kita akan membahas tentang pengertian prepared statements dan cara penggunaan prepared statements dengan mysqli.
PHP mendukung fitur prepared statements pada mysqli extension dan PDO. Fitur ini juga umum digunakan di dalam pemrograman PHP lanjutan seperti framework PHP. Karena hal ini, penting juga bagi kita untuk memahami cara penggunaannya.
Pengertian Prepared Statements MySQL
Prepared statements adalah sebuah fitur yang disediakan MySQL (dan juga beberapa aplikasi database lainnya), dimana kita bisa mengirim query (perintah) secara terpisah antara query inti dengan “data” dari query. Tujuannya, agar query menjadi lebih aman dan cepat (jika perintah yang sama akan digunakan beberapa kali).
Sebagai perbandingan, untuk menampilkan data MySQL menggunakan fungsi mysqli_query(), kita membuat seluruh query dalam 1 string dan langsung mengirimkannya ke MySQL Server, sebagai berikut:
$result=mysqli_query("SELECT * FROM mahasiswa_ilkom WHERE nama='Neil Situmorang'");
Dengan prepared statements, query tersebut akan dipisah antara perintah query: “SELECT…” dengan ‘data’-nya yakni “Neil Situmorang”.
Proses Pembuatan Prepared Statement MySQL
Proses pembuatan prepared statements membutuhkan 3 langkah: Prepared, Bind, dan Execute.
Pada proses pertama: prepared, kita mempersiapkan query yang akan dijalankan, tetapi tanpa ‘data’. Bagian dimana ‘data’ berada digantikan dengan tanda tanya (?), seperti berikut ini:
"SELECT * FROM mahasiswa_ilkom WHERE nama=?"
atau
"INSERT INTO mahasiswa_ilkom VALUES (?, ?, ?, ?, ?)"
Secara teknis, query diatas akan langsung di kirim PHP ke MySQL Server. Di dalam MySQL, perintah tersebut disimpan untuk sementara menunggu proses berikutnya: bind.
Proses kedua adalah bind. Dalam tahap ini, kita akan mengirimkan data yang telah ditandai dalam proses prepare. Data disini adalah bagian yang diberi tanda “?”. Jika di dalam proses prepare hanya butuh 1 data, kita mengirimkan 1 data. Tetapi jika kita butuh 5 data, kita mengirimkan 5 data (sesuai dengan query yang ditulis dalam tahap prepare).
Setelah proses prepare dan bind, berikutnya adalah menjalankan prepared statement (execute).
Kenapa Harus Menggunakan Prepared Statements?
Keuntungan terbesar dari penggunaan prepared statements adalah dalam hal keamanan. Untuk aplikasi ‘nyata’, bagian “data” dari suatu query biasanya berasal dari user. Seorang user yang jahil bisa saja menambahkan perintah SQL pada kotak inputan user name. Metoda ini dikenal juga dengan SQL Injection.
Dengan memisahkan perintah query dengan datanya, kita bisa mencegah penyisipan query.
Cara Penggunaan Prepared Statements mysqli
Pembahasan mengenai prepared statements cukup panjang dan akan saya bahas secara bertahap dalam 2 tutorial berikutnya. Sebagai gambaran, berikut adalah contoh kode program untuk menampilkan data mahasiswa dari tabel mahasiswa_ilkom menggunakan prepared statement mysqli (procedural style). Penjelasan mengenai kode program ini akan kita bahas lengkap pada tutorial berikutnya:
<?php // buat koneksi dengan MySQL, gunakan database: universitas $link = mysqli_connect('localhost', 'root', '', 'universitas'); // cek koneksi if (!$link) { die('Koneksi Error : '.mysqli_connect_errno(). ' - '.mysqli_connect_error()); } // buat prepared statements $stmt = mysqli_prepare($link, "SELECT * FROM mahasiswa_ilkom WHERE nama=?"); // siapkan "data" query $nama_mhs="Neil Situmorang"; // hubungkan "data" dengan prepared statements: bind mysqli_stmt_bind_param($stmt, "s", $nama_mhs); // jalankan query: execute mysqli_stmt_execute($stmt); // cek hasil query if (!$stmt) { die('Query Error : '.mysqli_errno($link). ' - '.mysqli_error($link)); } // ambil hasil query $result=mysqli_stmt_get_result($stmt); // tampilkan hasil query while ($row= mysqli_fetch_row($result)) { echo "$row[0] $row[1] $row[2] $row[3] $row[4]"; echo "<br />"; } // tutup statements mysqli_stmt_close($stmt); // tutup koneksi mysqli_close($link); ?>
Jika kode program diatas dijalankan, hasilnya adalah sebagai berikut:
099145055 Neil Situmorang 22 Medan 1.90
Dalam program diatas, saya menggunakan prepared statements untuk menampilkan data mahasiswa_ilkom dengan nama = “Neil Situmorang”. Saya akan membahas kode program diatas secara detail dalam tutorial berikutnya: Cara Menampilkan Data MySQL Menggunakan Prepared Statements mysqli.
biasanya sih
<input type="text" placeholder=”masukkan nama” name=”nama_lengkap”>
jadi kalo pake prepare statementdi html nya pake placeholder ?
ga pake name=”” kaya sebelumnya??? ato gimana
PS: mohon disemua tutor dihadirkan element html nya juga, biar jelas..
Terimakasih atas pertanyaan gan :)
Dalam tutorial mengenai prepared statement ini saya memang tidak menggunakan HTML maupun form HTML, jadi sedikit bingung mau menjawabnya…
Atribut name dalam Form HTML wajib ditulis jika ingin diproses menggunakan PHP. Sedangkan atribut placeholder murni HTML, dan kita tidak memerlukannya untuk memproses Form di dalam PHP.
Sebagai alternatif, agan bisa membaca step-step pemrosesan Form HTML dengan PHP pada tutorial Cara Membuat dan Memproses Form HTML dengan PHP, dan tutorial PHP MySQL dalam Cara Membuat Koneksi PHP ke Database MySQL.
Semoga bisa membantu…
Pusing, bingung dan stres dalam mempelajari Prepared Statements , di bayar tuntas dengan keamanan data yang di berikann
Hehe, iya gan.. :)
$result=mysqli_stmt_get_result($stmt);
yang ini kayanya salah deh yang bener nya apa ya
Kemungkinan besar ada yang salah dari databasenya gan, atau bisa juga dari pemanggilan querynya.
Mencari error dari kode program PHP MySQL seperti diatas memang cukup rumit, soalnya banyak kemungkinan yang bisa terjadi.
sepertinya mysql_stmt_get_result() itu berlaku di PHP 5.0 – 5.3, kalau ada penggantinya apa ya?
Kalau melihat dari PHP Manual: http://php.net/manual/en/mysqli-stmt.get-result.php, itu bukan berlaku dari PHP 5.0 – 5.3 gan, tapi hadir di PHP 5, tepatnya di versi 5.3.0 keatas hingga PHP 7. Versi PHP 5.2 kebawah belum ada perintah ini. Jadi seharusnya tetap bisa digunakan :)
agan dunia ilkom untuk kegunaan bindparam seperti apa ya?
Seperti yang dijelaskan diatas gan, bindparam digunakan hanya jika kita ingin menulis query MySQL dengan metode Prepared Statements. Fungsinya mengganti karakter "?" dari query dengan variabel yang kita buat.
Agan Andre, untuk usul saja. Supaya konsisten memberi contoh prepared statements procedural style, bagian ini mungkin bisa ditukar:
while ($row= $result->fetch_row())
menjadi
while ($row= mysqli_fetch_row($result, MYSQLI_NUM))
Wah, bener juga.. seharusnya ditulis seperti itu agar pas untuk procedural style.
Siip, terimakasih untuk sarannya, langsung di perbaiki :)
Sama2 bro Andre. Ane jg baru2 belajar. Hehe..
Sepertinya hal yang sama mesti dikoreksi juga gan, di tutorial part 17-nya di bagian procedural style. Mgkin karna dicopas dr sini :D
Semangat. Makasih gan untuk sharing ilmunya :)
Error min setelah di revisi
Terimakasih infonya gan, barusan saya test langsung dan seharusnya cukup:
while ($row= mysqli_fetch_row($result))
Silahkan dicoba lagi…
mau tanya agan Andre, disebuah mysqli_stmt_bind_param($stmt,"s"…..
nah dobulestring s itu gunanya untuk apa? saya ganti dengan yg lain error, makasih
Lebih lengkapnya silahkan lanjut ke tutorial berikutnya gan: https://www.duniailkom.com/tutorial-php-mysq-cara-menampilkan-data-dengan-mysqli-prepared-statements/
($stmt, "s", $nama_mhs <<<< yang di maksud "s" ini apa ya?
Itu penanda bahwa yang diinput adalah tipe data string. Penjelasan lebih lengkap akan dibahas di tutorial selanjutnya: https://www.duniailkom.com/tutorial-php-mysq-cara-menampilkan-data-dengan-mysqli-prepared-statements/
Om andre mau tanya kenapa ya ketika saya menjalankan code diatas muncul error :500 internal server error,saya sudah ikutin dari yang php uncover maupun code yang di sertakan ketika membeli php uncover.
Kalau errornya seperti itu, biasanya tidak berhubungan langsung dengan kode PHP. Bisa jadi ada konfigurasi web server yang salah setting seperti file .htaccess, bisa juga karena masalah file permission jika menggunakan linux.
Mau tanya mas.. beda "mysqli_stmt_get_result" dengan "mysqli_stmt_bind_result" apa ya ?
tnx