Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lấy chuỗi truy vấn SQL thô từ các câu lệnh chuẩn bị sẵn của PDO

Tôi giả sử ý bạn là bạn muốn truy vấn SQL cuối cùng, với các giá trị tham số được nội suy vào nó. Tôi hiểu rằng điều này sẽ hữu ích cho việc gỡ lỗi, nhưng nó không phải là cách hoạt động của các câu lệnh đã chuẩn bị. Các tham số không được kết hợp với một câu lệnh đã chuẩn bị ở phía máy khách, vì vậy PDO sẽ không bao giờ có quyền truy cập vào chuỗi truy vấn được kết hợp với các tham số của nó.

Câu lệnh SQL được gửi đến máy chủ cơ sở dữ liệu khi bạn chuẩn bị (), và các tham số được gửi riêng khi bạn thực hiện thực thi (). Nhật ký truy vấn chung của MySQL hiển thị SQL cuối cùng với các giá trị được nội suy sau khi bạn thực thi (). Dưới đây là một đoạn trích từ nhật ký truy vấn chung của tôi. Tôi đã chạy các truy vấn từ mysql CLI, không phải từ PDO, nhưng nguyên tắc thì giống nhau.

081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
                2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
                2 Execute     [2] select * from foo where i = 1

Bạn cũng có thể nhận được những gì bạn muốn nếu bạn đặt thuộc tính PDO PDO ::ATTR_EMULATE_PREPARES. Trong chế độ này, PDO nội suy các tham số vào truy vấn SQL và gửi toàn bộ truy vấn khi bạn thực thi (). Đây không phải là một truy vấn chuẩn bị thực sự. Bạn sẽ phá vỡ lợi ích của các truy vấn đã chuẩn bị bằng cách nội suy các biến vào chuỗi SQL trước khi thực thi ().

Nhận xét lại từ @afilina:

Không, truy vấn SQL dạng văn bản là không kết hợp với các tham số trong quá trình thực thi. Vì vậy, không có gì để PDO chỉ cho bạn.

Trong nội bộ, nếu bạn sử dụng PDO ::ATTR_EMULATE_PREPARES, PDO sẽ tạo một bản sao của truy vấn SQL và nội suy các giá trị tham số vào nó trước khi thực hiện chuẩn bị và thực thi. Nhưng PDO không hiển thị truy vấn SQL đã sửa đổi này.

Đối tượng PDOStatement có thuộc tính $ queryString, nhưng thuộc tính này chỉ được đặt trong phương thức khởi tạo cho PDOStatement và nó không được cập nhật khi truy vấn được viết lại bằng các tham số.

Sẽ là một yêu cầu tính năng hợp lý đối với PDO khi yêu cầu họ tiết lộ truy vấn được viết lại. Nhưng ngay cả điều đó cũng không cung cấp cho bạn truy vấn "hoàn chỉnh" trừ khi bạn sử dụng PDO ::ATTR_EMULATE_PREPARES.

Đây là lý do tại sao tôi chỉ ra giải pháp ở trên bằng cách sử dụng nhật ký truy vấn chung của máy chủ MySQL, vì trong trường hợp này, ngay cả một truy vấn đã chuẩn bị với trình giữ chỗ tham số cũng được viết lại trên máy chủ, với các giá trị tham số được lấp đầy vào chuỗi truy vấn. Nhưng điều này chỉ được thực hiện trong quá trình ghi nhật ký, không phải trong quá trình thực thi truy vấn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysqli hay chết, nó có phải chết không?

  2. Lệnh không đồng bộ; bạn không thể chạy lệnh này bây giờ

  3. Đối chiếu tốt nhất để sử dụng cho MySQL với PHP là gì?

  4. MySQL truy xuất biến từ Thủ tục được lưu trữ trong PHP PDO

  5. Cách Chèn Nhiều Hàng trong MySQL