web-dev-qa-db-fra.com

Problèmes de syntaxe de requête mysql avec Node.js UPDATE WHERE

J'essaie de mettre à jour certaines informations dans MYSQL DB, mais je ne suis pas sûr de savoir comment le faire dans node.js. C'est le pilote mysql que j'utilise https://github.com/felixge/node-mysql

Ce que j'ai jusqu'à présent

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);
}
});

Tout fonctionne sauf ...

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

Dans PHP, j'aurais ceci ...

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

Je ne suis pas sûr de ce que je fais mal, mais je suis convaincu que le problème est là

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

[Note (ajouté le 2016-04-29): Cette réponse a été acceptée, mais il s'est avéré qu'il y avait est un moyen raisonnable d'utiliser SET ?. Pour plus de détails, voir la réponse de Bala Clark sur cette même page. —Ruakh]


De le code pour Connection.prototype.query() et Connection.createQuery() , il est clair que vous ne pouvez transmettre qu’un objet uniquevaleurs. Je ne vois pas où le code pour le comportement spécial SET ? est défini - ce n'est clairement pas dans SqlString.formatQuery() - mais s'il utilise SqlString.objectToValues() , alors je suppose qu'il n'y a aucun moyen de l'utiliser avec un autre ?.

Je pense que la meilleure approche consiste simplement à se passer de la fonctionnalité soignée SET ? et à écrire l'une de ces choses:

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

mais si vous voulez vraiment utiliser SET ?, je suppose que vous pourriez écrire ceci:

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

qui mettrait à jour à la fois UserID et Name; sauf si vous avez un déclencheur, ceci devrait _ être O.K., en ce sens qu'il met à jour UserID à la valeur qu'il avait déjà de toute façon. Mais c'est un peu déconcertant, et je ne le recommande pas.

40
ruakh

La réponse de ruakh n'est pas tout à fait correcte, vous pouvez utiliser la fonctionnalité SET ? avec un autre ?.

La syntaxe est la suivante:

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

Vous pouvez utiliser un tableau d'objets:

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

C'est ce qui a fonctionné pour moi

 var records = 
 [name,email,adhar,ROLE,NOTES,REQUESTFORSUPPLIER,PASSWORD,LOCATION,CREATEDBY,CREATEDON,MODIFIEDBY,MODIFIEDON,mobile];

    var sql="UPDATE flavica_user SET Name=?,EMAIL=?,AADHAR=?,ROLE=?,NOTES=?,REQUESTFORSUPPLIER=?,PASSWORD=?,LOCATION=?,CREATEDBY=?,CREATEDON=?,MODIFIEDBY=?,MODIFIEDON=? WHERE USER_MOBILE=?"
    //var sql="UPDATE `flavica_user` SET ? WHERE ?";
    //this sql updates flavica_user
    con.query(sql,records,(err,result)=>{

      if(err){
        res.json({
          status:400,
          message:err
        })
      }

      else{
        res.json({
          status:200,
          message:result
        })
      }

    })
1
Shubh Dixit