Hướng dẫn dùng what statement trong PHP

Cơ sở dữ liệu MySQL hỗ trợ các câu lệnh đã chuẩn bị. 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.

Quy trình công việc cơ bản

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. Máy chủ thực hiện kiểm tra cú pháp và khởi tạo tài nguyên nội bộ của máy chủ để sử dụng sau.

Máy chủ MySQL hỗ trợ bằng cách sử dụng trình giữ chỗ ẩn danh, định vị với ?.

Chuẩn bị được theo sau bởi thực thi. Trong quá trình thực hiện, máy khách liên kết các giá trị tham số và gửi chúng đến máy chủ. Máy chủ thực thi câu lệnh với các giá trị bị ràng buộc bằng các tài nguyên nội bộ được tạo trước đó.

Ví dụ số 1 tuyên bố đã chuẩn bị

mysqli_report

(MYSQLI_REPORT_ERROR MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com""user""password""database");/* Non-prepared statement */
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label TEXT)");/* Prepared statement, stage 1: prepare */
$stmt $mysqli->prepare("INSERT INTO test(id, label) VALUES (?, ?)");/* Prepared statement, stage 2: bind and execute */
$id 1;
$label 'PHP';
$stmt->bind_param("is"$id$label); // "is" means that $id is bound as an integer and $label as a string$stmt->execute();

Thực hiện lặp đi lặp lại

Một tuyên bố đã chuẩn bị có thể được thực hiện nhiều lần. Khi mỗi lần thực hiện, giá trị hiện tại của biến ràng buộc được đánh giá và gửi đến máy chủ. Tuyên bố không được phân tích cú pháp một lần nữa. Mẫu câu lệnh không được chuyển đến máy chủ một lần nữa.

Ví dụ #2 Chèn chuẩn bị một lần, được thực hiện nhiều lần

mysqli_report

id = 1 (integer)
label = PHP (string)
1

Ví dụ trên sẽ xuất ra:

array(3) {
  [0]=>
  array(2) {
    ["id"]=>
    string(1) "1"
    ["label"]=>
    string(3) "PHP"
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(1) "2"
    ["label"]=>
    string(4) "Java"
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(1) "3"
    ["label"]=>
    string(3) "C++"
  }
}

Mỗi tuyên bố đã chuẩn bị chiếm tài nguyên máy chủ. Các tuyên bố nên được đóng một cách rõ ràng ngay sau khi sử dụng. Nếu không được thực hiện rõ ràng, câu lệnh sẽ được đóng khi xử lý câu lệnh được giải phóng bởi PHP.

Sử dụng một câu lệnh đã chuẩn bị không phải lúc nào cũng là cách hiệu quả nhất để thực hiện một tuyên bố. Một câu lệnh được chuẩn bị chỉ được thực hiện một lần gây ra nhiều chuyến đi vòng khách máy khách hơn so với một câu lệnh không được chuẩn bị. Đây là lý do tại sao

id = 1 (integer)
label = PHP (string)
2 không được chạy như một tuyên bố đã chuẩn bị ở trên.

Ngoài ra, hãy xem xét việc sử dụng cú pháp SQL đa điểm của MySQL để chèn. Ví dụ, Multi-Insert yêu cầu ít chuyến đi vòng nào giữa máy chủ và máy khách so với câu lệnh đã chuẩn bị ở trên.

Ví dụ #3 Các chuyến đi vòng ít sử dụng SQL đa điểm

mysqli_report

id = 1 (integer)
label = PHP (string)
5

Kết quả đặt các loại dữ liệu giá trị

Giao thức máy khách MySQL định nghĩa một giao thức truyền dữ liệu khác nhau cho các câu lệnh đã chuẩn bị và các câu lệnh không được chuẩn bị. Các câu lệnh được chuẩn bị đang sử dụng cái gọi là giao thức nhị phân. Máy chủ MySQL gửi dữ liệu đặt kết quả "như là" ở định dạng nhị phân. Kết quả không được tuần tự hóa thành chuỗi trước khi gửi. Thư viện máy khách nhận được dữ liệu nhị phân và cố gắng chuyển đổi các giá trị thành các loại dữ liệu PHP phù hợp. Ví dụ: kết quả từ cột SQL

id = 1 (integer)
label = PHP (string)
6 sẽ được cung cấp dưới dạng các biến số nguyên PHP.

Ví dụ #4 Kiểu dữ liệu gốc

mysqli_report

id = 1 (integer)
label = PHP (string)
9

Ví dụ trên sẽ xuất ra:

id = 1 (integer)
label = PHP (string)

Mỗi tuyên bố đã chuẩn bị chiếm tài nguyên máy chủ. Các tuyên bố nên được đóng một cách rõ ràng ngay sau khi sử dụng. Nếu không được thực hiện rõ ràng, câu lệnh sẽ được đóng khi xử lý câu lệnh được giải phóng bởi PHP.

