Pernyataan yang disediakan sangat berguna untuk menghalang suntikan MySQL.
SQL injection ialah untuk memasukkan arahan SQL ke dalam penyerahan borang Web atau memasukkan rentetan pertanyaan untuk nama domain atau permintaan halaman, akhirnya menipu pelayan untuk melaksanakan perintah SQL yang berniat jahat.
Pernyataan yang disediakan dan parameter terikat
Pernyataan yang disediakan digunakan untuk melaksanakan berbilang pernyataan SQL yang serupa dengan kecekapan pelaksanaan tinggi yang lebih tinggi.
Prinsip kerja pernyataan yang disediakan adalah seperti berikut:
1. Prapemprosesan: Cipta templat pernyataan SQL dan hantar ke pangkalan data. Nilai terpelihara ditandakan dengan parameter "?". Contohnya:
MASUKKAN KE DALAM Tetamu Saya (nama depan, nama keluarga, e-mel) NILAI(?, ?, ?)
2. Pangkalan Data Menghuraikan, menyusun, melaksanakan pengoptimuman pertanyaan pada templat pernyataan SQL dan menyimpan hasil tanpa mengeluarkannya. Aplikasi boleh melaksanakan kenyataan berbilang kali jika nilai parameter berbeza.
3. Perlaksanaan: Akhir sekali, hantar nilai terikat aplikasi kepada parameter ("?"), dan pangkalan data melaksanakan pernyataan.
Berbanding dengan melaksanakan secara langsung pernyataan SQL, pernyataan yang disediakan mempunyai dua kelebihan utama
· Kenyataan yang disediakan sangat mengurangkan masa analisis, dan hanya satu pertanyaan dibuat (walaupun pernyataan itu dilaksanakan beberapa kali).
· Parameter pengikatan mengurangkan lebar jalur pelayan, anda hanya perlu menghantar parameter pertanyaan dan bukannya keseluruhan pernyataan.
· Penyata yang disediakan sangat berguna untuk suntikan SQL, kerana protokol berbeza digunakan selepas nilai parameter dihantar, memastikan kesahihan data.
MySQLi menyediakan kenyataan
berikutan The contoh menggunakan pernyataan yang disediakan dalam MySQLi dan mengikat parameter yang sepadan:
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $servername = "localhost"; $username = "root"; $password = "root"; $dbname = "test"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 预处理及绑定 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"); $stmt->bind_param("sss", $firstname, $lastname, $email); // 设置参数并执行 $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 "新记录插入成功"; $stmt->close(); $conn->close(); ?>
Hilang setiap baris kod dalam contoh berikut:
"INSERT INTO MyGuests (nama depan, nama keluarga, e-mel) NILAI(?, ?, ?)"
Dalam pernyataan SQL, kami menggunakan tanda soal (?), di sini kami boleh Gantikan tanda soal dengan integer , rentetan, rangkap dua dan boolean.
Seterusnya, mari kita lihat fungsi bind_param():
$stmt->bind_param("sss", $firstname, $lastname, $email );
Fungsi ini mengikat parameter SQL dan memberitahu pangkalan data nilai parameter. Lajur parameter "sss" mengendalikan jenis data parameter yang selebihnya Terdapat beberapa (?) di atas dan beberapa jenis data di bawah.
Parameter mempunyai empat jenis berikut:
· i - integer (jenis integer)
· d - double (jenis titik terapung ketepatan ganda)
· s - rentetan (rentetan)
· b - BLOB (objek besar binari: objek besar binari)
Setiap parameter perlu menentukan jenisnya.
Cara menentukan jenis data telah diperkenalkan di bahagian sebelumnya
Dengan memberitahu pangkalan data jenis data parameter, risiko suntikan SQL dapat dikurangkan.
Hasil pelaksanaan kod di atas:
Rekod baharu berjaya dimasukkan
Semak sama ada data anda ada di sana Sisipan berjaya?
Contoh
Mari kami masukkan data dalam borang ke dalam pangkalan data
Pertama Halaman HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PHP中文网</title> </head> <body> <form action="insert.php" method="post"> Firstname: <input type="text" name="firstname" /><br/> Lastname: <input type="text" name="lastname" /><br/> email: <input type="text" name="email" /><br/> <input type="submit" /> </form> </body> </html>
diserahkan ke halaman PHP
<?php header("Content-type:text/html;charset=utf-8"); //设置编码 $servername = "localhost"; $username = "root"; $password = "root"; $dbname = "test"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 预处理及绑定 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"); $stmt->bind_param("sss", $firstname, $lastname, $email); // 设置参数并执行 $firstname = $_POST['firstname']; $lastname =$_POST['lastname']; $email = $_POST['email']; $stmt->execute(); echo "新记录插入成功"; $stmt->close(); $conn->close(); ?>
Melalui dua atur cara di atas, data dalam bentuk kami boleh dimasukkan ke dalam pangkalan data