Penggunaan fungsi PREPARED pada PHP

CRUD merupakan singkatan dari Create, Read, Update, dan Delete. Operasi CRUD adalah dasar yang harus diketahui oleh setiap programmer, karena Operasi CRUD merupakan operasi dasar yang akan selalu digunakan dalam membangun sebuah sistem.

Aplikasi CRUD dengan PHP dan MySQLi ini dibangun menggunakan bahasa pemrograman PHP dan database MySQL. Sama seperti aplikasi yang sudah saya posting sebelumnya, untuk cara mengakses databasenya menggunakan MySQLi Extension dan konsep pemrogramannya menggunakan konsep pemrograman berorientasi objek (object oriented style). Untuk membuat query saya menggunakan fungsi prepared statements. 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).

Script didalam aplikasi ini dapat kalian pelajari dengan mudah karena sudah saya berikan komentar pada setiap prosesnya, sehingga dapat digunakan sebagai referensi bagi teman-teman yang sedang belajar pemrograman PHP menggunakan mysqli extension dengan konsep pemrograman berorientasi objek (object oriented style) dan menggunakan prepared statements.

Fitur Aplikasi

1.   Create (Menyimpan Data)

Membuat script untuk menyimpan/insert data dari aplikasi ke database MySQL menggunakan prepared statements.

2.   Read (Menampilkan Data)

Membuat script untuk membaca atau menampilkan data dari database MySQL ke aplikasi menggunakan prepared statements. Menampilkan semua data yang ada pada database dan menampilkan data dengan kriteria tertentu.

3.   Update (Mengubah Data)

Membuat script untuk mengubah/update data pada database MySQL melalui apilkasi menggunakan prepared statements.

4.   Delete (Menghapus Data)

Membuat script menghapus/delete data pada database MySQL melalui aplikasi menggunakan prepared statements.

5.   JQuery DataTables

Membuat tabel menggunakan JQuery DataTables untuk menampilkan data dari database MySQL. Tabel sudah dilengkapi dengan filter jumlah data yang ditampilkan, form pencarian data dan pagination.

6.   CSS Bootstrap 3

Membuat tampilan aplikasi menggunakan CSS Bootstrap 3.

7.   Fungsi membatasi karakter yang diinputkan

Membuat fungsi untuk membatasi karakter yang diinputkan. Bisa diinputkan huruf, angka atau karakter tertentu saja.

8.   Keamanan dasar untuk mencegah SQL injection

Membuat keamanan dasar untuk mencegah SQL injection saat proses input data. Menghilangkan spasi dibelakang dan didepan kata yang diinputkan.

Tampilan Aplikasi CRUD

Penggunaan fungsi PREPARED pada PHP


Sekian penjelasan tentang Aplikasi CRUD dengan PHP dan MySQLi ini. Semoga aplikasi ini dapat membantu teman-teman yang sedang belajar membuat aplikasi berbasis web menggunakan mysqli extension dengan konsep pemrograman berorientasi objek (object oriented style) dan menggunakan prepared statements.

Jika teman-teman ingin mempelajari aplikasi ini, silahkan kunjungi repositories saya di Github indrasatya

Atau teman-teman bisa download semua aplikasi yang ada diwebsite melalui link dibawah ini



Apa Itu Pernyataan Prepared

Pernyataan prepared (juga dikenal sebagai pernyataan parameterized) hanyalah template query SQL yang berisi placeholder sebagai ganti nilai parameter aktual. Placeholder ini akan diganti dengan nilai aktual pada saat pelaksanaan pernyataan tersebut.

MySQLi mendukung penggunaan anonymous positional placeholder ( ? ), Seperti yang ditunjukkan di bawah ini:

Penggunaan fungsi PREPARED pada PHP

Sementara, PDO mendukung anonymous positional placeholder ( ? ), Serta placeholder yang disebutkan. Placeholder bernama dimulai dengan titik dua ( : ) diikuti oleh pengenal, seperti ini:

Penggunaan fungsi PREPARED pada PHP

Eksekusi pernyataan prepared terdiri dari dua tahap: prepare dan execute.

  • Prepare —- Pada tahap prepare, pernyataan template SQL dibuat dan dikirim ke server database. Server mem-parsing pernyataan template, melakukan pemeriksaan sintaks dan optimasi query, dan menyimpannya untuk digunakan nanti.
  • Execute —- Selama eksekusi, nilai-nilai parameter dikirim ke server. Server membuat pernyataan dari pernyataan template dan nilai-nilai ini untuk menjalankannya.

Pernyataan yang disiapkan sangat berguna, khususnya dalam situasi ketika kalian menjalankan pernyataan tertentu beberapa kali dengan nilai yang berbeda, misalnya, serangkaian pernyataan INSERT. Bagian berikut menjelaskan beberapa manfaat utama penggunaannya.

Keuntungan Menggunakan Pernyataan Prepared

Pernyataan prepared dapat mengeksekusi pernyataan yang sama berulang kali dengan efisiensi tinggi, karena pernyataan hanya diurai (parsed) sekali lagi, sementara itu dapat dieksekusi berkali-kali. Ini juga meminimalkan penggunaan bandwidth, karena pada setiap eksekusi hanya nilai placeholder yang perlu ditransmisikan ke server database bukan pernyataan SQL lengkapnya.

