Update avec un select sur une bdd MySql
Résolu
sandraAZUL
-
sandraAZUL -
sandraAZUL -
salut;
je voudrai faire un update sur une colonne de ma table stock si un enregistrement existe déjà pour la colonne desig
et quant j’exécute j'ai l'erreur suivante:
voila mon code java:
helpe me please.....
je voudrai faire un update sur une colonne de ma table stock si un enregistrement existe déjà pour la colonne desig
et quant j’exécute j'ai l'erreur suivante:
can't specify target table for update in from clause
voila mon code java:
if (duplicateExists.next()) {
System.out.println("je suis ici update");
String sqlUpdate = "UPDATE stock set qt=((select SUM(ST.qt)AS quant from stock ST)+('"+Q+"'))where desig='"+o+"'";
stmt.executeUpdate(sqlUpdate);
}
helpe me please.....
2 réponses
-
problème résolu
parfois on complique les choses........
voila le code
if (duplicateExists.next()) { System.out.println("je suis ici update"); String sqlUpdate = "UPDATE stock AS ST set ST.qt=(ST.qt +('"+Q+"'))where ST.desig='"+o+"'"; stmt.executeUpdate(sqlUpdate); System.out.println("selection exist"); } -
Bonjour,
Il ne faut pas faire des concaténations dans les requêtes SQL comme tu l'as fait par exemple avecwhere desig='"+o+"'"
En effet ce genre de code présente une faille de sécurité (injection SQL)
Exemple : Si je faiso = "toto' OR 1=1 -- toto";
ta requête devientwhere desig='toto' OR 1=1 -- toto
Ton update va donc concerner toute ta table, la restriction surdesig
est annulée par leOR 1=1
.
On pourrait faire pire, commewhere desig='toto'; DELETE stock -- toto
Pour se prémunir de ces failles il faut faire des PreparedStatement
String sqlUpdate = "UPDATE stock set qt=((select SUM(ST.qt) AS quant from stock ST)+(?)) where desig=?"; PreparedStatement stmt = con.prepareStatement(sqlUpdate); stmt.setString(1, Q); stmt.setString(2, o); stmt.executeUpdate();
Les?
représentent des paramètres à remplir avec les méthodes setString, setInt, etc.