2013-02-21 10 views
16

Ho provato ad aggiornare alcune informazioni nel DB MYSQL, ma non sono sicuro di come farlo con node.js. Questo è il driver mysql che sto utilizzando https://github.com/felixge/node-mysqlNode.js mysql problemi di sintassi della query UPDATE WHERE

Quello che ho finora

connection.query('SELECT * FROM users WHERE UserID = ?', [userId], function(err, results) { 
if (results[0]) { 
if (results[0].Name!=name) { 
console.log(results[0].Name); 
connection.query('UPDATE users SET ? WHERE UserID = ?', [userId], {Name: name}); 
} 
console.log(results[0].UserID); 
} 
}); 

Tutto funziona tranne ...

connection.query('UPDATE users SET ? WHERE UserID = ?', [userId], {Name: name}); 

In PHP avrei questo ...

mysql_query("UPDATE users SET Name='".$_GET["name"]."' WHERE UserID='".$row['UserID']."'"); 

Non sono sicuro di cosa sto facendo male, ma sono certo che il problema sia qui

connection.query('UPDATE users SET ? WHERE UserID = ?', [userId], {Name: name}); 

risposta

35

[Nota (aggiunto 2016/04/29): Questa risposta è stata accettata, ma si scopre che non ci sia un modo ragionevole per usare SET ?. Per i dettagli, vedere la risposta di Bala Clark su questa stessa pagina. — ruakh]


Da the code for Connection.prototype.query() and Connection.createQuery(), è chiaro che si può passare solo in un singolo valori dell'oggetto. Non vedo dove il codice per il comportamento speciale SET ? è definito —, non è chiaramente in SqlString.formatQuery() — ma se utilizza SqlString.objectToValues(), quindi suppongo che non sia possibile utilizzarlo insieme a un altro ?.

penso che l'approccio migliore è quello di fare a meno solo con la ordinata SET ? funzione, e scrivere uno di questi:

connection.query('UPDATE users SET Name = ? WHERE UserID = ?', [name, userId]) 
connection.query('UPDATE users SET Name = :Name WHERE UserID = :UserID', 
        {UserID: userId, Name: name}) 

, ma se si vuole veramente utilizzare SET ?, suppongo che si possa scrivere questo:

connection.query('UPDATE users SET ? WHERE UserID = :UserID', 
        {UserID: userId, Name: name}) 

che aggiornare sia UserID e Name; a meno che non si disponga di un trigger, questo deve essere essere O.K., in quanto sta aggiornando UserID sul valore che aveva già. Ma è un po 'sconcertante, e io non lo consiglio.

+0

sembra funzionare: D grazie! – agdurrette

+0

@MarcioJasinski: Grazie per il tuo suggerimento di modifica, ma cambia davvero questa risposta in un modo che invalida altre risposte in questa pagina. Vedrò se riesco a trovare un modo più aggraziato per aggiungere quell'informazione. . . – ruakh

+0

È necessario ricordare che per l'implementazione di ': Name' e': UserId' è necessario includere una configurazione [formato personalizzato] (https://github.com/mysqljs/mysql#custom-format). – Knowledge

15

La risposta di ruakh non è del tutto corretta, è possibile utilizzare la funzione SET ? con un altro ?.

La sintassi è:

connection.query('UPDATE users SET ? WHERE UserID = ?', [{ Name: name }, userId]) 
+1

Penso che tu debba avere un errore nella tua sintassi: con la tua versione, come potrebbe il 'SET? 'Sapere che il campo che si sta impostando è' Nome'? – ruakh

11

È possibile utilizzare un array di oggetti:

connection.query('UPDATE user SET ? WHERE ?', [{ Name: name }, { UserId: userId }]) 
+0

Grazie a @marcel l'ho provato ha funzionato – AnNaMaLaI