Clause WHERE dans PHP - PHP - Programmation
Marsh Posté le 22-09-2009 à 17:17:57
dejà , tu remplaces $id = $_GET['id'] par $id = mysql_real_escape_string($_GET['id'])
idem pour tout tes autres paramètres, histoire de prendre en charge correctement l'echapement des caractères spéciaux, dont les apostrophes
ensuite la syntaxe est
update table set toto=1, tata="prout" WHERE id=
enfin, ton id est vide
Marsh Posté le 23-09-2009 à 00:05:21
Code :
|
Marsh Posté le 23-09-2009 à 09:09:17
flo850 a écrit : dejà , tu remplaces $id = $_GET['id'] par $id = mysql_real_escape_string($_GET['id']) |
moi je rajouterais qu'il faut qu'il vire ses requêtes construites par des concaténations de chaines pour les remplacer par des requêtes paramétrées s'il veut éviter une SQL Injection, car je suppose que son code comporte d'autres requêtes de ce genre
Marsh Posté le 24-09-2009 à 12:02:29
En fait, mon premier problème est que je n'arrive pas à récupérer mon ID. Car je commence par afficher un tableau (aff_manif.php) où je sélectionne l'enregistrement à modifier. Puis j'affiche une fenêtre d'upload de fichier (upload.htm). Et enfin je mets à jour la base (add-manif-pj). C'est dans cette dernière partie où je fais mon $_GET["id"]. Et en fait, il faudrait soit que je le récupère dans mon upload.htm, et que je le promène de script en script (mais comment le récupère t'on dans l'upload pour ensuite le passer au add-manif ?), soit je mets le script add-manif-pj.php dans l'upload, mais que devient
<form enctype="multipart/form-data" method="POST" action="add-manif-pj.php" value="envoyer" name="soumettre">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<input type="file" name="monfichier" size="51" /><p>
<input type="reset" value="Effacer">
<input type="submit" name="preview" value="Valider">
de l'upload ? Comment l'écrire ?
Marsh Posté le 24-09-2009 à 14:04:26
Ton $_GET['id'] ne sautera pas 2 pages tout seul, il faudrait le remettre par exemple dans l'action de ton formulaire ou en champ hidden.
Marsh Posté le 26-09-2009 à 18:00:20
proy a écrit : Ton $_GET['id'] ne sautera pas 2 pages tout seul, il faudrait le remettre par exemple dans l'action de ton formulaire ou en champ hidden. |
Dans ma boîte de saisie (upload.php), j'ai donc mis
Code :
|
Le premier type="hidden", je l'ai mis en commentaire car je ne sais pas si je peux ou comment mettre 2 type="hidden" ....
puis, je dans mon script de mise à jour de base :
Code :
|
Et là, ça ne fonctionne pas mieux .....
J'ai comme message d'erreur :
L'id est Chargement effectué avec succès !Erreur SQL !You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Marsh Posté le 26-09-2009 à 18:34:10
ReplyMarsh Posté le 26-09-2009 à 18:36:55
flo850 a écrit : tu regarde dans Get alors que tes variables sont dans $_POST |
Que veux-tu dire ??????
Marsh Posté le 26-09-2009 à 18:43:14
tla méthode de ton formulaire est POST
donc , $_GET est vide , tout est dans $_POST
teste print_r($_GET) et print_r($_POST)
Marsh Posté le 26-09-2009 à 19:03:22
Si je teste print_r($_GET) et print_r($_POST), voici ce que j'obtiens:
Code :
|
Donc, comme je m'en doutais, l'ID est vide. Mais pourquoi ?
Marsh Posté le 26-09-2009 à 19:16:07
en page précédente, tu es sur que id est bon
Marsh Posté le 27-09-2009 à 11:44:12
Harkonnen a écrit : |
+1
C'est ahurissant que des gens ne le fassent pas en 2009
Marsh Posté le 27-09-2009 à 12:24:02
Parfois tu as pas le choix, quand c'est fixe comme ça, je suis d'accord avec toi c'est con.
Maintenant quand tu as de la recherche sur des champs multiples et des conditions de test en amont, c'est difficile de se passer de la construction de requête par concaténation.
Mais pour un petit truc comme ça, je suis d'accord, il faudrait faire des requêtes paramétrées pour que ce soit clean.
Il y a des solutions alternatives : mysql_real_escape_string
Marsh Posté le 27-09-2009 à 15:13:30
Bof pas d'accord
Dans l'appli que j'utilise actuellement j'ai parfois des requêtes inter-tables assez barbares et j'utilise un type de prepared statement, ne serait-ce que parce que selon le langage/lib que tu utilises y a des mises en cache/optimisation qui sont automatiquement effectuées
Marsh Posté le 27-09-2009 à 15:55:37
esox_ch a écrit : Bof pas d'accord |
Oui mais tu as un nombre de paramètres déjà prédéterminés, quand ce n'est pas le cas, quand tes conditions de restrictions ont un nombre variable en fonction des paramètres que tu passes (AJAX). Comment tu fais pour faire un prepared statement à l'avance si tu ne sais même pas quelles seront les champs en questions ainsi que les opérateurs à utiliser.
Marsh Posté le 27-09-2009 à 16:10:14
tu fais de la concaténation pour préparer ta requete
tu ajouts dynamiquement tes paramètres
Marsh Posté le 27-09-2009 à 18:02:52
antac a écrit : Oui mais tu as un nombre de paramètres déjà prédéterminés, quand ce n'est pas le cas, quand tes conditions de restrictions ont un nombre variable en fonction des paramètres que tu passes (AJAX). Comment tu fais pour faire un prepared statement à l'avance si tu ne sais même pas quelles seront les champs en questions ainsi que les opérateurs à utiliser. |
Simple : Mon framework me le permet
En Rails tu peux "chainer" les conditions "select". Le langage va ensuite les analyser et établir une seule requête cohérente.
Donc si je sais pas combien de paramètres je vais avoir, je boucle sur l'array de params (comme toi) et je lui dit "construit moi une requête avec tels et tels params". Il la compile par la suite et voilà
Edit : Et c'est bien une requête préparée. Si je l'execute plusieurs fois et regarde les logs du framework, rails me signale qu'il trouve une requête déjà compilée, et la ré-utilise
Marsh Posté le 22-09-2009 à 17:08:10
Bonjour,
J'ai une base Mysql, et je souhaite mettre à jour des champs via un formulaire.
Sélection de l'enregistrement à mettre à jour, upload d'un fichier (image, doc ou autre), et écriture du lien, du nom et de l'extension du fichier dans la base.
Voici ce que j'ai écris :
Le fichier est correctement copié dans son répertoire de destination, mais les champs (lien_fichier, fichier, extension) de l'enregistrement ne sont pas mis à jour. Et j'ai ce message en retour :
Chargement effectué avec succès !Erreur SQL !UPDATE manifestations SET(lien_fichier, fichier, extension) VALUES('./dossier_upload/toto.doc', 'toto.doc', '.doc') where id=''You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(lien_fichier, fichier, extension) VALUES('./dossier_upload/toto.doc' at line 1
Pourriez-vous m'aider ? Merci.