Sử dụng một câu lệnh đã chuẩn bị không phải lúc nào cũng là cách hiệu quả nhất để thực hiện một tuyên bố. Một câu lệnh được chuẩn bị chỉ được thực hiện một lần gây ra nhiều chuyến đi vòng khách máy khách hơn so với một câu lệnh không được chuẩn bị. Đây là lý do tại sao

id = 1 (integer)
label = PHP (string)
2 không được chạy như một tuyên bố đã chuẩn bị ở trên.

Ngoài ra, hãy xem xét việc sử dụng cú pháp SQL đa điểm của MySQL để chèn. Ví dụ, Multi-Insert yêu cầu ít chuyến đi vòng nào giữa máy chủ và máy khách so với câu lệnh đã chuẩn bị ở trên.mysqli_result object.

Ví dụ #3 Các chuyến đi vòng ít sử dụng SQL đa điểm

Kết quả đặt các loại dữ liệu giá trị

mysqli_report

id = 1 (integer), label = PHP (string)
2

Ví dụ trên sẽ xuất ra:

id = 1 (integer), label = PHP (string)

Mỗi tuyên bố đã chuẩn bị chiếm tài nguyên máy chủ. Các tuyên bố nên được đóng một cách rõ ràng ngay sau khi sử dụng. Nếu không được thực hiện rõ ràng, câu lệnh sẽ được đóng khi xử lý câu lệnh được giải phóng bởi PHP.

Sử dụng một câu lệnh đã chuẩn bị không phải lúc nào cũng là cách hiệu quả nhất để thực hiện một tuyên bố. Một câu lệnh được chuẩn bị chỉ được thực hiện một lần gây ra nhiều chuyến đi vòng khách máy khách hơn so với một câu lệnh không được chuẩn bị. Đây là lý do tại sao

id = 1 (integer)
label = PHP (string)
2 không được chạy như một tuyên bố đã chuẩn bị ở trên.mysqli_stmt::store_result().

Ngoài ra, hãy xem xét việc sử dụng cú pháp SQL đa điểm của MySQL để chèn. Ví dụ, Multi-Insert yêu cầu ít chuyến đi vòng nào giữa máy chủ và máy khách so với câu lệnh đã chuẩn bị ở trên.

Ví dụ #3 Các chuyến đi vòng ít sử dụng SQL đa điểmmysqli_stmt::get_result() returns a buffered result set.

Kết quả đặt các loại dữ liệu giá trị

mysqli_report

id = 1 (integer), label = PHP (string)
6

Ví dụ trên sẽ xuất ra:

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}

Mỗi tuyên bố đã chuẩn bị chiếm tài nguyên máy chủ. Các tuyên bố nên được đóng một cách rõ ràng ngay sau khi sử dụng. Nếu không được thực hiện rõ ràng, câu lệnh sẽ được đóng khi xử lý câu lệnh được giải phóng bởi PHP.mysqli_result interface offers the additional benefit of flexible client-side result set navigation.

Sử dụng một câu lệnh đã chuẩn bị không phải lúc nào cũng là cách hiệu quả nhất để thực hiện một tuyên bố. Một câu lệnh được chuẩn bị chỉ được thực hiện một lần gây ra nhiều chuyến đi vòng khách máy khách hơn so với một câu lệnh không được chuẩn bị. Đây là lý do tại sao

id = 1 (integer)
label = PHP (string)
2 không được chạy như một tuyên bố đã chuẩn bị ở trên.

mysqli_report

id = 1 (integer), label = PHP (string)
9

Ví dụ trên sẽ xuất ra:

array(2) {
  ["id"]=>
  int(3)
  ["label"]=>
  string(3) "C++"
}
array(2) {
  ["id"]=>
  int(2)
  ["label"]=>
  string(4) "Java"
}
array(2) {
  ["id"]=>
  int(1)
  ["label"]=>
  string(3) "PHP"
}

Mỗi tuyên bố đã chuẩn bị chiếm tài nguyên máy chủ. Các tuyên bố nên được đóng một cách rõ ràng ngay sau khi sử dụng. Nếu không được thực hiện rõ ràng, câu lệnh sẽ được đóng khi xử lý câu lệnh được giải phóng bởi PHP.

Sử dụng một câu lệnh đã chuẩn bị không phải lúc nào cũng là cách hiệu quả nhất để thực hiện một tuyên bố. Một câu lệnh được chuẩn bị chỉ được thực hiện một lần gây ra nhiều chuyến đi vòng khách máy khách hơn so với một câu lệnh không được chuẩn bị. Đây là lý do tại sao

