2013-07-06 10 views
6

Sto facendo una query di aggiornamento con PDO. Vorrei capire se la mia query di aggiornamento non ha modificato nulla nel database, poiché:Can PDO rowCount() dopo la query UPDATE mostra la differenza tra "nessuna modifica apportata" e "riga inesistente"?

  1. i valori passati sono gli stessi già presenti nel database. So che rowCount() in questo caso restituisce 0.
  2. la riga che sto tentando di aggiornare non esiste nel database. Per quanto posso vedere, rowCount() in questi casi restituisce anche 0.

Sono costretto a precedere il mio UPDATE da un'istruzione SELECT, per capire se il record che sto tentando di aggiornare esiste effettivamente? O c'è un'altra pratica comune per questo genere di cose.

Ho sfogliando attraverso la documentazione, ma non riesco a trovare una risposta definitiva: http://php.net/manual/en/pdostatement.rowcount.php

che ho incontrato questa risposta StackOverflow, che suggerisce che rowCount() potrebbe restituire NULL in qualche scenario di, ma io non pensare che sia apliccable al mio scenario: vedere Why does PDO rowCount() return 0 after UPDATE a table without modifying the existing data?

Dai commenti in questa domanda:

Se i dati non è stato modificato, il rowCount sarà zero. Se i dati sono stati modificati, il rowCount sarà uno o più. Se c'è stato un errore , rowCount sarà nullo o falso o qualcosa di diverso da zero.

UPDATE ho trovato un'altra domanda che fornisce un esempio di proposizione nei commenti qui sotto: Getting the insert and update ID with PDO

UPDATE2 Un'altra domanda propone un'altra soluzione, tramite PDO::MYSQL_ATTR_FOUND_ROWS PDO - check if row was updated?

+1

No, per quanto ne so. Se * veramente * hai bisogno di quel numero, puoi prima selezionare "SELEZIONA ... FRO AGGIORNAMENTO". A proposito, la domanda non ha nulla a che fare con la PDO. –

+1

Se nella tabella è presente un ID, è possibile aggiungere 'id = LAST_INSERT_ID (id)' alla clausola di aggiornamento. In questo modo, 'PDO :: lastInsertId' ti restituirà un numero. – hjpotter92

+0

Grazie, esaminerò più tardi oggi e tornerò da te. Sembra una funzionalità molto bella. – maartenmachiels

risposta

0

L'ho risolto utilizzando i suggerimenti di @ 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

È possibile aggiungere condizionali alla clausola 'where' come "e ColumnToUpdate > 'NewValue' "