2013-07-06 12 views
6

Tôi đang thực hiện truy vấn cập nhật với PDO. Tôi muốn tìm hiểu xem truy vấn cập nhật của tôi có không thay đổi bất kỳ điều gì trong cơ sở dữ liệu hay không, vì:Có thể PDO rowCount() sau khi truy vấn UPDATE hiển thị sự khác biệt giữa "không có thay đổi được thực hiện" và "hàng chưa tồn tại"?

  1. giá trị đã chuyển là giống như đã có trong cơ sở dữ liệu. Tôi biết rằng rowCount() trong trường hợp này trả về 0.
  2. hàng tôi đang cố gắng cập nhật không tồn tại trong cơ sở dữ liệu. Theo như tôi thấy, rowCount() trong các trường hợp như vậy cũng trả về 0.

Tôi có bị buộc phải đặt trước UPDATE của mình bằng câu lệnh SELECT hay không, để tìm hiểu xem bản ghi tôi đang cố gắng cập nhật có tồn tại không? Hoặc là có một thực tế phổ biến cho loại điều này.

Tôi đã đọc kỹ thông qua các tài liệu, nhưng không thể tìm thấy một câu trả lời thuyết phục: http://php.net/manual/en/pdostatement.rowcount.php

tôi đã đi qua câu trả lời StackOverflow này, gợi ý rằng rowCount() có thể trả về NULL trong một số kịch bản, nhưng tôi không nghĩ rằng đó là apliccable để kịch bản của tôi: thấy Why does PDO rowCount() return 0 after UPDATE a table without modifying the existing data?

Từ các ý kiến ​​trong câu hỏi này:

Nếu dữ liệu chưa được sửa đổi, các rowCount sẽ bằng không. Nếu dữ liệu đã được sửa đổi, rowCount sẽ là một hoặc cao hơn. Nếu có lỗi , rowCount sẽ là rỗng hoặc sai hoặc số khác không.

CẬP NHẬT Tôi đã tìm thấy một câu hỏi mà đưa ra một ví dụ về các đề xuất trong các ý kiến ​​dưới đây: Getting the insert and update ID with PDO

UPDATE2 Câu hỏi khác đề xuất một giải pháp khác, qua PDO::MYSQL_ATTR_FOUND_ROWS PDO - check if row was updated?

+1

Không, theo như tôi biết. Nếu bạn * thực sự * cần số đó, bạn có thể 'SELECT ... FRO UPDATE' trước. Câu hỏi không liên quan gì đến PDO. –

+1

Nếu có một ID trong bảng, bạn có thể thêm 'id = LAST_INSERT_ID (id)' vào mệnh đề cập nhật của mình. Bằng cách này, 'PDO :: lastInsertId' sẽ trả lại cho bạn một số. – hjpotter92

+0

Cảm ơn, tôi sẽ điều tra sau ngày hôm nay và liên hệ lại với bạn. Có vẻ như một chức năng rất đẹp. – maartenmachiels

Trả lời

0

Tôi đã giải quyết nó bằng cách sử dụng đề xuất của @ hjpotter92.

// UID is the unique ID of my table, autoincremented etc... 
// Firstly, let's try to update my row 
$query = 'UPDATE my_table SET x=0, y=1, uid=LAST_INSERT_ID(uid) WHERE z=2'; 
$sth = $dbh->prepare($query); 
if($sth->execute()) { 
    if($dbh->lastInsertId() == 0) { // Record was not found, so insert it. 
     $query = 'INSERT INTO my_table (x,y) VALUES (0,1)'; 
     $sth = $dbh->prepare($query); 
     $sth->execute(); 
     if($sth->rowCount() > 0) { 
      echo $dbh->lastInsertId(); // Return the UID of the inserted row 
     } 
    } 
} 
0

Bạn có thể thêm điều kiện vào mệnh đề 'where' của bạn, chẳng hạn như "và ColumnToUpdate <> 'NewValue' "

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