2010-02-20 36 views
16

Tôi đang nghiên cứu để sử dụng các câu lệnh đã chuẩn bị với mysqli bằng PHP và thường, nếu tôi gặp vấn đề với truy vấn, tôi chỉ cần đọc lại màn hình để xem nó trông như thế nào khi bước đầu tiên.Làm cách nào để xem nội dung của câu lệnh đã chuẩn bị?

Làm cách nào tôi có thể làm điều đó với tuyên bố đã chuẩn bị?

Tôi muốn xem câu lệnh SQL sau khi các biến được thay thế.

Trả lời

16

Sử dụng chuẩn bị phát biểu:

  • Khi bạn chuẩn bị báo cáo kết quả, nó được gửi đến máy chủ MySQL
  • Khi bạn liên kết các biến + thực hiện báo cáo kết quả, chỉ có các biến được gửi đến máy chủ MySQL
  • Và câu lệnh + biến bị ràng buộc được thực hiện trên máy chủ MySQL - mà không phải thực hiện lại "chuẩn bị" mỗi khi câu lệnh được thực thi (đó là lý do tại sao các câu lệnh chuẩn bị có thể tốt cho hiệu suất khi cùng một câu lệnh được thực thi lần)

Không có "xây dựng" truy vấn SQL ở phía PHP, do đó, không có cách nào để thực sự nhận được truy vấn đó.

Điều đó có nghĩa là nếu bạn muốn xem một truy vấn SQL, bạn phải sử dụng, các truy vấn SQL, và các câu lệnh không được chuẩn bị sẵn sàng.

+0

cũng thats một chút gây phiền nhiễu = \ Bạn nghĩ rằng có một cách để lấy câu lệnh thực hiện – Stomped

+0

Nếu bạn cần điều này ở phía PHP, chủ yếu cho các lý do gỡ lỗi, tôi giả sử, bạn có thể "tái xây dựng" SQL truy vấn tương đương với việc thực hiện câu lệnh: bạn sẽ phải thay thế các phần giữ chỗ bằng các giá trị của các biến * (thoát khỏi dữ liệu, tất nhiên, sẽ được để lại cho bạn) * ;;; nếu bạn cần điều này thường xuyên, bạn sẽ có thể viết một hàm thực hiện điều này cho bạn; khác, một vài 'var_dump' đã giúp bạn xem dữ liệu nào được gửi đến máy chủ MySQL. –

+1

@stomped Điểm chính là không có câu lệnh nào được thực thi. Bước đó bị bỏ qua hoàn toàn. – troelskn

0

Đồng ý với Pascal MARTIN (+1) vì vậy tôi đề xuất một kỹ thuật khác để gỡ lỗi: var_dump() hoặc ghi lại mọi biến bạn chèn vào câu lệnh, theo cách đó bạn sẽ có thể tìm ra nếu nó sai dữ liệu hoặc sai về mặt logic SQL.

10
Đối với báo cáo chuẩn bị được thực hiện với các mysql_stmt_prepare() và mysql_stmt_execute() chức năng C API, máy chủ viết Chuẩn bị và Execute dòng vào nhật ký truy vấn tổng quát để bạn có thể nói khi các câu lệnh được chuẩn bị và thực hiện.
[...] máy chủ ghi các dòng sau vào nhật ký truy vấn chung:
Chuẩn bị [1] CHỌN?
Thực hiện [1] CHỌN 3

Vì vậy, cho mục đích gỡ lỗi hoạt động general log và theo dõi tệp đó.

chỉnh sửa: oh, câu hỏi có thẻ [mysqli] ... hoàn toàn bị bỏ qua.
Nếu câu lệnh không được thực hiện, bạn có kiểm tra xem có lỗi nào xảy ra không?

echo "<pre>Debug: start</pre>\n"; 

$mysqli = new mysqli('localhost', 'localonly', 'localonly', 'test'); 
if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); 
} 

$result = $mysqli->query('CREATE TEMPORARY TABLE foo (id int auto_increment, x int, primary key(id))'); 
if (false=== $result) { 
die('error : '. $mysqli->error); 
} 