id = 1 (integer)
label = PHP (string)
2 không được chạy như một tuyên bố đã chuẩn bị ở trên.mysqli_stmt::bind_param() function for more information.

Một sự tách biệt như vậy đôi khi được coi là tính năng bảo mật duy nhất để ngăn chặn tiêm SQL, nhưng cùng một mức độ bảo mật có thể đạt được với các câu lệnh không được chuẩn bị, nếu tất cả các giá trị được định dạng chính xác. Cần lưu ý rằng định dạng chính xác không giống như thoát ra và liên quan đến logic nhiều hơn so với việc trốn thoát đơn giản. Do đó, các câu lệnh được chuẩn bị chỉ đơn giản là một cách tiếp cận thuận tiện hơn và dễ bị lỗi hơn đối với yếu tố bảo mật cơ sở dữ liệu này.

Mô phỏng tuyên bố chuẩn bị phía khách hàng

API không bao gồm mô phỏng cho mô phỏng câu lệnh được chuẩn bị phía khách hàng.

So sánh nhanh các tuyên bố đã chuẩn bị và không chuẩn bị

Bảng dưới đây so sánh các câu lệnh được chuẩn bị và không chuẩn bị phía máy chủ.

So sánh các tuyên bố đã chuẩn bị và không chuẩn bị
 Tuyên bố chuẩn bịTuyên bố không chuẩn bị
Các chuyến đi vòng máy khách-máy chủ, chọn, thực hiện một lần 2 1
Chuỗi câu lệnh được chuyển từ máy khách sang máy chủ 1 1
Các chuyến đi vòng máy khách-máy chủ, chọn, lặp lại (n) thực thi 1 + n N
Chuỗi câu lệnh được chuyển từ máy khách sang máy chủ Các chuyến đi vòng máy khách-máy chủ, chọn, lặp lại (n) thực thi 1 + n
N 1 mẫu, n lần giới hạn tham số, nếu có bất kỳ n lần và phân tích cú pháp mọi lúc
Api liên kết tham số đầu vào 1 mẫu, n lần giới hạn tham số, nếu có bất kỳ n lần và phân tích cú pháp mọi lúc
Api liên kết tham số đầu vào Đúngmysqli_stmt::get_result() 1 mẫu, n lần giới hạn tham số, nếu có bất kỳ
n lần và phân tích cú pháp mọi lúc Api liên kết tham số đầu vàomysqli_stmt::get_result() or binding with mysqli_stmt::store_result() Đúngmysqli::query()
Không, đầu vào thủ công thoát ra API liên kết biến đầu ra Khôngmysqli::real_query() with mysqli::use_result()
Hỗ trợ sử dụng API mysqli_result Có, sử dụng mysqli_stmt :: get_result () Bộ kết quả đệm
Có, sử dụng mysqli_stmt :: get_result () hoặc ràng buộc với mysqli_stmt :: store_result () Có, mặc định của mysqli :: truy vấn () Bộ kết quả không bị ảnh hưởng
Có, sử dụng API liên kết đầu ra Có, sử dụng mysqli :: real_query () với mysqli :: use_result () 1 mẫu, n lần giới hạn tham số, nếu có bất kỳ

n lần và phân tích cú pháp mọi lúc

  • mysqli::__construct()
  • mysqli::query()
  • mysqli::prepare()
  • mysqli_stmt::prepare()
  • mysqli_stmt::execute()
  • mysqli_stmt::bind_param()
  • mysqli_stmt::bind_result()

Api liên kết tham số đầu vào

Có bao nhiêu loại câu lệnh PHP?

Trong PHP, có 4 loại tuyên bố có điều kiện khác nhau.4 different types of Conditional Statements.

Các câu lệnh kiểm soát trong PHP là gì?

Các câu lệnh kiểm soát là các câu lệnh có điều kiện thực thi một khối các câu lệnh nếu điều kiện là chính xác.Câu lệnh bên trong khối có điều kiện sẽ không thực thi cho đến khi điều kiện được thỏa mãn.Câu lệnh if: if (expression1)conditional statements that execute a block of statements if the condition is correct. The statement inside the conditional block will not execute until the condition is satisfied. The If statement: if(expression1)

Tại sao các tuyên bố có điều kiện được sử dụng trong PHP?

PHP cho phép bạn chọn hành động nào dựa trên kết quả của một điều kiện.Điều kiện này có thể là bất cứ điều gì bạn chọn và bạn có thể kết hợp các điều kiện để thực hiện các hành động phức tạp hơn.

Tuyên bố trong Php là gì?

Các câu lệnh nếu bạn có thể có nếu các câu lệnh bên trong các câu lệnh, điều này được gọi là một nếu.You can have if statements inside if statements, this is called a nested if.