Pernyataan prepared juga memberikan perlindungan yang kuat terhadap injeksi SQL, karena nilai parameter tidak tertanam langsung di dalam string kueri SQL. Nilai parameter dikirim ke server database secara terpisah dari query menggunakan protokol yang berbeda dan dengan demikian tidak dapat mencampuri hal tersebut. Server menggunakan nilai-nilai ini secara langsung pada titik eksekusi, setelah template pernyataan diuraikan (parsed). Itu sebabnya mengapa pernyataan prepared tidak rentan terhadap error, dan karena hal tersebutlah maka pernyataan tersebut dianggap sebagai salah satu elemen paling penting dalam keamanan basis data.

Contoh berikut akan menunjukkan kepada kalian bagaimana pernyataan prepared benar-benar berfungsi:

<?php
/* Attempt MySQL server connection. Assuming you are running MySQL
server with default setting (user 'root' with no password) */
$link = mysqli_connect("localhost", "root", "", "demo");
 
// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
 
// Prepare an insert statement
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
 
if($stmt = mysqli_prepare($link, $sql)){
    // Bind variables to the prepared statement as parameters
    mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
    
    /* Set the parameters values and execute
    the statement again to insert another row */
    $first_name = "Hermione";
    $last_name = "Granger";
    $email = "";
    mysqli_stmt_execute($stmt);
    
    /* Set the parameters values and execute
    the statement to insert a row */
    $first_name = "Ron";
    $last_name = "Weasley";
    $email = "";
    mysqli_stmt_execute($stmt);
    
    echo "Records inserted successfully.";
} else{
    echo "ERROR: Could not prepare query: $sql. " . mysqli_error($link);
}
 
// Close statement
mysqli_stmt_close($stmt);
 
// Close connection
mysqli_close($link);
?>

Seperti yang kalian lihat pada contoh di atas, kita telah menyiapkan pernyataan INSERT hanya sekali tetapi mengeksekusinya beberapa kali dengan melewati serangkaian parameter yang berbeda.

Penjelasan Kode (Procedural style)

Di dalam pernyataan SQL INSERT (baris no-12) dari contoh di atas, tanda tanya digunakan sebagai placeholder untuk nilai bidang first_name, last_name, email.

Fungsi mysqli_stmt_bind_param() (baris no-16) mengikat variabel ke placeholder ( ? ) Dalam template pernyataan SQL. Placeholder ( ? ) Akan digantikan oleh nilai aktual yang disimpan dalam variabel pada saat eksekusi. String definisi type yang disediakan sebagai argumen kedua yaitu string “sss” menentukan bahwa tipe data dari setiap variabel terikat adalah string.

String definisi tipe menentukan tipe data dari variabel bind terkait dan berisi satu atau lebih dari empat karakter berikut:

  • b — binary (seperti gambar, file PDF, dll.)
  • d — dobel (angka floating point)
  • i — integer (bilangan bulat)
  • s — string (teks)

Jumlah variabel mengikat dan jumlah karakter dalam tipe string definisi jenis harus cocok dengan jumlah placeholder dalam template pernyataan SQL.

Menggunakan Input yang Diterima melalui Form Web

Jika kalian ingat dari bab sebelumnya, kita telah membuat formulir HTML untuk memasukkan data ke dalam basis data. Di sini, kita akan memperluas contoh itu dengan menerapkan pernyataan prepared. Kalian bisa menggunakan formulir HTML yang sama untuk menguji contoh skrip insert berikut, tetapi pastikan kalian menggunakan nama file yang benar dalam atribut action dari formulir.

Berikut kode PHP yang diperbarui untuk memasukkan data. Jika kalian melihat contoh dengan cermat, kalian akan menemukan bahwa kita tidak menggunakan mysqli_real_escape_string() untuk keluar dari input pengguna, seperti yang telah kita lakukan pada contoh bab sebelumnya. Karena dalam pernyataan yang disiapkan, input pengguna tidak pernah diganti ke query string secara langsung, sehingga input tersebut tidak perlu diloloskan dengan benar.

<?php
/* Attempt MySQL server connection. Assuming you are running MySQL
server with default setting (user 'root' with no password) */
$link = mysqli_connect("localhost", "root", "", "demo");
 
// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
 
// Prepare an insert statement
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
 
if($stmt = mysqli_prepare($link, $sql)){
    // Bind variables to the prepared statement as parameters
    mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
    
    // Set parameters
    $first_name = $_REQUEST['first_name'];
    $last_name = $_REQUEST['last_name'];
    $email = $_REQUEST['email'];
    
    // Attempt to execute the prepared statement
    if(mysqli_stmt_execute($stmt)){
        echo "Records inserted successfully.";
    } else{
        echo "ERROR: Could not execute query: $sql. " . mysqli_error($link);
    }
} else{
    echo "ERROR: Could not prepare query: $sql. " . mysqli_error($link);
}
 
// Close statement
mysqli_stmt_close($stmt);
 
// Close connection
mysqli_close($link);
?>