Hướng dẫn what is the advantage of prepared statement in php? - lợi thế của câu lệnh soạn sẵn trong php là gì?
Thoát khỏi các ký tự xấu vẫn cần thiết, nhưng thư viện thực hiện nó tự động cho tất cả các tham số bạn liên kết. Nó chỉ thuận tiện hơn một chút và ngăn người lập trình quên quên làm vệ sinh một giá trị. Show
Tuy nhiên, lưu ý rằng tính tự động này được giới hạn trong các tham số! Truy vấn sau đây là an toàn, bởi vì
Truy vấn sau đây không an toàn, bởi vì bất cứ điều gì bạn đặt trực tiếp vào truy vấn sẽ không được thoát tự động:unsafe, because anything you put directly into the query will not be escaped automatically:
Điều đó nói rằng, người ta không nên sử dụng các tên bảng động như được hiển thị trong ví dụ này. Nhưng điểm đứng: Hãy cẩn thận, ngay cả với các truy vấn được tham số!Be careful, even with parametrized queries! Nhược điểm duy nhất tôi có thể nghĩ đến là bạn không thể nhìn thấy truy vấn cuối cùng nữa để gỡ lỗi (vì nó chỉ được lắp ráp ở phía máy chủ). 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ộcMộ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:
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 tuyên bố đã chuẩn bị trong mysqliVí 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"; thử {& nbsp; $ Conn = new PDO ("mysql: host = $ servername; dbname = $ dbname", $ username, $ password); & nbsp; // Đặt chế độ lỗi PDO thành Exception & NBSP; $ Conn-> setAttribution (pdo :: attr_errmode, pdo :: errmode_exception); & nbsp; // Chuẩn bị các tham số SQL và liên kết & nbsp; $ STMT = $ Conn-> Chuẩn bị ("Chèn vào MyGuests (FirstName, LastName, Email) & NBSP; Giá trị (: FirstName,: LastName,: Email)"); & nbsp; $ stmt-> bindparam (': firstName', $ firstName); & nbsp; $ stmt-> bindParam (': lastName', $ lastName); & nbsp; $ stmt-> bindparam (': email', $ email); & nbsp; & nbsp; // chèn một hàng & nbsp; & nbsp; $ firstName = "john"; & nbsp; & nbsp; $ STMT-> EXECUTE (); & nbsp; & nbsp; // chèn một hàng khác & nbsp; & nbsp; $ STMT-> EXECUTE (); & nbsp; // chèn một hàng khác & nbsp; $ FirstName = "Julie"; & nbsp; $ lastName = "dooley"; & nbsp; $ email = ""; & nbsp; $ STMT-> EXECUTE (); & nbsp; echo "bản ghi mới được tạo thành công";} Catch (pDoException $ e) {& nbsp; Echo "Lỗi:". $ e-> getMessage ();} $ Conn = null; ?> Tại sao chúng ta sử dụng tuyên bố đã chuẩn bị trong PHP? 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 đến máy chủ vì bạn chỉ cần gửi các tham số mỗi lần và không phải toàn bộ truy vấn. Lợi thế và nhược điểm của việc sử dụng tuyên bố đã chuẩn bị qua tuyên bố là gì? Bằng cách tránh nhiều biên dịch và thực hiện các câu lệnh, các câu lệnh được chuẩn bị thực hiện nhanh hơn. Sử dụng các câu lệnh đã chuẩn bị, chúng ta có thể chèn các giá trị vào các kiểu dữ liệu nâng cao như blob, Clob, đối tượng dễ dàng với sự trợ giúp của các phương thức setter được cung cấp bởi giao diện PreparedStatement. 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 $ 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:
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 PDOVí 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"; thử {& nbsp; $ Conn = new PDO ("mysql: host = $ servername; dbname = $ dbname", $ username, $ password); & nbsp; // Đặt chế độ lỗi PDO thành Exception & NBSP; $ Conn-> setAttribution (pdo :: attr_errmode, pdo :: errmode_exception); & nbsp; // Chuẩn bị các tham số SQL và liên kết & nbsp; $ STMT = $ Conn-> Chuẩn bị ("Chèn vào MyGuests (FirstName, LastName, Email) & NBSP; Giá trị (: FirstName,: LastName,: Email)"); & nbsp; $ stmt-> bindparam (': firstName', $ firstName); & nbsp; $ stmt-> bindParam (': lastName', $ lastName); & nbsp; $ stmt-> bindparam (': email', $ email); & nbsp; & nbsp; // chèn một hàng & nbsp; & nbsp; $ firstName = "john"; & nbsp; & nbsp; $ STMT-> EXECUTE (); & nbsp; & nbsp; // chèn một hàng khác & nbsp; & nbsp; $ STMT-> EXECUTE (); & nbsp; // chèn một hàng khác & nbsp; $ FirstName = "Julie"; & nbsp; $ lastName = "dooley"; & nbsp; $ email = ""; & nbsp; $ STMT-> EXECUTE (); & nbsp; echo "bản ghi mới được tạo thành công";} Catch (pDoException $ e) {& nbsp; Echo "Lỗi:". $ e-> getMessage ();} $ Conn = null; ?> Tại sao chúng ta sử dụng tuyên bố đã chuẩn bị trong PHP?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 đến máy chủ vì bạn chỉ cần gửi các tham số mỗi lần và không phải toàn bộ truy vấn.reduce parsing time as the preparation on the query is done only once (although the statement is executed multiple times) Bound parameters minimize bandwidth to the server as you need send only the parameters each time, and not the whole query.
Lợi thế và nhược điểm của việc sử dụng tuyên bố đã chuẩn bị qua tuyên bố là gì?Bằng cách tránh nhiều biên dịch và thực hiện các câu lệnh, các câu lệnh được chuẩn bị thực hiện nhanh hơn.Sử dụng các câu lệnh đã chuẩn bị, chúng ta có thể chèn các giá trị vào các kiểu dữ liệu nâng cao như blob, Clob, đối tượng dễ dàng với sự trợ giúp của các phương thức setter được cung cấp bởi giao diện PreparedStatement.. Using prepared statements, we can insert values to advanced datatypes such as BLOB, CLOB, OBJECT easily with the help of the setter methods provided by the PreparedStatement interface. |