Dalam tutorial belajar PHP MySQL kali ini kita akan membahas tentang penggunaan prepared statements, yakni cara menampilkan data MySQL menggunakan mysqli prepared statements.
Cara Menampilkan Data MySQL Menggunakan Prepared Statements mysqli
Setelah membahas teori tentang pengertian prepared statements pada tutorial sebelumnya, kita akan langsung praktek mengenai cara penggunaan prepared statements untuk menampilkan sebuah data dari database MySQL.
Kali ini saya akan mencoba menampilkan tabel mahasiswa_ilkom dengan prepared statements. Tabel ini kita buat pada tutorial PHP MySQL: Cara Menampilkan Tabel MySQL dari PHP (mysql_fetch_row).
Seperti yang telah dibahas, untuk membuat prepared statements, kita membutuhkan 3 langkah: prepared, bind, dan excecute.
Langkah pertama: prepared
Sebagai contoh, saya ingin menampilkan seluruh kolom dari tabel mahasiswa_ilkom dimana nama mahasiswanya adalah "Neil Situmorang". Sesuai dengan fungsinya, di dalam proses prepared ini kita hanya butuh mempersiapkan query MySQL, tanpa ada data.
Untuk proses prepared, mysqli PHP menyediakan fungsi mysqli_prepare(). Fungsi ini membutuhkan 2 argumen, yakni variabel hasil pemanggilan fungsi mysqli_connect(), dan prepared query yang akan dijalankan. Berikut adalah contoh penulisannya:
<?php // buat koneksi dengan MySQL, gunakan database: universitas $link = mysqli_connect('localhost', 'root', '', 'universitas'); Â // buat prepared statements $stmt = mysqli_prepare($link, "SELECT * FROM mahasiswa_ilkom WHERE nama=?"); ?>
Hasil pemanggilan fungsi mysqli_prepare() selanjutnya disimpan kedalam variabel $stmt. Variabel ini akan kita gunakan di dalam proses bind, execute dan dalam proses menampilkan data. Anda bebas jika ingin menukar variabel ini dengan nama lain.
Langkah kedua: bind
Pada proses bind, kita akan mengirimkan data kepada MySQL. Data yang akan dikirim adalah untuk menggantikan tanda "?" yang sebelumnya dibuat pada proses prepared. Di dalam mysqli PHP, proses bind dilakukan menggunakan fungsi mysqli_stmt_bind_param(). Fungsi ini membutuhkan setidaknya 3 buah argumen, berikut contohnya:
<?php // siapkan "data" query $nama_mhs="Neil Situmorang"; Â // hubungkan "data" dengan prepared statements mysqli_stmt_bind_param($stmt, "s", $nama_mhs); ?>
Argumen pertama dari fungsi mysqli_stmt_bind_param() adalah variabel hasil pemanggilan fungsi mysqli_prepare(), dalam contoh kita adalah varabel $stmt.
Argumen kedua adalah string yang menunjukkan jenis tipe data argumen ketiga, yakni data yang akan diinput kedalam query (kita akan membahas isi argumen kedua ini sesaat lagi).
Argumen ketiga adalah data yang akan menggantikan tanda "?" dari query, dalam contoh kita adalah "Neil Situmorang". Tetapi karena fungsi mysqli_stmt_bind_param() membutuhkan data dalam bentuk variabel, saya harus menyimpannya terlebih dahulu ke dalam variabel $nama_mhs.
Argumen kedua dari fungsi mysqli_stmt_bind_param() membutuhkan pembahasan tersendiri. Argumen ini berisi data string yang menunjukkan jenis tipe data argumen ketiga. PHP menyediakan 4 jenis tipe data:
- i = variabel bertipe integer
- d = variabel bertipe double
- s = variabel bertipe string
- b = variabel bertipe blob (binary)
Karena di dalam contoh saya mengunakan variabel $nama_mhs yang bertipe string, maka di dalam argumen kedua ditulis: "s". Tetapi apabila saya mengganti variabel ketiga menjadi umur yang bertipe integer, maka argumen kedua ini menjadi "i".
Langkah ketiga: execute
Setelah proses bind selesai, langkah berikutnya adalah menjalankan query dengan menggunakan fungsi mysqli_stmt_execute(). Fungsi ini membutuhkan 1 buah argumen, yakni variabel hasil pemanggilan fungsi mysqli_prepare():
<?php mysqli_stmt_execute($stmt); ?>
Fungsi mysqli_stmt_execute() menginstruksikan kepada MySQL untuk segera menjalankan perintah prepared statement yang telah dibuat. Sampai disini proses menjalankan perintah query telah terkirim ke MySQL. Selanjutnya, kita akan menampilkan data hasil query.
Menampilkan data hasil query
Untuk menampilkan hasil query, kita mengambil data MySQL dengan fungsi mysqli_stmt_get_result(). Fungsi ini membutuhkan 1 argumen berupa variabel hasil fungsi mysqli_prepare(). Fungsi ini juga mengembalikan nilai bertipe resources yang selanjutnya bisa digunakan untuk menampilkan data.
<?php // ambil hasil query $result=mysqli_stmt_get_result($stmt); ?>
Selanjutnya, untuk menampilkan data kita bisa menggunakan cara biasa menggunakan mysql_fetch_row() atau mysql_fetch_array():
<?php // tampilkan hasil query while ($row= mysqli_fetch_row($result)) { echo "$row[0] $row[1] $row[2] $row[3] $row[4]"; echo "<br />"; } ?>
Langkah terakhir yang bersifat opsional (pilihan) adalah menutup proses prepared statement dengan fungsi mysqli_stmt_close(). Tetapi sama dengan fungsi mysqli_close(), jika kita tidak menulisnya, PHP secara otomatis akan menutup koneksi ke MySQL saat halaman selesai di proses.
Dengan menggabungkan seluruh fungsi-fungsi prepared statements yang telah kita bahas, berikut adalah contoh kode programnya secara lengkap:
<?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=?"); // cek query if (!$stmt) { die('Query Error : '.mysqli_errno($link). ' - '.mysqli_error($link)); } // siapkan "data" query $nama_mhs="Neil Situmorang"; // hubungkan "data" dengan prepared statements mysqli_stmt_bind_param($stmt, "s", $nama_mhs); // jalankan query mysqli_stmt_execute($stmt); // 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
Selain fungsi-fungsi yang kita bahas pada tutorial kali ini, saya juga menambahkan fungsi untuk memeriksa kesalahan seperti yang pernah kita bahas pada tutorial cara menampilkan pesan kesalahan (error) mysqli, yakni fungsi mysqli_errno dan mysqli_error().
Prepared Statement mysqli Object Style
Sebagai alternatif, berikut adalah cara penulisan prepared statement menggunakan object style mysqli. Method yang digunakan relatif hampir sama dengan procedural style yang kita bahas diatas.
<?php // buat koneksi dengan MySQL, gunakan database: universitas $mysqli = new mysqli("localhost", "root", "","universitas"); // cek koneksi if ($mysqli->connect_errno) { die('Koneksi gagal: ' .$mysqli->connect_errno. ' - '.$mysqli->connect_error); } // buat prepared statements $stmt = $mysqli->prepare("SELECT * FROM mahasiswa_ilkom WHERE nama=?"); // cek query if (!$stmt) { die('Query Error : '.$mysqli->errno. ' - '.$mysqli->error); } // siapkan "data" query $nama_mhs="Neil Situmorang"; // hubungkan "data" dengan prepared statements $stmt->bind_param("s", $nama_mhs); // jalankan query $stmt->execute(); // hubungkan hasil query $result = $stmt->get_result(); // tampilkan query while ($row= $result->fetch_row()) { echo "$row[0] $row[1] $row[2] $row[3] $row[4]"; echo "<br />"; } // tutup statements $stmt->close(); // tutup koneksi $mysqli->close(); ?>
Dalam tutorial PHP MySQL kali ini kita telah membahas tentang cara penggunaan prepared statements MySQL untuk menampilkan data. Pada tutorial berikutnya kita akan bahas cara menggunakan mysqli prepared statement untuk proses input data kedalam database MySQL.
senang belajar di sini dapat banyak ilmu.
mau tanya : bolehkan dalam satu program berisi dua gaya (dicampur-campur) misalnya untuk koneksi ke database menggunakan gaya procedural style, sedangkan untuk query lain menggunakan gaya object style, atau sebaliknya. apakahan ada pengaruhnya dalam pemrosesan PHP?.
terimakasih.
Kalau ditanya bisa atau tidak, jawabannya: bisa. Tetapi kalau ditanya boleh atau tidak: boleh2 saja :).
Walaupun begitu, saya menyarankan hanya menggunakan 1 gaya penulisan (entah itu procedural atau object style). Alasannya hanya untuk memudahkan penulisan dan tidak membuat bingung programmer lain yang mungkin akan membaca kode yang kita buat. Di dalam manual PHP juga dicantumkan mengenai hal ini:
"It is possible to switch between styles at any time. Mixing both styles is not recommended for code clarity and coding style reasons."
Kalau mengenai performa, saya rasa tidak ada perbedaan signifikan jika menggabungkan keduanya.
kok di eksekusi hasilnya undefinied $result salah dimana mas ?
pada procedural
Terima kasih ilmunya.. sangat bermanfaat.
Kalau untuk pemula di php apakah bisa langsung mempelajari procedural style atau harus Dari dasar. Terimakasih
Kalau untuk PHP, dasarnya memang procedural style… nanti kalau sudah paham, baru lanjut mempelajari pemrograman berbasis object (OOP) di PHP.
min selamat malam ..
ini saya mau bertanya. pada saat website dalam kondisi offline ("belum di upload" ) sih lancar" aja . tidak ada erro .
tpi baru di upload malah muncul erro kayak gini mi.
"Fatal error: Call to undefined method mysqli_stmt::get_result()"
itu gmna ya min cara mengatasinya..
thnks dan semoga di balas :D
Kalau di offline bisa jalan, kemungkinan besar permasalahan ada di sistem servernya mas, mungkin beda versi PHP, beda versi MySQL, atau databasenya tidak terhubung….
<?php
// buat koneksi dengan MySQL, gunakan database: universitas
$mysqli = new mysqli("localhost", "root", "","universitas");
// cek koneksi
if ($mysqli->connect_errno) {
die('Koneksi gagal: ' .$mysqli->connect_errno.
' – '.$mysqli->connect_error);
}
// buat prepared statements
$stmt = $mysqli->prepare("SELECT * FROM mahasiswa_ilkom WHERE umur=?");
// cek query
if (!$stmt) {
die('Query Error : '.$mysqli->errno.
' – '.$mysqli->error);
}
// siapkan "data" query
$umur_mhs=23;
// hubungkan "data" dengan prepared statements
$stmt->bind_param("i", $umur_mhs);
// jalankan query
$stmt->execute();
// hubungkan hasil query
$result = $stmt->get_result();
// tampilkan query
while ($row= $result->fetch_row()) {
echo "$row[0] $row[1] $row[2] $row[3] $row[4]";
echo "<br />";
}
// tutup statements
$stmt->close();
// tutup koneksi
$mysqli->close();
?>
mas andre mohon pencerahan , kan fungsi bind_param ada 4 tipe data ya, kalau untuk type data interger kita menggunakan "i" untuk isi dari dari argumen ke 2 tapi setelah saya ganti "s"atau "d" seperti contoh diatas tetap memunculkan isi dari tabel yg mempunyai umur "23" bukan kah seharusnya kalau kita isi "s" dia tidak akan memunculkan di web yah?
Saya belum coba lagi, tapi di MySQL ada semacam "konversi". Misalnya angka 23 bisa terhitung sebagai float maupun integer.
Numpang tanya om!
Saya ada database buku, di dalamnya ada tabel data_buku yang atributnya kode_buku, judul_buku, pengarang, penerbit, dan harga. Atribut kode_buku dibedakan berdasarkan kelas, unuk kelas X kodenya X01, X02, dst. Untuk kelas XI kodenya XI01, XI02, dst. Untuk kelas XII kodenya XII01, XII02, dst. Saya sudah berhasil menampilkan isi tabel data_buku di php dalam bentuk tabel. Masalahnya saya ingin menambahkan opsi filter otomatis dengan menggunakan checkbox. Jadi, di bagian atas tabel dalam php saya buat 3 buah checkbox Kelas X, Kelas XI, dan Kelas XII. Ketika checkbox Kelas X di ceklist, isi tabel otomatis menampilkan buku-buku untuk kelas X, tanpa harus meng-klik sebuah button. Jadi, diceklist aja udah otomatis filter. Begitu juga untuk checkbox kelas XI dan kelas XII. Boleh dibantu ga om, cara buatnya.
Itu harus dibuat menggunakan AJAX (fitur gabungan PHP dengan JavaScript). Pembahasannya cukup panjang dan sebelumnya juga harus punya basic PHP dan JavaScript dulu.
Untuk sementara ini tutorial tentang AJAX baru tersedia di buku JavaScript Uncover duniailkom.
Makasih om informasinya, sementara ini buat ngerjain tugas dulu. Mungkin kalau saya mau seriusin memperdalam Javascript, nanti saya order bukunya.
kenapa parameter dari function gak ke baca sama variable $stmt->bind_param("i", $umur_mhs); ya gan?
ceritanya saya pake function execute nya.. function insert($umur_mhs){..
Bisa di test satu2 untuk mencari letak salahnya, misalnya apakah argumen $umur_mhs itu sudah berisi nilai, atau jika itu berasal dari form, apakah formnya memang sudah terkirim.