Tutorial PHP MySQL Part 18: Cara Menginput Data dengan mysqli Prepared Statements

Jika dalam tutorial PHP MySQL sebelumnya kita membahas tentang cara menampilkan data dengan mysqli prepared statements, dalam tutorial kali ini kita akan mempelajari cara menginput data menggunakan mysqli prepared statements.


Cara Menginput Data dengan mysqli Prepared Statements

Perbedaan antara cara menginput data dan menampilkan data menggunakan prepared statements terletak pada cara penanganan query. Apabila dalam menampilkan data kita menggunakan perintah SELECT, maka untuk menginput data kita menggunakan query INSERT.

Fitur keamanan yang diberikan oleh prepared statements membuatnya cocok digunakan untuk perintah yang akan  mengubah isi tabel seperti perintah INSERT atau UPDATE. Selain itu, penggunaan prepared statement untuk proses input data yang berulang juga akan mempercepat proses eksekusi.

Dalam contoh kasus kita kali ini, saya akan menambahkan 1 buah data tambahan kedalam tabel mahasiswa_ilkom. Saya juga tidak akan membahas secara mendalam fungsi-fungsi prepared statement yang digunakan, karena kita telah membahasnya pada tutorial sebelumnya.

Proses pertama: prepared

Untuk menginput data kedalam tabel mahasiswa_ilkom, kita akan menggunakan query INSERT…VALUES (Jika anda ingin mempelajari cara-cara menginput data kedalam MySQL, silahkan kunjungi tutorial MySQL: Cara menambahkan data kedalam tabel).

Berikut adalah fungsi mysqli_prepare() untuk proses penambahan data:

<?php
// buat koneksi dengan MySQL, gunakan database: universitas
$link = mysqli_connect('localhost', 'root', '', 'universitas');
 
