PHP – Prepared

câu lệnh Prepared rất hữu ích trong việc chống lại SQL injections.

Prepared Statements và Bound Parameters

Câu lệnh prepared là tính năng để thực thi các câu lệnh SQL giống nhau (hoặc tương tự) lặp đi lặp lại với hiệu quả cao.

Câu lệnh prepared được thực hiện như sau:

  • Prepare: Một mẫu câu lệnh SQL được tạo và gửi đến database. Các giá trị không được chỉ định, được gọi là tham số (có nhãn “?”). Ví dụ: INSERT INTO MyGuests VALUES(?, ?, ?)
  • Cơ sở dữ liệu sẽ phân tích cú pháp, biên dịch và thực hiện tối ưu hóa truy vấn trên mẫu câu lệnh SQL và lưu trữ kết quả mà không thực thi câu lệnh này.
  • Execute : Sau đó, ứng dụng bind các giá trị với các tham số và cơ sở dữ liệu thực thi câu lệnh. Nó có thể thực thi câu lệnh nhiều lần theo ý muốn với các giá trị khác nhau.

Câu lệnh prepared có các ưu điểm sau:

  • Câu lệnh prepared giúp giảm thời gian phân tích cú pháp vì việc chuẩn bị truy vấn được thực hiện chỉ một lần (mặc dù câu lệnh được thực hiện nhiều lần)
  • Bound parameters giảm băng thông tới server vì chỉ gửi value mỗi lần chứ không phải toàn bộ truy vấn.
  • Câu lệnh prepared rất hữu ích đối với việc chống lại SQL injections, bởi vì các giá trị tham số, được truyền vào sau bằng cách sử dụng một giao thức khác.

Prepared Statements trong MySQLi

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// set parameters and execute
$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();
?>

Trong câu SQL, chúng ta thêm dấu chấm hỏi (?) nơi chúng ta muốn thay thế cho giá trị integer, string, double hay blob.

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

function bind_param()

$stmt->bind_param("sss", $firstname, $lastname, $email);

function này sẽ bind tham số vào SQL query và thông báo với database kiểu dữ liệu. “sss” liệt kê các loại dữ liệu mà các tham số (s báo mysql biết tham số là một string).

  • i – integer
  • d – double
  • s – string
  • b – BLOB

Chúng ta phải có một trong các ký tự này cho mỗi tham số.

Prepared Statements trong PDO

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // prepare sql and bind parameters
    $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);

    // insert a row
    $firstname = "John";
    $lastname = "Doe";
    $email = "john@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Mary";
    $lastname = "Moe";
    $email = "mary@example.com";
    $stmt->execute();

    // insert another row
    $firstname = "Julie";
    $lastname = "Dooley";
    $email = "julie@example.com";
    $stmt->execute();

    echo "New records created successfully";
    }
catch(PDOException $e)
    {
    echo "Error: " . $e->getMessage();
    }
$conn = null;
?>