Pernyataan prepare sangat berguna untuk melawan injeksi SQL.
Section Artikel
Pernyataan prepare adalah fitur yang digunakan untuk menjalankan pernyataan SQL yang sama (atau serupa) berulang kali dengan efisiensi tinggi.
Pernyataan prepare pada dasarnya bekerja seperti ini:
Dibandingkan dengan menjalankan pernyataan SQL secara langsung, pernyataan prepare memiliki tiga keunggulan utama:
Contoh berikut menggunakan pernyataan prepare dan parameter bound di MySQLi:
Contoh (MySQLi dengan Pernyataan Disiapkan):
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Buat Koneksi $conn = new mysqli($servername, $username, $password, $dbname); // Periksa Koneksi if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // persiapkan dan ikat $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $firstname, $lastname, $email); // atur parameter dan eksekusi $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "New records created successfully"; $stmt->close(); $conn->close(); ?>
Baris kode yang akan dijelaskan dari contoh di atas:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
Dalam SQL kita memasukkan tanda tanya (?) Di mana kita ingin mengganti nilai integer, string, double atau blob.
Kemudian, lihat fungsi bind_param ():
$stmt->bind_param("sss", $firstname, $lastname, $email);
Fungsi ini mengikat parameter ke kueri SQL dan memberi tahu database apa saja parameternya. Argumen “sss” mencantumkan jenis data yang menjadi parameternya. Karakter s memberitahu mysql bahwa parameternya adalah string.
Argumennya mungkin salah satu dari empat jenis di bawah ini:
Kita harus memiliki salah satunya untuk setiap parameter.
Dengan memberi tahu mysql jenis data apa yang diharapkan, kita bisa meminimalkan risiko injeksi SQL.
Catatan: Jika kita ingin memasukkan data apa pun dari sumber eksternal (seperti input pengguna), sangat penting jika data dibersihkan dan divalidasi.
Contoh berikut menggunakan pernyataan yang disiapkan dan parameter terikat di PDO:
Contoh (PDO dengan Pernyataan Disiapkan):
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // atur mode error PDO ke exceptions $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // siapkan parameter sql dan bind $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)"); $stmt->bindParam(':firstname', $firstname); $stmt->bindParam(':lastname', $lastname); $stmt->bindParam(':email', $email); // masukkan baris lain $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); // masukkan baris lain $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); // masukkan baris lain $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "New records created successfully"; } catch(PDOException $e) { echo "Error: " . $e->getMessage(); } $conn = null; ?>