Hướng dẫn PHP

TRANG CHỦ PHP Giới thiệu PHP Cài đặt PHP Cú pháp PHP Nhận xét PHP Các biến PHP PHP Echo / Print Các kiểu dữ liệu PHP Chuỗi PHP Số PHP Toán PHP Hằng số PHP Toán tử PHP PHP If ... Else ... Elseif Chuyển đổi PHP Vòng lặp PHP Các hàm PHP Mảng PHP PHP Superglobals PHP RegEx

Biểu mẫu PHP

Xử lý biểu mẫu PHP Xác thực biểu mẫu PHP Yêu cầu biểu mẫu PHP URL biểu mẫu PHP / E-mail Hoàn thành biểu mẫu PHP

PHP nâng cao

Ngày và giờ trong PHP Bao gồm PHP Xử lý tệp PHP Mở / Đọc tệp PHP Tạo / ghi tệp PHP Tải lên tệp PHP Cookie PHP Phiên PHP Bộ lọc PHP Bộ lọc PHP nâng cao Các chức năng gọi lại trong PHP PHP JSON Ngoại lệ PHP

PHP OOP

PHP OOP là gì Các lớp / đối tượng PHP Trình tạo PHP PHP Destructor Công cụ sửa đổi quyền truy cập PHP Kế thừa PHP Hằng số PHP Các lớp trừu tượng trong PHP Giao diện PHP Đặc điểm PHP Phương thức tĩnh trong PHP Thuộc tính tĩnh của PHP Không gian tên PHP Lặp lại PHP

Cơ sở dữ liệu MySQL

Cơ sở dữ liệu MySQL MySQL Connect MySQL Tạo cơ sở dữ liệu MySQL Tạo bảng MySQL Chèn dữ liệu MySQL Nhận ID cuối cùng MySQL Chèn Nhiều MySQL được chuẩn bị Dữ liệu chọn MySQL MySQL ở đâu MySQL Đặt hàng bởi MySQL Xóa dữ liệu Dữ liệu cập nhật MySQL Dữ liệu giới hạn MySQL

PHP XML

Trình phân tích cú pháp XML PHP Trình phân tích cú pháp PHP SimpleXML PHP SimpleXML - Nhận PHP XML Expat DOM XML PHP

PHP - AJAX

Giới thiệu về AJAX AJAX PHP Cơ sở dữ liệu AJAX AJAX XML Tìm kiếm trực tiếp AJAX Cuộc thăm dò ý kiến ​​của AJAX

Ví dụ về PHP

Ví dụ về PHP Trình biên dịch PHP PHP Quiz Bài tập PHP Chứng chỉ PHP

Tham chiếu PHP

Tổng quan về PHP Mảng PHP Lịch PHP Ngày PHP Thư mục PHP Lỗi PHP Ngoại lệ PHP Hệ thống tập tin PHP Bộ lọc PHP FTP PHP PHP JSON Từ khóa PHP PHP Libxml Thư PHP Toán PHP PHP Misc PHP MySQLi Mạng PHP Kiểm soát đầu ra PHP PHP RegEx PHP SimpleXML Luồng PHP Chuỗi PHP Xử lý biến PHP Trình phân tích cú pháp XML PHP PHP Zip Múi giờ PHP

Tuyên bố chuẩn bị cho PHP MySQL


Các câu lệnh chuẩn bị sẵn rất hữu ích để chống lại việc tiêm SQL.


Tuyên bố chuẩn bị và tham số ràng buộc

Câu lệnh chuẩn bị là một tính năng được sử dụ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ác câu lệnh chuẩn bị về cơ bản hoạt động như sau:

  1. Chuẩn bị: Một mẫu câu lệnh SQL được tạo và gửi đến cơ sở dữ liệu. Các giá trị nhất định không được xác định, được gọi là tham số (có nhãn "?"). Ví dụ: CHÈN VÀO CÁC GIÁ TRỊ CỦA MyGuests (?,?,?)
  2. Cơ sở dữ liệu 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 cần thực thi nó
  3. Thực thi: Sau đó, ứng dụng liên kết các giá trị với các tham số và cơ sở dữ liệu thực thi câu lệnh. Ứng dụng có thể thực thi câu lệnh bao nhiêu lần tùy ý với các giá trị khác nhau

So với việc thực thi trực tiếp các câu lệnh SQL, các câu lệnh chuẩn bị sẵn có ba ưu điểm chính:

  • Các câu lệnh chuẩn bị làm giảm thời gian phân tích cú pháp vì việc chuẩn bị trên truy vấn chỉ được thực hiện một lần (mặc dù câu lệnh được thực hiện nhiều lần)
  • Tham số ràng buộc giảm thiểu băng thông đến máy chủ vì bạn chỉ cần gửi các tham số mỗi lần, chứ không phải toàn bộ truy vấn
  • Các câu lệnh chuẩn bị sẵn rất hữu ích để chống lại việc tiêm SQL, bởi vì các giá trị tham số, được truyền sau này bằng một giao thức khác, không cần phải được thoát một cách chính xác. Nếu mẫu câu lệnh ban đầu không có nguồn gốc từ đầu vào bên ngoài, thì không thể xảy ra chèn SQL.

Các câu lệnh chuẩn bị trong MySQLi

Ví dụ sau sử dụng các câu lệnh đã chuẩn bị và các tham số liên kết trong MySQLi:

Ví dụ (MySQLi với các câu lệnh chuẩn bị)

<?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 = "[email protected]";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();

echo "New records created successfully";

$stmt->close();
$conn->close();
?>

Các dòng mã để giải thích từ ví dụ trên:

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

Trong SQL của chúng tôi, chúng tôi chèn một dấu chấm hỏi (?) Mà chúng tôi muốn thay thế bằng giá trị số nguyên, chuỗi, kép hoặc blob.

Sau đó, hãy xem hàm bind_param ():

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

Hàm này liên kết các tham số với truy vấn SQL và cho cơ sở dữ liệu biết các tham số là gì. Đối số "sss" liệt kê các loại dữ liệu mà các tham số là. Ký tự s cho mysql biết rằng tham số là một chuỗi.

Đối số có thể là một trong bốn loại:

  • i - số nguyên
  • d - gấp đôi
  • s - chuỗi
  • b - BLOB

Chúng ta phải có một trong những thứ này cho mỗi tham số.

Bằng cách cho mysql biết loại dữ liệu mong đợi, chúng tôi giảm thiểu nguy cơ bị tiêm SQL.

Lưu ý: Nếu chúng tôi muốn chèn bất kỳ dữ liệu nào từ các nguồn bên ngoài (như thông tin người dùng nhập vào), thì điều rất quan trọng là dữ liệu đó phải được làm sạch và xác thực.



Các câu lệnh chuẩn bị trong PDO

Ví dụ sau sử dụng các câu lệnh đã chuẩn bị và các tham số ràng buộc trong PDO:

Ví dụ (PDO với các câu lệnh soạn sẵn)

<?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 = "[email protected]";
  $stmt->execute();

  // insert another row
  $firstname = "Mary";
  $lastname = "Moe";
  $email = "[email protected]";
  $stmt->execute();

  // insert another row
  $firstname = "Julie";
  $lastname = "Dooley";
  $email = "[email protected]";
  $stmt->execute();

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