2013-07-06 8 views
6

Robię zapytanie o aktualizację z PDO. Chciałbym dowiedzieć się, czy moje zapytanie o aktualizację niczego nie zmieniło w bazie danych, ponieważ:Czy PDO rowCount() po kwerendie UPDATE pokazuje różnicę między "brak zmian" i "nieistniejący wiersz"?

  1. przekazane wartości są takie same jak już obecne w bazie danych. Wiem, że rowCount() w takim przypadku zwraca 0.
  2. Wiersz, który próbuję zaktualizować, nie istnieje w bazie danych. O ile widzę, rowCount() w takich przypadkach również zwraca 0.

Czy jestem zmuszony poprzedzić AKTUALIZACJĘ instrukcją SELECT, aby dowiedzieć się, czy rekord, który próbuję zaktualizować, faktycznie istnieje? Czy istnieje inna powszechna praktyka dla tego typu rzeczy.

byłem uważne poprzez dokumentację, ale nie mogę znaleźć odpowiedzi rozstrzygającej: http://php.net/manual/en/pdostatement.rowcount.php

Natknąłem tym StackOverflow odpowiedź, która sugeruje, że rowCount() może zwrócić NULL w jakiś scenariusz, ale ja nie sądzę, że to apliccable do mojego scenariusza: zobaczyć Why does PDO rowCount() return 0 after UPDATE a table without modifying the existing data?

od komentarzy w tej kwestii:

Jeśli dane nie został zmodyfikowany, rowCount będzie zero. Jeśli dane zostały zmodyfikowane, wartość rowCount będzie równa jeden lub więcej. Jeśli wystąpił błąd , parametr rowCount będzie mieć wartość NULL lub FAŁSZ lub coś niezerowego.

UPDATE Znalazłem jeszcze jedno pytanie, które daje przykład propozycji w komentarzach poniżej: Getting the insert and update ID with PDO

Update2 Inną kwestią proponuje inne rozwiązanie, poprzez PDO::MYSQL_ATTR_FOUND_ROWS PDO - check if row was updated?

+1

Nie, o ile wiem. Jeśli * naprawdę * potrzebujesz tego numeru, możesz najpierw "SELECT ... FRO UPDATE". Pytanie to nie ma nic wspólnego z ChNP. –

+1

Jeśli w tabeli znajduje się identyfikator, można dodać "id = LAST_INSERT_ID (identyfikator)" do klauzuli aktualizacji. W ten sposób 'PDO :: lastInsertId' zwróci ci liczbę. – hjpotter92

+0

Dzięki, zbadam to jeszcze dziś i skontaktuję się z Tobą. Wydaje się, że to bardzo fajna funkcja. – maartenmachiels

Odpowiedz

0

Rozwiązałem to, korzystając z sugestii @ 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

Możesz dodać warunki warunkowe do swojej klauzuli "where", na przykład "i ColumnToUpdate <> 'NowaWartość' "

Powiązane problemy