$stmt = $mysqli->prepare('INSERT INTO foo (x) VALUES (?)'); 
if (false===$stmt) { 
    die ('prepare() failed: ' . $mysqli->error); 
} 

$result = $stmt->bind_param('i', $x); 
if (false===$result) { 
    die('bind_param() failed'); 
} 

$x = 1; 
$result = $stmt->execute(); 
if (false===$result) { 
    die('execute() failed: '.$stmt->error); 
} 

echo "<pre>Debug: end</pre>\n"; 
2

Tôi thường làm điều này khi tôi cần gỡ lỗi sql đã chuẩn bị với thông số.

Ví dụ về chuẩn bị và thực hiện:

$sql = "SELECT VAL1, VAL2 FROM TABLE(?, '?', '?', '?', '?', ?, '?', '?', '?')"; 
$prep = ibase_prepare($sql) or die("Error"); 
$query = ibase_execute($prep, $param1, $param2, .....) or $err = true; 
           ^^^^^^^^^^^^^^^^^^^^^^^ 

Cách đơn giản để gỡ lỗi SQL kết quả của câu đó là:

printf(str_replace('?', '%s', $sql), $param1, $param2, ....); 
             ^^^^^^^^^^^^^^^^^^^^^^ 

Bạn chỉ cần làm một printf, thay thế? trên chuỗi SQL đã chuẩn bị bằng một% s. printf sẽ diễn giải tất cả dưới dạng một chuỗi, lấy mỗi tham số như đặt nó trên mỗi thay thế% s.

0

Gần đây tôi đã cập nhật dự án này để bao gồm tích hợp trình soạn thảo, kiểm tra đơn vị và xử lý chấp nhận đối số tốt hơn bằng tham chiếu (điều này yêu cầu cập nhật lên php 5.6).


tôi đã tạo ra một tập các lớp mở rộng mặc định mysqlimysqli_stmt lớp để cho phép bạn xem một biểu hiện của chuỗi truy vấn tiềm năng, mà nên cung cấp những gì bạn đang tìm kiếm:

https://github.com/noahheck/E_mysqli

Đây là thay thế thả xuống (gần) cho đối tượng bình thường mysqli trả về đối tượng mysqli_stmt tùy chỉnh khi bạn prepare() chuỗi truy vấn. Sau khi gắn các thông số của bạn, E_mysqli sẽ cho phép bạn xem các chuỗi truy vấn kết quả như một thuộc tính mới của stmt đối tượng:

$mysqli = new E_mysqli($dbHost, $dbUser, $dbPass, $dbName); 

$query = "INSERT INTO registration SET name = ?, email = ?"; 

$stmt = $mysqli->prepare($query); 

$stmt->bind_param("ss", $_POST['name'], $_POST['email']); 

$stmt->execute(); 

echo $stmt->fullQuery; 

sẽ cho kết quả:

INSERT INTO registration SET name = 'John Doe', email = '[email protected]' 

Có một số hãy cẩn thận với việc sử dụng phần mở rộng này (được giải thích trong README tại dự án github), nhưng để gỡ rối các vùng phiền toái của ứng dụng của bạn, hoặc chuyển sang một kiểu hướng đối tượng từ thủ tục, điều này sẽ cung cấp mức trợ giúp cho hầu hết người dùng.

Như tôi đã phác thảo trong dự án github, tôi không có bất kỳ kinh nghiệm thực tế nào khi sử dụng phần mở rộng mysqli và dự án này được tạo theo yêu cầu của người dùng của dự án chị em đó, vì vậy bất kỳ phản hồi nào có thể được cung cấp từ devs bằng cách sử dụng này trong sản xuất sẽ được đánh giá rất nhiều.

Tuyên bố từ chối - Như tôi đã nói, tôi đã thực hiện tiện ích mở rộng này.

0

Bạn có thể sử dụng công cụ như Lottip. Ý tưởng này hoạt động giống như MySQL proxy. Nó phân tích các gói MySQL, trích xuất truy vấn và các tham số của nó để bạn có thể xem các câu lệnh đã chuẩn bị với nội dung của nó.

+0

Hãy diễn giải khái niệm và cách sử dụng của Lottip tại đây. Liên kết không tồn tại mãi mãi. – atomSmasher

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