2012-09-19 11 views
7

Sto inserendo un nome, un numero e una società in un DB.Aggiornare una riga se esiste, se non crearne una nuova MySQL

Il mio tavolo è semplicemente:

id(primary key) 
name 
slideView 
company 

ho bisogno di aggiornare queste informazioni se un nome passato a esiste, se non creare una nuova riga con questi dati. Ho guardato allo REPLACE INTO ma non penso che funzionerà per me ... visto che non tocco affatto l'ID.

Il mio codice è:

insertData($name,$count,$company); 

function insertData($name, $count, $company) { 

    #Try/Catch statement to connect to DB, and insert data 
    try { 
     #DB username/password 
     $usernameDB = '****'; 
     $passwordDB = '****'; 

     #Create new PHP Database Object with the address, username, and password as parameters 
     $pdo = new PDO('mysql:host=localhost;dbname=*****', $usernameDB, $passwordDB); 

     #Set pdo attributes to handle errors 
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     #assign the sth variable (sth means statement handle) to insert the data 
     $sth = $pdo->prepare("REPLACE INTO ***** SET name = ?, slideView = ?, company = ?"); 

     #Execute the insert 
     $sth->execute(array($name,$count,$company)); 

    #Error if can't connect or insert 
    } catch(PDOException $e) { 
     echo 'Error: ' . $e->getMessage(); 
    }#/try 
} 

Sono nuovo di SQL e havnt trovato un buon modo per farlo ancora.

risposta

2

REPLACE INTO dovrebbe funzionare bene, controlla anche le colonne con vincoli UNIQUE. Quindi devi solo mark your name column as unique in modo che SOSTITUISCI INTO lo identificherà come duplicato.

Non ho provato questo particolare caso d'uso, ma la documentazione sembra consentirlo.

+0

Ho scelto di tornare a ciò che avevo originariamente. Ha funzionato una volta che ho segnato la mia colonna del nome unica. Grazie! – mdance

4

Potrebbe essere preferibile utilizzare la sintassi insert ... on duplicate update per questo, sebbene significherà passare alcuni parametri aggiuntivi ma può annullare la sintassi problems in the replace into che sembra continuare a spuntare.

REPLACE INTO ***** SET name = ?, slideView = ?, company = ? 

potrebbe essere scritto come:

insert into yourTableName (name, slideView, company) 
    values (:name, :slideView, :company) 
    on duplicate key update set 
     slideView=:$slideView2, company=:company2 

e poi il eseguire è fatto in questo modo:

$sth->execute(array(':name' => $name, ':slideView' => $count, 
    ':company' => $company, ':slideView2' => $count, ':company2' => $company)); 

il formato sopra descritto usi suddetti paramaters (sono sempre molto più facile da leggere/debug) e inserirà una nuova riga nel database o se la colonna chiave univoca/primaria name ha già il valore, quindi aggiorna la riga con il resto delle informazioni.

È necessario utilizzare i parametri due volte qui (anche se slideView e società conterranno le stesse informazioni) poiché nessun parametro può essere utilizzato due volte in una query.

+0

Sembra corretto. Sebbene stia generando questo errore: 'Errore: SQLSTATE [42000]: Errore di sintassi o violazione di accesso: 1064 Si ha un errore nella sintassi SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino a 'SET slideView = NULL, company = NULL' alla riga 1' – mdance

+0

Inoltre, sto eseguendo la versione di MySQL '5.1.61' – mdance

+0

Ho rimosso' SET' e la query è stata eseguita, anche se non ha aggiornato nulla, ma ha continuato ad aggiungere nuove righe ogni volta. – mdance

Problemi correlati