2012-06-20 35 views
12

thể trùng lặp:
Retrieve (or simulate) full query from PDO prepared statementGỡ lỗi PDO - Truy vấn xem SAU KHI LIÊN QUAN?

Tôi không thể hiểu tại sao truy vấn của tôi đang trở lại 0 hàng .. nó thực hiện một số chức năng tìm kiếm rất năng động, và rất nhiều nếu/loop báo cáo vv Có để gỡ lỗi nó, tôi muốn xem chính xác những gì chuỗi đang được gửi đến máy chủ. Có cách nào để làm điều này thông qua PHP?

Có cách nào để hỏi máy chủ "truy vấn cuối cùng" hay nói cho PDO "chỉ cho tôi những gì bạn đã gửi"?

tôi thấy một phản ứng sử dụng str_replace tự nhập các giá trị ở vị trí của :fieldValue, nhưng nó có thể là một vấn đề cú pháp (hoặc có thể nó sẽ thông qua một vòng lặp không chính xác, vv), mà phương pháp này không giúp với.

Sử dụng bindValue(":fieldValue", $value); nếu điều đó tạo sự khác biệt.

EDIT

Hóa ra đó là một đơn giản if ($var="true") { ... mà cần phải có được if ($var=="true") { .... PHP tôi đoán là không giống như Java theo nghĩa đó? Dù bằng cách nào, câu hỏi vẫn còn đứng (như tôi thường xuyên gặp điều này). Tôi đã phải sử dụng một loạt các echo "You are Here"; để tìm lỗi này, vì nó có giá trị về mặt kỹ thuật nhưng không chính xác. Nếu tôi có câu lệnh SQL cuối cùng, tôi có thể thấy "Ồ, mã của tôi đã thêm where column = true, phải trải qua IF sai ...".

+1

Nếu chuẩn bị/với phím tắt không mô phỏng, truy vấn trong đó bạn nói không tồn tại bất cứ nơi nào. Các câu lệnh và các ràng buộc sau đó được tách rời với cơ sở dữ liệu. Tuy nhiên, việc kích hoạt 'query_log' trên máy chủ phát triển của bạn (không bao giờ thực hiện nó trong sản xuất) có thể làm sáng tỏ những gì đã được thực hiện. – Wrikken

+0

Vâng đó là điều; Tôi không biết phải làm gì. Tôi thường làm điều này bằng cách sử dụng một 'echo $ sql' đơn giản trong đó' $ sql' là câu lệnh của tôi, nhưng với PDO (mà tôi mới), nó chỉ cho tôi thấy 'SELECT column FROM table WHERE column =: fieldValue' mà doesn 't giúp tôi nếu tuyên bố nơi kết thúc là sai ở đâu đó. – StuckAtWork

+2

có thể trùng lặp của [Truy xuất (hoặc mô phỏng) truy vấn đầy đủ từ câu lệnh chuẩn bị PDO] (http://stackoverflow.com/questions/3754530/retrieve-or-simulate-full-query-from-pdo-prepared-statement) và http : //stackoverflow.com/questions/530627/getting-a-pdo-query-string-with-bound-parameters-without-executing-it và http: // stackoverflow.com/questions/1786322/in-php-with-pdo-how-to-check-the-final-sql-parametrized-query –

Trả lời

0

Đó là câu chuyện thường gặp nhất về gỡ lỗi SQL. "Tôi cần phải xem các truy vấn sau khi chuẩn bị để có thể cho biết nếu một lỗi xảy ra". Thực tế là, bạn không và tôi sẽ cho bạn biết lý do.

Khi truy vấn đã được chuẩn bị, trình giữ chỗ có thể được coi là một chuỗi/số nguyên hợp lệ hợp lệ. Bạn không quan tâm những gì trong đó.

Ngoài ra, nếu bạn thiết lập PDO một cách chính xác, bạn sẽ nhận được chi tiết PDOException chi tiết lỗi bạn đã có cùng với một backtrace hoàn chỉnh nơi xảy ra lỗi, cộng với bạn nhận được chuỗi lỗi từ MySQL. lỗi rất dễ tìm.

Để kích hoạt Exceptions PDO và vô hiệu hóa mô phỏng chuẩn bị:

$pdo = new PDO("mysql:host=localhost;dbname=database_name", "user", "password"); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
+1

Tôi đã xử lý lỗi đúng cách; vấn đề là không có L ERI. Tôi cần phải biết những gì đã thực sự được gửi để tôi có thể cho biết nơi nào trong mã của tôi nó đã nhận được thông tin của nó. Nếu không thể kiểm tra chuỗi cuối cùng, tôi không thể nói điều gì đang làm gì. "Trả về 0 hàng", chứ không phải "ném một lỗi". – StuckAtWork

+0

@StuckAtWork: Nếu bạn không sử dụng một cái gì đó như không gian toàn cầu, bạn sẽ không có vấn đề gì để nói những gì đang xảy ra trong truy vấn của bạn. –

+1

Xem chỉnh sửa trong câu trả lời; vấn đề không phải là điều hiển nhiên, nhưng có lẽ tôi đã có thể thấy chính xác nó là gì. Tùy thuộc vào một số điều kiện, nó liên kết một cái gì đó khác với ': fieldValue'. Tôi đã phải đi qua một cách thủ công và kiểm tra xem dòng nào đang thực hiện để xem ': fieldValue' bị ràng buộc là gì. – StuckAtWork

Các vấn đề liên quan