Update avec un select sur une bdd MySql

Résolu
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:

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

  1. sandraAZUL
     
    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
  2. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
    1. sandraAZUL
       
      salut KX;

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