PHP MySQL menyediakan kenyataan

Pernyataan 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.

Penyata prapemprosesan berfungsi seperti berikut:

1. Prapemprosesan: Cipta templat pernyataan SQL dan hantarkannya ke pangkalan data. Nilai terpelihara ditandakan dengan parameter "?". Contohnya:

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

2. Penghuraian pangkalan data, penyusunan, pengoptimuman pertanyaan pada templat pernyataan SQL dan storan keputusan Tiada keluaran.

3. 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 penyataan SQL secara langsung, penyataan yang disediakan mempunyai dua kelebihan utama:

1) Penyataan yang disediakan sangat mengurangkan masa analisis dan hanya membuat satu pertanyaan (walaupun penyataan itu dilaksanakan beberapa kali).

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

Pernyataan yang disediakan sangat berguna untuk suntikan SQL, kerana protokol berbeza digunakan selepas nilai parameter dihantar, memastikan kesahihan data.

Penyata yang disediakan MySQLi

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:

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

Dalam pernyataan SQL, kami menggunakan tanda soal (?), di sini kami boleh menggantikan tanda soal dengan Integer, rentetan, gandaan , 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 type)

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.

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 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;
?>


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