// buat prepared statements
$stmt = mysqli_prepare($link, "INSERT INTO mahasiswa_ilkom 
VALUES (?, ?, ?, ?, ?)");
?>

Perhatikan cara penulisan query INSERT diatas. Karena fungsi prepared statements yang memisahkan query dengan data, maka di kolom VALUES, kita tidak langsung menuliskan data yang akan ditambahkan, tetapi menggunakan tanda “?” sebanyak 5 kali untuk penanda data yang akan diinput. Kelima data ini selanjutnya akan ditambahkan pada saat proses bind.

Proses kedua: bind

Proses pengiriman data (bind) dilakukan dengan fungsi mysqli_stmt_bind_param(). Karena query INSERT kita membutuhkan 5 variabel, maka fungsi mysqli_stmt_bind_param() juga harus menyertakan kelima variabel ini (untuk mengganti karakter (?, ?, ?, ?, ?)).

Sebelumnya, kita harus menuliskan masing-masing isian ke dalam variabel terpisah, lalu kemudian baru diinput kedalam fungsi mysqli_stmt_bind_param(). Berikut adalah contoh kode program dimana saya akan men-bind data ke dalam prepared statement:

<?php
// hubungkan "data" dengan prepared statements
mysqli_stmt_bind_param($stmt, "ssisd",
$nim_mhs, $nama_mhs, $umur_mhs , $tempat_lahir_mhs, $ipk_mhs);
 
// siapkan "data" query
$nim_mhs="089023020";
$nama_mhs="Naira Alika";
$umur_mhs=20;
$tempat_lahir_mhs="Padang";
$ipk_mhs=3.9;
?>

Dalam contoh diatas, fungsi mysqli_stmt_bind_param() memiliki 7 argumen. Argumen pertama adalah variabel $stmt hasil fungsi mysqli_prepare(), argumen kedua adalah string yang menunjukkan 5 tipe data. Argumen ke-3 sampai ke-7 adalah variabel yang akan berisi data yang ingin diinput.

Untuk argumen kedua saya menulis “ssisd”, yang merupakan singkatan dari “string string string integer string decimal”. String ini akan berpasangan dengan variabel inputan ke-3 sampai ke-7:

  • $nim_mhs = “089023020” (string).
  • $nama_mhs = “Naira Alika” (string).
  • $umur_mhs = 20 (integer).
  • $tempat_lahir_mhs = Padang (string).
  • $ipk_mhs = 3.9 (decimal / float).

Setelah penulisan fungsi mysqli_stmt_bind_param(), saya kemudian membuat data sample mahasiswa dengan nama “Naira Alika”. Perhatikan bahwa isi data ini diinput ke dalam variabel yang sama dengan yang digunakan pada fungsi mysqli_stmt_bind_param() untuk argumen ke-3 s/d ke-7.

Data-data inilah yang nantinya di-bind dengan query asal, sehingga query kita akan menjadi:

INSERT INTO mahasiswa_ilkom VALUES 
("089023020", "Naira Alika", 20, "Padang", 3.9)

Proses ketiga: execute

Setelah query dan data selesai diinput, kita tinggal menjalankan query dengan fungsi mysqli_stmt_execute():

<?php
// jalankan query: execute
mysqli_stmt_execute($stmt);
?>

Memeriksa Hasil Query

Untuk memeriksa apakah hasil query INSERT yang dijalankan berhasil atau tidak, bisa dilakukan dengan memeriksa variabel $stmt dan fungsi mysqli_stmt_affected_rows(), seperti contoh berikut:

<?php
// cek hasil query
if (!$stmt) {
   die('Query Error : '.mysqli_errno($link).' - '.mysqli_error($link));
}
else {
   echo "Penambahan ".mysqli_stmt_affected_rows($stmt)." data berhasil<br />";
}
?>

Kondisi if (!$stmt) akan menjadi TRUE ketika query gagal, sehingga fungsi die() akan menghentikan proses dan menampilkan error yang terjadi. Tetapi jika query sukses, bagian else yang akan dijalankan.

Fungsi mysqli_stmt_affected_rows() mirip dengan fungsi mysql_ affected_rows() yang pernah kita bahas, dan akan menampilkan berapa jumlah baris yang diupdate. Karena pada contoh kali ini kita hanya menambahkan 1 buah data, maka hasilnya adalah: 1.

Agar lebih yakin, saya kemudian akan menampilkan seluruh tabel mahasiswa_ilkom dengan kode berikut:

<?php
// jalankan query untuk memeriksa hasil inputan
$result = mysqli_query($link, "SELECT * FROM mahasiswa_ilkom");
 
// tampilkan query
while ($row=mysqli_fetch_row($result)) {
   echo "$row[0] $row[1] $row[2] $row[3] $row[4]";
   echo "<br />";
}
?>

Kode diatas sudah sering kita gunakan, sehingga saya tidak akan membahasnya lagi.

Terakhir adalah fungsi opsional untuk memutus koneksi dengan MySQL Server:

<?php
// tutup statements
mysqli_stmt_close($stmt);
 
// tutup koneksi
mysqli_close($link);
?>

Dengan menggabungkan seluruh pembahasan kita diatas, berikut adalah contoh kode program PHP lengkap mengenai cara menginput data MySQL menggunakan mysqli prepared statement:

<?php
// buat koneksi dengan MySQL, gunakan database: universitas
$link = mysqli_connect('localhost', 'root', '', 'universitas');
 
// buat prepared statements
$stmt = mysqli_prepare($link, "INSERT INTO mahasiswa_ilkom 
VALUES (?, ?, ?, ?, ?)");
 
// hubungkan "data" dengan prepared statements
mysqli_stmt_bind_param($stmt, "ssisd", 
$nim_mhs, $nama_mhs, $umur_mhs , $tempat_lahir_mhs, $ipk_mhs);
 
// siapkan "data" query
$nim_mhs="089023020";
$nama_mhs="Naira Alika";
$umur_mhs=20;
$tempat_lahir_mhs="Padang";
$ipk_mhs=3.9;
 
// jalankan query
mysqli_stmt_execute($stmt);
 
// cek hasil query
if (!$stmt) {
   die('Query Error : '.mysqli_errno($link).' - '.mysqli_error($link));
}
else {
   echo "Penambahan ".mysqli_stmt_affected_rows($stmt). " data berhasil<br />";
}
 
// jalankan query untuk memeriksa hasil inputan
$result = mysqli_query($link, "SELECT * FROM mahasiswa_ilkom");
 
// tampilkan 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);
?>

Apabila dijalankan, maka hasil yang didapat adalah sebagai berikut:

Penambahan 1 data berhasil
089023013 Alex Supriyanto 23 Surabaya 2.90
089023020 Naira Alika 20 Padang 3.90
089045001 Andi Suryo 23 Jakarta 2.70
099145055 Neil Situmorang 22 Medan 1.90
109223041 Rani Sabrina 21 Padang 3.70
109245021 Santi Syanum 21 Malang 3.20

Bisa terlihat bahwa data mahasiswa baru: “Naira Alika” telah masuk kedalam tabel mahasiswa_ilkom.


Cara Menginput Multiple Data dengan mysqli Prepared Statements

Masih berkaitan dengan pembahasan kita, saya akan memodifikasi sedikit kode program untuk menampilkan cara menginput banyak data (multiple data) menggunakan mysqli prepared statement:

<?php
// buat koneksi dengan MySQL, gunakan database: universitas
$link = mysqli_connect('localhost', 'root', '', 'universitas');
 
// buat prepared statements
$stmt = mysqli_prepare($link, "INSERT INTO mahasiswa_ilkom 
VALUES (?, ?, ?, ?, ?)");
 
// hubungkan "data" dengan prepared statements
mysqli_stmt_bind_param($stmt, "ssisd", 
$nim_mhs, $nama_mhs, $umur_mhs , $tempat_lahir_mhs, $ipk_mhs);
 
// siapkan "data" query 1
$nim_mhs="089023023";
$nama_mhs="Alika Shanum";
$umur_mhs=21;
$tempat_lahir_mhs="Medan";
$ipk_mhs=3.8;
 
// jalankan query 1
mysqli_stmt_execute($stmt);
 
// cek hasil query 1
if (!$stmt) {
   die('Query Error : '.mysqli_errno($link).' - '.mysqli_error($link));
}
else {
   echo "Penambahan ".mysqli_stmt_affected_rows($stmt)." data berhasil<br />";
}
 
// siapkan "data" query 2
$nim_mhs="089023026";
$nama_mhs="Rina Melita";
$umur_mhs=22;
$tempat_lahir_mhs="Lampung";
$ipk_mhs=3.5;
 
// jalankan query 2
mysqli_stmt_execute($stmt);
 
// cek hasil query 2
if (!$stmt) {
   die('Query Error : ' .mysqli_errno($link).' - '.mysqli_error($link));
}
else {
   echo "Penambahan ".mysqli_stmt_affected_rows($stmt)." data berhasil<br />";
}
 
// siapkan "data" query 3
$nim_mhs="089023031";
$nama_mhs="Joni Halim";
$umur_mhs=21;
$tempat_lahir_mhs="Palembang";
$ipk_mhs=3.6;
 
// jalankan query 3
mysqli_stmt_execute($stmt);
 
// cek hasil query 3
if (!$stmt) {
   die('Query Error : '.mysqli_errno($link).' - '.mysqli_error($link));
}
else {
   echo "Penambahan ".mysqli_stmt_affected_rows($stmt)." data berhasil<br />";
}
 
// jalankan query untuk memeriksa hasil inputan
$result = mysqli_query($link, "SELECT * FROM mahasiswa_ilkom");
 
// tampilkan 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);
?>

Kode diatas sedikit panjang, tetapi jika anda sudah memahami konsep prepared statement, fungsi-fungsi yang ada bisa dipahami dengan mudah.

Perhatikan bahwa ketika kita menginput banyak data, kita tidak perlu lagi mengirimkan query ke MySQL Server, tetapi cukup dengan mengubah variabel data dan menjalankan fungsi mysqli_stmt_execute(). Untuk situasi inilah prepared statement menjadi lebih efisien dari pada metoda mysqli ‘biasa’.

Jika anda menjalankan kode program diatas, berikut adalah hasil yang didapat:

Penambahan 1 data berhasil
Penambahan 1 data berhasil
Penambahan 1 data berhasil
089023013 Alex Supriyanto 23 Surabaya 2.90
089023020 Naira Alika 20 Padang 3.90
089023023 Alika Shanum 21 Medan 3.80
089023026 Rina Melita 22 Lampung 3.50
089023031 Joni Halim 21 Palembang 3.60
089045001 Andi Suryo 23 Jakarta 2.70
099145055 Neil Situmorang 22 Medan 1.90
109223041 Rani Sabrina 21 Padang 3.70
109245021 Santi Syanum 21 Malang 3.20

Cara Menginput Data dengan mysqli Prepared Statements (object style)

Dalam pembahasan diatas, saya menggunakan procedural style mysqli, kali ini kita akan melihat modifikasi kode programnya jika menggunakan object style mysqli:

<?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("INSERT INTO mahasiswa_ilkom 
VALUES (?, ?, ?, ?, ?)");
 
// hubungkan "data" dengan prepared statements
$stmt->bind_param("ssisd", 
$nim_mhs, $nama_mhs, $umur_mhs , $tempat_lahir_mhs, $ipk_mhs);

// siapkan "data" query
$nim_mhs="089023020";
$nama_mhs="Naira Alika";
$umur_mhs=20;
$tempat_lahir_mhs="Padang";
$ipk_mhs=3.9;

// jalankan query
$stmt->execute();

// cek query
if (!$stmt) {
   die('Query Error : '.$mysqli->errno.
   ' - '.$mysqli->error);
}
else {
   echo "Penambahan ".$stmt->affected_rows. " data berhasil<br />";
}

// jalankan query untuk memeriksa hasil inputan
$result = $mysqli->query("SELECT * FROM mahasiswa_ilkom");

// 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 belajar PHP MySQL kali ini kita telah mempelajari cara menggunakan mysqli prepared statement untuk menginput data kedalam database. Tutorial kali ini menutup sesi pembahasan tentang mysqli. Dalam tutorial berikutnya kita akan berkenalan dengan extension ketiga PHP-MySQL, yakni PDO: PHP Data Object.


Tutorial Terkait:

6 Comments

  1. bayu
    08 Jun 16
    • Andre
      09 Jun 16
  2. Aufa Billah
    17 Feb 17
    • Andre
      17 Feb 17
  3. Anonymous
    20 Jul 17
    • Andre
      21 Jul 17

Add Comment