Tôi giả sử bạn có nghĩa 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 mà các câu lệnh được chuẩn bị hoạt động. Các tham số không được kết hợp với một câu lệnh được chuẩn bị ở phía máy khách, do đó PDO không bao giờ có quyền truy cập vào chuỗi truy vấn 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 (). 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 là như 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ẽ tránh được các 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 hiện ().
Nhận xét lại từ @afilina:
Không, truy vấn SQL văn bản không được kết hợp với các tham số trong khi thực hiện. Vì vậy, không có gì để PDO cho bạn thấy.
Trong nội bộ, nếu bạn sử dụng PDO :: ATTR_EMULATE_PREPARES, PDO 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 đó trước khi thực hiện chuẩn bị và thực thi. Nhưng PDO không để lộ truy vấn SQL đã sửa đổi này.
Đối tượng PDOStatement có thuộc tính $ queryString, nhưng điều này chỉ được đặt trong hàm 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ố.
PDO sẽ là một yêu cầu tính năng hợp lý để yêu cầu họ đưa ra truy vấn viết lại. Nhưng ngay cả điều đó sẽ không cung cấp cho bạn truy vấn "hoàn thành" trừ khi bạn sử dụng PDO :: ATTR_EMULATE_PREPARES.
Đây là lý do tại sao tôi hiển thị cách giải quyết ở trên về việc sử dụng nhật ký truy vấn chung của máy chủ MySQL, bởi 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 ghi lại trên máy chủ, với các giá trị tham số được điền vào chuỗi truy vấn. Nhưng điều này chỉ được thực hiện trong khi đăng nhập, không phải trong khi thực hiện truy vấn.