Update avec un select sur une bdd MySql

Résolu/Fermé
sandraAZUL - 12 juin 2016 à 00:39
 sandraAZUL - 14 juin 2016 à 19:56
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:

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.....
A voir également:

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");
           
                }
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
12 juin 2016 à 13:25
Bonjour,

Il ne faut pas faire des concaténations dans les requêtes SQL comme tu l'as fait par exemple avec
where desig='"+o+"'"


En effet ce genre de code présente une faille de sécurité (injection SQL)

Exemple : Si je fais
o = "toto' OR 1=1 -- toto";
ta requête devient
where desig='toto' OR 1=1 -- toto

Ton update va donc concerner toute ta table, la restriction sur
desig
est annulée par le
OR 1=1
.

On pourrait faire pire, comme
where 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.
0
salut KX;

merci pour ta réponse, et effectivement les (PreparedStatement )sont les plus adapter a ce genre de requête.
0