2013-02-16 30 views
12

Tôi đang cập nhật mã PHP từ mysql lên mysqli nhưng tôi dường như không thể tìm thấy câu trả lời cho câu hỏi này: Các truy vấn cập nhật mysqli có trả về kết quả không?Các truy vấn cập nhật mysqli có nên trả lại kết quả không?

Với mysql, tôi có thể làm

$result = mysql_query("UPDATE `data` SET `field1` = 1 WHERE `key` = '$mykey'); 

và kết quả $ sẽ là đúng ngay cả khi truy vấn không trả lại bất kỳ hàng.

Bây giờ, tuy nhiên, trong các mã mysqli, tôi có một cái gì đó như thế này (lỗi xử lý xóa do rõ ràng):

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)") 
$stmt->bind_param("s", $mykey); 
$stmt->execute(); 
$result = $stmt->get_result(); 

và $ result là sai.

Để lưu bản ghi, truy vấn hợp lệ (bỏ qua bất kỳ lỗi chính tả nào tôi có thể đã sao chép nó thành stackoverflow) và trường1 được cập nhật đúng trong cơ sở dữ liệu như mong đợi. Ngoài ra, get_result() hoạt động tốt cho các truy vấn chọn lọc, vì vậy nó không phải là vấn đề get_result() không có sẵn.

Về cơ bản, tôi chỉ muốn biết liệu hành vi này có thay đổi hay không hoặc nếu tôi cố gắng tìm một số lỗi ở đâu đó.

+0

Được rồi ... nhận xét dường như đã biến mất khiến tôi kiểm tra tài liệu, điều này thực sự khẳng định rằng get_result "trả về kết quả hoặc FALSE khi không thành công". Tôi đã đọc nó trước khi đặt câu hỏi của mình, tuy nhiên, và tôi đoán tôi chỉ tò mò nếu tài liệu là chính xác. Sau khi $ stmt-> get_result() trả về false, tôi đã kiểm tra $ stmt-> errno (là 0) và $ stmt-> error (trống) và truy vấn dường như thực thi thành công (vì cơ sở dữ liệu đã được cập nhật). Vậy lỗi này xảy ra ở đâu? – Swiftheart

Trả lời

11

tuyên bố đã chuẩn bị được thực hiện với

$stmt->execute(); 

execute() lợi nhuận TRUE về thành công hay FALSE trên thất bại.

UPDATE, DELETE, INSERT không mang lại bất kỳ kết quả nào, không cần sử dụng get_result(). Nếu bạn cần biết tổng số hàng bị ảnh hưởng, bạn có thể thực hiện điều đó bằng cách sử dụng hàm mysqli_stmt_affected_rows().

Do đó mã của bạn có thể trông như thế này

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)") 
$stmt->bind_param("s", $mykey); 
$stmt->execute(); 
//You can get the number of rows affected by your query 
$nrows = $stmt->affected_rows; 
if (!$nrows) { 
    //Nothing has been updated 
} 
+0

Có ... Tôi có dòng $ stmt-> execute() trong mã mẫu của tôi ở trên đó và trong mã thực tế của tôi, tôi kiểm tra giá trị trả lại. Nó trả về sự thật, vì vậy đó là tốt. Tôi chỉ tò mò về việc liệu _ $ stmt-> get_result() _ có trả về true không. – Swiftheart

+0

Xem câu trả lời cập nhật. Bạn không cần sử dụng 'get_result()' nếu bạn thực hiện các truy vấn 'UPDATE',' DELETE', 'INSERT' vì chúng không tạo ra bất kỳ resultset nào. – peterm

+0

Tuyệt vời, cảm ơn. Tôi nghi ngờ nhiều, nhưng tôi muốn một số xác nhận bên ngoài. – Swiftheart

3

truy vấn Non-CHỌN không có một "tập kết quả", do đó get_result là vô nghĩa đối với họ. Nếu bạn muốn biết liệu truy vấn sửa đổi (UPDATE, INSERT hoặc DELETE), hãy sử dụng $stmt->affected_rows. Điều này sẽ bằng 0 hoặc khác 0 tùy thuộc vào việc truy vấn có làm bất cứ điều gì hay không.

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