2009-09-28 30 views
10

Làm cách nào để tìm thấy bản cập nhật của tôi có thành công hay không? tôi cập nhật bằng cách sử dụng một nơi uniqueName = tên vì vậy tôi nên luôn luôn chỉ cập nhật 0 hàng hoặc 1. một cách tốt để kiểm tra xem tôi có cập nhật một hàng hay không?hàng bị ảnh hưởng trong bản cập nhật mysql với PHP

Trả lời

3

Sử dụng mysql_affected_rows.

+5

này có thể trở về 0 nếu dữ liệu được cập nhật trong truy vấn cũng giống như đã có trong cơ sở dữ liệu, vì vậy nó có thể trả về 0 ngay cả khi truy vấn thành công nhưng 0 hàng đã được thay đổi. Nhưng tôi giả sử trường hợp sử dụng của bạn sẽ không có kịch bản này. – andho

+0

Điều này có thể áp dụng, nhưng nếu bạn có thể viết "$ query = mysql_query ($ sql);", thì "$ query" sẽ chứa "1" nếu thành công, "0" nếu không. – NessDan

0

nếu truy vấn cập nhật của bạn đang ở trong một biến có tên $ query, bạn có thể làm;

$result = mysql_query($query); 
if($result){ 
    //succes! 
} else { 
    //fail! 
} 

Hy vọng điều này sẽ hữu ích. Nếu bạn chỉ muốn biết nếu truy vấn của bạn đã được thực hiện thành công, điều này sẽ làm. Nếu bạn thực sự muốn biết có bao nhiêu hàng bị ảnh hưởng, hãy sử dụng các đề xuất khác.

+2

Điều này sẽ chỉ trả về 'false' nếu truy vấn không đúng định dạng. Ngay cả khi 'UPDATE' hoạt động trên 0 hàng, điều này sẽ hiển thị" thành công! " – brianreavis

+0

Điều này sẽ chỉ cho bạn biết liệu truy vấn đã được thực thi thành công hay không, không có bao nhiêu hàng bị ảnh hưởng. –

7

Thực sự không có cách nào để biết điều đó. Giả sử bảng tbl_numbers (id, value) có các hàng (1, "one") và (2, "two");

$result1="update tbl_numbers set value='first' where id=1"; 

Nếu bạn kiểm tra $ result1 trong mệnh đề if nó trả về true và mysql_affected_rows() trả về 1.

Tuy nhiên, đối $result2="update tbl_numbers set value='two' where id=2"; Nếu bạn kiểm tra $ result2 trong mệnh đề if nó trả về true và mysql_affected_rows() trả về 0.

và, cho $result3="update tbl_numbers set value='three' where id=3"; Nếu bạn kiểm tra $ result3 trong mệnh đề if nó trả về true và mysql_affected_rows() trả về 0.

+0

Điều này rất hữu ích .. Cảm ơn – hriziya

2

vì vậy, những gì nếu người dùng gửi lại dữ liệu đã giống với thông tin trong DB? Nếu bộ nhớ phục vụ sẽ trả về mysql_affected_rows() với một giá trị bằng 0 vì theo định nghĩa không có hàng nào được cập nhật trong tiến trình. Tuy nhiên, bản thân truy vấn đã thành công.

Cách giải quyết này sẽ được một trong hai giấy tờ chứng minh nội dung của bạn trước khi chèn hoặc sử dụng:

$result = mysql_query($q); 
if(mysql_affected_rows() == 0) 
    $state = $result ? "Success" : "Fail"; 

Bằng cách này bạn có thể kiểm tra xem các hàng đã được cập nhật và nếu không bạn có thể kiểm tra xem đó là một sự cố hoặc chỉ cần lặp lại dữ liệu.

+0

4 kết quả có thể xảy ra: sự cố, dữ liệu được cập nhật, lặp lại dữ liệu hoặc không tìm thấy khóa. Rất tiếc, việc kiểm tra lỗi sẽ không giúp bạn phân biệt giữa khóa không tìm thấy và lặp lại dữ liệu. –

0

Tôi khá muộn ở đây, nhưng bạn luôn có thể buộc không thành công khi thay đổi truy vấn của mình.

Đối với bảng 'foo' có cột 'ID' và 'value'. Biểu thức đối sánh: ID = 4

update foo 
join (select ID as nearID, 
ID = 4 
as matched from foo order by matched desc limit 0, 1) as t on nearID = ID 
set value='somedata2'  
, ID = if(matched, nearID, 'nomatch') 

Có thể dễ dàng thay đổi bảng để bao gồm dấu thời gian cập nhật hoặc số thứ tự thay thế. (vì những thay đổi này sẽ thay đổi theo từng lần cập nhật)

0

Nếu sử dụng PDO, hàng bị ảnh hưởng có thể thu được bằng rowCount() chức năng như sau:

/* Delete all rows from the FRUIT table */ 
$del = $dbh->prepare('DELETE FROM fruit'); 
$del->execute(); 

/* Return number of rows that were deleted */ 
print("Return number of rows that were deleted:\n"); 
$count = $del->rowCount(); 
print("Deleted $count rows.\n"); 
0

Nếu bạn đang sử dụng tuyên bố chuẩn bị ..

//query 
$stmt = $conn->prepare("UPDATE user SET name = 'Jack' WHERE id = ?"); 

//bind parameters 
$stmt->bind_param("i", $id); 

//execute 
$stmt->execute(); 

//updated row count 
echo $stmt->affected_rows; 
echo " rows updated"; 
Các vấn đề liên quan