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ị
N
1 mẫu, n lần giới hạn tham số, nếu có bất kỳ |