PHP MySQL menyediakan kenyataan

Penyata yang disediakan PHP MySQL


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.

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:

2. INSERT

KE DALAM MyGuests (nama depan, nama keluarga, e-mel) NILAI(?, ?, ?)

3 Templat melaksanakan pengoptimuman pertanyaan dan menyimpan hasil tanpa mengeluarkannya.

4. Perlaksanaan: Akhir sekali, hantar nilai terikat aplikasi kepada parameter ("?" tanda), dan pangkalan data melaksanakan pernyataan. Aplikasi boleh melaksanakan kenyataan beberapa kali jika nilai parameter berbeza.

Berbanding dengan melaksanakan penyataan SQL secara langsung, penyataan yang disediakan mempunyai dua kelebihan utama:

· Penyataan praproses sangat mengurangkan masa analisis dan hanya membuat satu pertanyaan (walaupun penyataan itu dilaksanakan beberapa kali ).

· Parameter pengikatan mengurangkan lebar jalur pelayan, anda hanya perlu menghantar parameter pertanyaan dan bukannya keseluruhan pernyataan.

· Penyataan praproses sangat berguna untuk suntikan SQL, kerana protokol berbeza digunakan selepas nilai parameter dihantar, memastikan kesahihan data.


Pernyataan 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();
 ?>

Parsing setiap baris kod dalam contoh berikut:

"MASUKKAN KE DALAM MyGuests (nama pertama, nama keluarga, e-mel) NILAI(?, ?, ?)"

Dalam pernyataan SQL, kita menggunakan tanda soal (?), di sini kita boleh menggantikan tanda soal dengan integer, rentetan, titik terapung berketepatan ganda dan nilai 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 (jenis titik terapung ketepatan ganda)

·       s - rentetan (rentetan)

·         b - BLOB (objek besar binari: objek besar binari)

Setiap parameter perlu menentukan jenis.

Anda boleh mengurangkan risiko suntikan SQL dengan memberitahu pangkalan data jenis data parameter.


Nota: Jika anda ingin memasukkan data lain (input pengguna), pengesahan data adalah sangat penting.

Pernyataan yang disediakan dalam PDO

Dalam contoh berikut, kami menggunakan pernyataan yang disediakan dan mengikat parameter 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;
 ?>


Meneruskan pembelajaran
||
<?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(); ?>
  • Cadangan kursus
  • Muat turun perisian kursus