Probleme requete :( (netbeans)

Résolu
Bonjour, à tous :)
J'irai droit au but s'est assez simple me direz-vous mais j'en ai marre de bloquer la dessus :(
Je cherche juste a effacer un champs dans ma base de donnée quand j'appuie sur le bouton supprimer.
Ma requête : St.executeUpdate("DELETE FROM t_client WHERE nom="+y);
Message d'erreur : Unknown column 'la valeur d'y' in where clause'
Je suis sur que l'erreur est dans la requête mais pourquoi ? : / les champs table s'est correct ça doit être de syntaxe :(

Je vous remercie d'avance et vous souhaite une bonne journée :)

3 réponses

  1. Bonjour,

    Si tu sais utiliser le deboggeur, met un point d'arrêt sur la ligne de l'executeUpdate et rassure toi que c'est bien elle qui provoque cette erreur.

    et utilise un alias pour ta table t_client (juste pour voir ce que ça donne)/

    ...(DELETE FROM t_client t WHERE t.nom = "+y)...

    1. Modérateur
      Bonsoir,

      Tu voudrais que ta requête finale soit
      DELETE FROM t_client WHERE nom="la valeur d'y"
      or ce que toi tu as c'est
      DELETE FROM t_client WHERE nom=la valeur d'y
      ce qui évidemment plante puisque tu n'as pas les guillemets.

      La réponse rapide serait donc de faire
      St.executeUpdate("DELETE FROM t_client WHERE nom=\""+y+"\"");
      mais si au lieu de mettre
      la valeur d'y
      tu mettais des guillemets, par exemple
      la "valeur" d'y
      , dans ce cas tu vas aussi planter ta requête car tu auras
      DELETE FROM t_client WHERE nom="la "valeur" d'y"
      qui n'est pas bon non plus...

      C'est d'autant plus embêtant que tu pourrais faire ce que tu veux avec ta requête en prenant par exemple
      " OR id>0 OR nom="
      ta requête deviendrait donc
      DELETE FROM t_client WHERE nom="" OR id>0 OR nom=""
      et ça te supprimera toute tes données !
      C'est une grosse faille de sécurité (on appelle ça de l'injection sql)

      Pour éviter ce genre de choses on a les PreparedStatement qui fonctionne en deux temps, tout d'abord tu mets des points d'interrogations à la place de tes arguments, donc
      prepareStatement("DELETE FROM t_client WHERE nom=?");
      , puis tu utilises les méthodes pour associer chaque argument à sa valeur, par exemple un
      setString(1,y);
      va mettre la valeur de y dans la requête en la formatant correctement, sans risque de modifier la requête.
      1. Je te remercie énormément KX pour cette réponse plus que complète ! :)