Probleme requete :( (netbeans)

Résolu/Fermé
jimmylibilibob Messages postés 13 Date d'inscription dimanche 8 septembre 2013 Statut Membre Dernière intervention 4 décembre 2021 - 8 avril 2014 à 12:42
jimmylibilibob Messages postés 13 Date d'inscription dimanche 8 septembre 2013 Statut Membre Dernière intervention 4 décembre 2021 - 10 avril 2014 à 21:10
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

tksteph Messages postés 204 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 3 janvier 2018 25
9 avril 2014 à 17:01
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)...



0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
9 avril 2014 à 20:55
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.
0
jimmylibilibob Messages postés 13 Date d'inscription dimanche 8 septembre 2013 Statut Membre Dernière intervention 4 décembre 2021
10 avril 2014 à 21:10
Je te remercie énormément KX pour cette réponse plus que complète ! :)
0