Hướng dẫn php procedural example - ví dụ thủ tục 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

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++"
  }
}
7.

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ị

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++"
  }
}
8

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++"
  }
}
9

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

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

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++"
  }
}
8

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++"
  }
}
9

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

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++"
  }
}
8

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++"
  }
}
9

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

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++"
  }
}
8

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++"
  }
}
9

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ị

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++"
  }
}
8

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++"
  }
}
9

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ị

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++"
  }
}
8

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++"
  }
}
9

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

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++"
  }
}
2

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

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++"
  }
}
32 không được chạy như một tuyên bố đã chuẩn bị ở trên.2 không được chạy như một tuyên bố đã chuẩn bị ở trên.

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++"
  }
}
8

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++"
  }
}
9

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

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++"
  }
}
5

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

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++"
  }
}
32 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ỗ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.

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ị2 1
Tuyên bố không chuẩn bị1 1
Các chuyến đi vòng máy khách-máy chủ, chọn, thực hiện một lầ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
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 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ỳ 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 mysqli_stmt::get_result() 1 + n
N 1 mẫu, n lần giới hạn tham số, nếu có bất kỳ mysqli_stmt::get_result() or binding with mysqli_stmt::store_result() n lần và phân tích cú pháp mọi lúc mysqli::query()
Api liên kết tham số đầu vào Đúngmysqli_stmt::get_result()Api liên kết tham số đầu vàomysqli_stmt::get_result() or binding with mysqli_stmt::store_result()mysqli::real_query() with mysqli::use_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 () 1 + n

N

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

1 mẫu, n lần giới hạn tham số, nếu có bất kỳ