PHP MySQL menyediakan kenyataan
Penyata yang disediakan sangat berguna untuk menghalang suntikan MySQL.
Pernyataan yang disediakan dan parameter terikat
Pernyataan yang disediakan digunakan untuk melaksanakan berbilang pernyataan SQL yang serupa dengan kecekapan pelaksanaan yang lebih tinggi.
Tutorial video yang disyorkan: "tutorial mysql" http://www.php.cn/course/list/51.html
Penyata prapemprosesan berfungsi seperti berikut:
Prapemprosesan: Cipta templat penyata SQL dan hantarkannya ke pangkalan data. Nilai terpelihara ditandakan dengan parameter "?". Contohnya:
KE DALAM MyGuests (nama depan, nama keluarga, e-mel) NILAI(?, ?, ?)
-
Penghuraian pangkalan data, penyusunan, pengoptimuman pertanyaan pada templat pernyataan SQL dan menyimpan hasil tanpa mengeluarkannya.
Pelaksanaan: Akhir sekali, nilai terikat aplikasi dihantar ke parameter ("?" tanda), dan pangkalan data melaksanakan pernyataan. Aplikasi boleh melaksanakan kenyataan beberapa kali jika nilai parameter berbeza.
Berbanding dengan melaksanakan secara langsung pernyataan SQL, pernyataan yang disediakan mempunyai dua kelebihan utama:
Pernyataan praproses sangat mengurangkan masa analisis, Hanya satu pertanyaan dibuat (walaupun kenyataan itu telah dilaksanakan beberapa kali).
Parameter pengikatan mengurangkan lebar jalur pelayan, anda hanya perlu menghantar parameter pertanyaan dan bukannya keseluruhan pernyataan.
Pernyataan praproses sangat berguna untuk suntikan SQL, kerana protokol berbeza digunakan selepas nilai parameter dihantar, memastikan kesahihan data.
Penyata yang disediakan MySQL
Contoh berikut menggunakan pernyataan yang disediakan dalam MySQLi dan mengikat parameter yang sepadan:
Contoh (MySQLi menggunakan pernyataan yang disediakan)
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // 创建连接 $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(); ?>menghuraikan setiap baris kod untuk contoh berikut:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"Dalam pernyataan SQL, kami menggunakan tanda soal (? ), di mana kami boleh menggantikan 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 tinggal. Watak s memberitahu pangkalan data bahawa parameter adalah rentetan.
Parameter mempunyai empat jenis berikut:
i - integer (jenis integer)
d - double (double precision floating point taip) )
s - rentetan (rentetan)
b - BLOB (objek besar binari: objek besar binari)
Setiap parameter perlu menentukan jenisnya.
Anda boleh mengurangkan risiko suntikan SQL dengan memberitahu pangkalan data jenis data parameter.
注意: 如果你想插入其他数据(用户输入),对数据的验证是非常重要的。 |
Pernyataan yang disediakan dalam PDO
Dalam contoh berikut, kami menggunakan pernyataan yang disediakan dan parameter pengikat dalam PDO:
Contoh (PDO menggunakan pernyataan yang disediakan)
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // 设置 PDO 错误模式为异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 预处理 SQL 并绑定参数 $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); // 插入行 $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 "新记录插入成功"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>