Hướng dẫn can we use prepared statement for select query in php? - chúng ta có thể sử dụng câu lệnh đã chuẩn bị sẵn cho truy vấn chọn trong php không?


Các tuyên bố đã chuẩn bị rất hữu ích chống lại SQL tiêm.


Các câu lệnh được chuẩn bị và các tham số ràng buộc

Một câu lệnh đã chuẩn bị là một tính năng được sử dụng để thực hiện các câu lệnh SQL (hoặc tương tự) giống nhau với hiệu quả cao.

Các tuyên bố chuẩn bị về cơ bản hoạt động như thế này:

  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. Một số giá trị nhất định không được xác định, được gọi là tham số (được dán nhãn "?"). Ví dụ: Chèn vào các giá trị 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 hiện 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 nhiều lần như nó muốn với các giá trị khác nhau

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

  • Các câu lệnh đã chuẩn bị giảm thời gian phân tích cú pháp khi 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 thi nhiều lần)
  • Các tham số ràng buộc giảm thiểu băng thông cho 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 được chuẩn bị rất hữu ích đối với tiêm SQL, bởi vì các giá trị tham số, được truyền sau đó bằng cách sử dụng một giao thức khác, không cần phải thoát ra một cách chính xác. Nếu mẫu câu lệnh gốc không có nguồn gốc từ đầu vào bên ngoài, thì SQL tiêm không thể xảy ra.

Các tuyên bố đã chuẩn bị trong mysqli

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

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

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Tạo kết nối $ Conn = new mysqli ($ servername, $ username, $ password, $ dbname);
$conn = new mysqli($servername, $username, $password, $dbname);

// Kiểm tra Connectionif ($ Conn-> Connect_error) {& nbsp; & nbsp; die ("Kết nối không thành công:". $ Conn-> Connect_error); }
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// Chuẩn bị và ràng buộc $ STMT = $ Conn-> Chuẩn bị ("Chèn vào các giá trị của MyGuests (FirstName, LastName, Email) (?,?,?)"); $ STMT-> BIND_PARAM ("SSS", $ FirstName, $ Tên cuối cùng, $ Email);
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// Đặt tham số và thực thi $ firstName = "john"; $ lastName = "doe"; $ email = ""; $ stmt-> exec ();
$firstname = "John";
$lastname = "Doe";
$email = "";
$stmt->execute();

$ FirstName = "Mary"; $ lastName = "moe"; $ email = ""; $ stmt-> exec ();
$lastname = "Moe";
$email = "";
$stmt->execute();

$ firstName = "julie"; $ lastName = "dooley"; $ email = ""; $ STMT-> EXECUTE ();
$lastname = "Dooley";
$email = "";
$stmt->execute();

echo "các bản ghi mới được tạo thành công";

$ stmt-> đóng (); $ Conn-> đóng ();?>
$conn->close();
?>


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

"Chèn vào các giá trị của MyGuests (FirstName, LastName, Email) (?,?,?)" "

Trong SQL của chúng tôi, chúng tôi chèn một dấu hỏi (?) Khi chúng tôi muốn thay thế trong một số nguyên, chuỗi, gấp đôi hoặc giá trị 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 biết cơ sở dữ liệu 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à. Nhân vật S nói với MySQL rằng tham số là một chuỗi.

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

  • Tôi - Số nguyên
  • D - gấp đôi
  • S - Chuỗi
  • B - Blob

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

Bằng cách nói với MySQL loại dữ liệu nào sẽ xảy ra, chúng tôi giảm thiểu nguy cơ 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ư đầu vào của người dùng), điều rất quan trọng là dữ liệu được vệ sinh và xác thực. If we want to insert any data from external sources (like user input), it is very important that the data is sanitized and validated.



Báo cáo chuẩn bị trong PDO

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

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

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

// Tạo kết nối $ Conn = new mysqli ($ servername, $ username, $ password, $ dbname);
  $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);

// Kiểm tra Connectionif ($ Conn-> Connect_error) {& nbsp; & nbsp; die ("Kết nối không thành công:". $ Conn-> Connect_error); }
  $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);

// Chuẩn bị và ràng buộc $ STMT = $ Conn-> Chuẩn bị ("Chèn vào các giá trị của MyGuests (FirstName, LastName, Email) (?,?,?)"); $ STMT-> BIND_PARAM ("SSS", $ FirstName, $ Tên cuối cùng, $ Email);
  $firstname = "John";
  $lastname = "Doe";
  $email = "";
  $stmt->execute();

// Đặt tham số và thực thi $ firstName = "john"; $ lastName = "doe"; $ email = ""; $ stmt-> exec ();
  $firstname = "Mary";
  $lastname = "Moe";
  $email = "";
  $stmt->execute();

$ FirstName = "Mary"; $ lastName = "moe"; $ email = ""; $ stmt-> exec ();
  $firstname = "Julie";
  $lastname = "Dooley";
  $email = "";
  $stmt->execute();

$ firstName = "julie"; $ lastName = "dooley"; $ email = ""; $ STMT-> EXECUTE ();
} catch(PDOException $e) {
  echo "Error: " . $e->getMessage();
}
$conn = null;
?>




Chúng ta có thể sử dụng câu lệnh đã chuẩn bị cho truy vấn chọn không?

Để truy xuất dữ liệu từ bảng bằng cách sử dụng câu lệnh CHỌN với các điểm đánh dấu tham số, bạn sử dụng Chuẩn bị..

Có thể tiêm SQL với các tuyên bố đã chuẩn bị?

Các câu lệnh được chuẩn bị rất hữu ích đối với tiêm SQL, bởi vì các giá trị tham số, được truyền sau đó bằng cách sử dụng một giao thức khác, không cần phải thoát ra chính xác. Nếu mẫu câu lệnh gốc không có nguồn gốc từ đầu vào bên ngoài, thì SQL tiêm không thể xảy ra., because parameter values, which are transmitted later using a different protocol, need not be correctly escaped. If the original statement template is not derived from external input, SQL injection cannot occur.

Việc sử dụng câu lệnh đã chuẩn bị trong PHP là gì?

Một tuyên bố đã chuẩn bị hoặc một câu lệnh tham số hóa được sử dụng để thực hiện cùng một tuyên bố nhiều lần với hiệu quả cao và bảo vệ chống tiêm SQL.Việc thực hiện tuyên bố đã chuẩn bị bao gồm hai giai đoạn: chuẩn bị và thực thi.Ở giai đoạn chuẩn bị, một mẫu câu lệnh được gửi đến máy chủ cơ sở dữ liệu.

Nơi chúng ta có thể sử dụng tuyên bố đã chuẩn bị?

Mặc dù bạn có thể sử dụng các đối tượng PreadStatement cho các câu lệnh SQL không có tham số, nhưng bạn có thể sử dụng chúng thường xuyên nhất cho các câu lệnh SQL lấy tham số.Ưu điểm của việc sử dụng các câu lệnh SQL lấy tham số là bạn có thể sử dụng cùng một câu lệnh và cung cấp cho nó các giá trị khác nhau mỗi khi bạn thực hiện nó.SQL statements that take parameters. The advantage of using SQL statements that take parameters is that you can use the same statement and supply it with different values each time you execute it.