2012-02-22 28 views
17

Tôi đang cố gắng lấy số hàng bị ảnh hưởng trong truy vấn cập nhật mysql đơn giản. Tuy nhiên, khi tôi chạy mã này dưới đây, mysql_affected_rows() luôn bằng 0. Không có vấn đề nếu foo = 1 đã được (trong trường hợp hàm phải chính xác trả về 0, vì không có hàng nào được thay đổi) hoặc nếu foo hiện bằng số nguyên khác (trong trường hợp này hàm sẽ trả về 1).mysql_affected_rows() trả về 0 cho câu lệnh UPDATE ngay cả khi cập nhật thực sự xảy ra

$updateQuery = "UPDATE myTable SET foo=1 WHERE bar=2"; 
mysql_query($updateQuery); 
if (mysql_affected_rows() > 0) { 
    echo "affected!"; 
} 
else { 
    echo "not affected"; // always prints not affected 
} 

Tuyên bố UPDATE hoạt động. INT được thay đổi trong cơ sở dữ liệu của tôi. Tôi cũng đã kiểm tra lại rằng kết nối cơ sở dữ liệu không bị đóng trước hoặc bất cứ điều gì sôi nổi. Hãy nhớ rằng, mysql_affected_rows không nhất thiết yêu cầu bạn chuyển một mã định danh liên kết kết nối, mặc dù tôi cũng đã thử nó.

Chi tiết về hàm: mysql_affected_rows

Bất kỳ ý tưởng nào?

+1

bạn có chắc kỷ lục đang được cập nhật? Hãy chắc chắn rằng bạn đặt foo bằng một cái gì đó khác hơn 1 trước khi bạn chạy thử nghiệm. – northpole

+3

Bất kỳ cơ hội nào, trang của bạn có thể được gọi hai lần, giống như quy tắc viết lại không? Điều này sẽ làm cho dữ liệu được cập nhật lần đầu tiên, và sau đó không phải là lần thứ hai khi bạn thấy kết quả cuối cùng ... Sẽ không làm tổn thương để kiểm tra nhật ký máy chủ web của bạn. –

+0

Bạn đã xác nhận rằng nó thực sự trả lại 0 và không phải là giá trị âm? – Jodaka

Trả lời

-1

Đã được tôi nghĩ!

Tôi vừa mới nói để kiểm tra xem hàm có được gọi nhiều lần không!

Chỉ cần một lời khuyên nhỏ:

hãy thử sử dụng isset() & POST/GET hoặc một cái gì đó như thế;

if (isset($_POST['Update'] == 'yes')) : 

// your code goes here ... 

endif; 

Hy vọng đó là rõ ràng và hữu ích, Ciao :)

+1

Bạn không thể sử dụng isset() trên kết quả của một biểu thức. – Cedric

0

Thử kết nối như thế này:

$connection = mysql_connect(...,...,...); 

và sau đó gọi như thế này

if(mysql_affected_rows($connection) > 0) 
    echo "affected"; 
} else { ... 
0

Tôi nghĩ rằng bạn cần phải thử cái gì khác trong bản cập nhật rồi foo = 1. Đặt một cái gì đó totaly khác nhau sau đó bạn wil thấy là nó cập nhật hay không mà không có nếu vòng lặp. sau đó nếu có, vòng lặp if của bạn sẽ hoạt động.

0

Bạn làm việc này?

$timestamp=mktime(); 
$updateQuery = "UPDATE myTable SET foo=1, timestamp={$timestamp} WHERE bar=2"; 
mysql_query($updateQuery); 

$updateQuery = "SELECT COUNT(*) FROM myTable WHERE timestamp={$timestamp}"; 
$res=mysql_query($updateQuery); 
$row=mysql_fetch_row($res); 
if ($row[0]>0) { 
    echo "affected!"; 
} 
else { 
    echo "not affected"; 
} 
1

Bạn đã thử sử dụng chức năng MySQL ROW_COUNT trực tiếp?

mysql_query('UPDATE myTable SET foo = 1 WHERE bar = 2'); 
if(mysql_result(mysql_query('SELECT ROW_COUNT()'), 0, 0)) { 
    print "updated"; 
} 
else { 
    print "no updates made"; 
} 

Thông tin thêm về việc sử dụng các ROW_COUNT và các chức năng thông tin MySQL khác là tại địa chỉ: phiên bản http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

19

mới hơn của MySQL là đủ thông minh để xem nếu sửa đổi được thực hiện hay không. Cho phép nói rằng bạn đã kích hoạt Tuyên bố UPDATE:

UPDATE tb_Employee_Stats SET lazy = 1 WHERE ep_id = 1234 

Cho phép nói giá trị của cột đã là 1; sau đó không có quá trình cập nhật nào xảy ra do đó mysql_affected_rows() sẽ trả về 0; nếu cột lười biếng có một số giá trị khác thay vì 1, thì 1 được trả về. Không có khả năng nào khác ngoại trừ lỗi của con người.

+5

+1. Không biết rằng – asprin

+1

Vì vậy, đó là nó, làm cho cuộc sống của tôi khó khăn. Bây giờ tôi có thể cập nhật mã của mình để giải quyết vấn đề này. – zeeshan

1

mysqli_affected_rows yêu cầu bạn chuyển tham chiếu đến kết nối cơ sở dữ liệu của bạn làm thông số duy nhất, thay vì tham chiếu đến truy vấn mysqli của bạn. ví dụ.

$dbref=mysqli_connect("dbserver","dbusername","dbpassword","dbname"); 

$updateQuery = "UPDATE myTable SET foo=1 WHERE bar=2"; 

echo mysqli_affected_rows($dbref); 

KHÔNG

echo mysqli_affected_rows($updateQuery); 
0

Các thuyết minh sau đây sẽ rất hữu ích cho bạn,

mysql_affected_rows() trả về

  • +0: liên tiếp không được cập nhật hoặc chèn (có thể vì hàng đã tồn tại, nhưng không có giá trị trường nào thực sự bị thay đổi trong thời gian CẬP NHẬT).

  • 1: liên tiếp được chèn

  • 2: liên tiếp đã được cập nhật

  • -1: trong trường hợp lỗi.

mysqli affected rows developer notes

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