Clause WHERE dans PHP

Clause WHERE dans PHP - PHP - Programmation

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 :  
 

Code :
  1. $id = $_GET["id"];     //-------------récupération de l'id de l'enregistrement à mettre à jour
  2.      ................................................
  3.                
  4.        // on écrit la requête sql  
  5. $sql="INSERT INTO manifestations(lien_fichier, fichier, extension) Values('$dossier$fichier', '$fichier', '$extension') where id='$id'";


 
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.

Reply

Marsh Posté le 22-09-2009 à 17:08:10   

Reply

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

Message cité 1 fois
Message édité par flo850 le 22-09-2009 à 17:18:23

---------------

Reply

Marsh Posté le 23-09-2009 à 00:05:21    

Code :
  1. $id =mysql_real_escape_string($_GET["id"]);     //-------------récupération de l'id de l'enregistrement à mettre à jour
  2.     ................................................
  3.              
  4.        // on écrit la requête sql   
  5. $sql="INSERT INTO manifestations(lien_fichier, fichier, extension) Values('$dossier$fichier', '$fichier', '$extension') where id='".$id."'";


Message édité par antac le 23-09-2009 à 00:05:55
Reply

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'])
idem pour tout tes autres paramètres, histoire de prendre en charge correctement l'echapement des caractères spéciaux, dont les apostrophes
 


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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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 ?

Reply

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.


---------------
White list: dieamond, rmig, bacillus, milliondollarsman, scoubidoo, Wipeout 2097, MasterX, kokofiolo, The Grim Reaper, shu2391, Fred46, indiana77 .. Black list: rodrigue
Reply

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 :
  1. <form enctype="multipart/form-data" method="POST" action="add-manif-pj_4.php" value="envoyer" name="soumettre">
  2. <!--<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />-->
  3. <input type="hidden" name="id" value="<? echo $_GET['id']; ?>" />
  4. <input type="file" name="monfichier" size="51" /><p>
  5. <input type="reset" value="Effacer">
  6. <input type="submit" name="preview" value="Valider">
  7. </form>


 
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 :
  1. $id = mysql_real_escape_string($_GET['id']);
  2. echo 'L\'id est ';
  3. echo $id;
  4. // --------------------Upload fichier------------------------------
  5. $dossier = './dossier_upload/';
  6. $fichier = basename($_FILES['monfichier']['name']);
  7. $taille_maxi = 2000000;
  8. $taille = filesize($_FILES['monfichier']['tmp_name']);
  9. $extensions = array('.gif', '.jpg', '.jpeg', '.doc', '.pdf', '.PDF', '.png', '.PNG', '.GIF', '.JPG', '.JPEG', '.DOC');
  10. $extension = strrchr($_FILES['monfichier']['name'], '.');
  11. if(move_uploaded_file($_FILES['monfichier']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
  12.           {
  13.           echo 'Chargement effectué avec succès !';
  14.         }
  15. $requete_update = "UPDATE manifestations SET lien_fichier='".$lien_fichier."' , fichier='".$fichier."' , extension='".$extension."' WHERE id=".$_GET['id']."";
  16.     // on insère les informations du formulaire dans la table  
  17.     mysql_query($requete_update) or die('Erreur SQL !'.$sql.mysql_error());


 
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
 :cry:   :fou:   :pt1cable:


Message édité par t671 le 26-09-2009 à 18:00:57
Reply

Marsh Posté le 26-09-2009 à 18:34:10    

tu regarde dans Get alors que tes variables sont dans $_POST


---------------

Reply

Marsh 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 ??????

Reply

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)


Message édité par flo850 le 26-09-2009 à 18:43:22

---------------

Reply

Marsh Posté le 26-09-2009 à 18:43:14   

Reply

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 :
  1. Array
  2. (
  3. )
  4. Array
  5. (
  6.     [id] =>
  7.     [preview] => Valider
  8. )
  9. 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


 
Donc, comme je m'en doutais, l'ID est vide. Mais pourquoi ? :??:

Reply

Marsh Posté le 26-09-2009 à 19:16:07    

en page précédente, tu es sur que id est bon


---------------

Reply

Marsh Posté le 27-09-2009 à 11:44:12    

Harkonnen a écrit :


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


 
+1
 
C'est ahurissant que des gens ne le fassent pas en 2009  [:k-nar]


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

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


Message édité par antac le 27-09-2009 à 13:36:23
Reply

Marsh Posté le 27-09-2009 à 15:13:30    

Bof pas d'accord :o
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 :o


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 27-09-2009 à 15:55:37    

esox_ch a écrit :

Bof pas d'accord :o
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 :o


 
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.

Message cité 1 fois
Message édité par antac le 27-09-2009 à 15:56:02
Reply

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


---------------

Reply

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 :o
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à :o

 

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


Message édité par esox_ch le 27-09-2009 à 18:04:11

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed