Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1739 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Clause WHERE dans PHP

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Clause WHERE dans PHP

n°1925904
t671
Posté le 22-09-2009 à 17:08:10  profilanswer
 

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.

mood
Publicité
Posté le 22-09-2009 à 17:08:10  profilanswer
 

n°1925910
flo850
moi je
Posté le 22-09-2009 à 17:17:57  profilanswer
 

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

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

n°1925992
Antac
..
Posté le 23-09-2009 à 00:05:21  profilanswer
 

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
n°1926034
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-09-2009 à 09:09:17  profilanswer
 

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)
n°1926356
t671
Posté le 24-09-2009 à 12:02:29  profilanswer
 

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 ?

n°1926377
proy
Posté le 24-09-2009 à 14:04:26  profilanswer
 

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
n°1926959
t671
Posté le 26-09-2009 à 18:00:20  profilanswer
 

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
n°1926962
flo850
moi je
Posté le 26-09-2009 à 18:34:10  profilanswer
 

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


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

n°1926964
t671
Posté le 26-09-2009 à 18:36:55  profilanswer
 

flo850 a écrit :

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


 
Que veux-tu dire ??????

n°1926966
flo850
moi je
Posté le 26-09-2009 à 18:43:14  profilanswer
 

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

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

mood
Publicité
Posté le 26-09-2009 à 18:43:14  profilanswer
 

n°1926973
t671
Posté le 26-09-2009 à 19:03:22  profilanswer
 

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

n°1926974
flo850
moi je
Posté le 26-09-2009 à 19:16:07  profilanswer
 

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


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

n°1927030
esox_ch
Posté le 27-09-2009 à 11:44:12  profilanswer
 

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
n°1927033
Antac
..
Posté le 27-09-2009 à 12:24:02  profilanswer
 

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
n°1927049
esox_ch
Posté le 27-09-2009 à 15:13:30  profilanswer
 

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
n°1927063
Antac
..
Posté le 27-09-2009 à 15:55:37  profilanswer
 

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
n°1927071
flo850
moi je
Posté le 27-09-2009 à 16:10:14  profilanswer
 

tu fais de la concaténation pour préparer ta requete  
tu ajouts dynamiquement tes paramètres


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

n°1927086
esox_ch
Posté le 27-09-2009 à 18:02:52  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Clause WHERE dans PHP

 

Sujets relatifs
MVC ET PHPImage défilante en JavaScript + PHP avec largeur et hauteur dynamique
PHP : str_replace ne marche même pas[PHP/Excel] crée une nouvelle feuille EXCEL a partir de PHP
Rotation d'images au click/refresh avec du PHPScript PHP RSS
Transformer un PHP en XMLProblème de code PHP
[Php/OpenLaszlo] conception de site/ transmission client/serveur[PHP] Probleme de variable dans une clause WHERE
Plus de sujets relatifs à : Clause WHERE dans PHP


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR