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

  FORUM HardWare.fr
  Programmation
  PHP

  [RESOLU][PHP][MYSQL]requête Mysql (INSERT)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU][PHP][MYSQL]requête Mysql (INSERT)

n°2249607
recep
Posté le 28-01-2015 à 11:58:27  profilanswer
 

bonjour,
 
voilà j'ai un problème que je n'arrive pas a résoudre.
voici mon code :

Code :
  1. $nomOrigine = $_FILES['chemin']['name'];
  2.                 $elementsChemin = pathinfo($nomOrigine);
  3.                 $extensionFichier = $elementsChemin['extension'];
  4.                 $extensionsAutorisees = array("jpeg", "JPEG", "jpg", "JPG", "gif", "GIF", "pdf", "PDF" );
  5.                 if (!(in_array($extensionFichier, $extensionsAutorisees))) {
  6.                     echo "Le fichier n'a pas l'extension attendue";
  7.                 } else {   
  8.                     $repertoireDestination = dirname(__DIR__)."\\fichiers\\";
  9.                     $nomDestination = "news".date("YmdHis" ).".".$extensionFichier;
  10.                     if (move_uploaded_file($_FILES["chemin"]["tmp_name"], $repertoireDestination.$nomDestination)) {
  11.                     } else {
  12.                         echo "Le fichier n'a pas été uploadé (trop gros ?) ou ".
  13.                                 "Le déplacement du fichier temporaire a échoué".
  14.                                 " vérifiez l'existence du répertoire ".$repertoireDestination;
  15.                     }
  16.                 }
  17.                 global $nomDestination;
  18.                 $arrayChaine=explode(".",$nomDestination);
  19.                 $chaine = $arrayChaine[0];
  20.                 echo $chaine;  --> m'affiche bien ex. = news20150128114011
  21.                 $DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('',$titre,$contenu,$date,$chaine)" );
  22.                 //$DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('',$titre,$contenu,$date,'news20150128114011')" );


 
dans ce bout de code, je désire Uploader un fichier vers un dossier ("MonSite\fichiers\" ), lorsque j'utilise la commande (en commentaire - en vert) d'insertion dans la DB du nom du fichier cela fonctionne, mais si j'utilise cette fois-ci la commande (en bleu) où j'indique au niveau du champ "chemin" ma variable $chaine, là ça ne fonctionne pas, je n'ai aucune ligne qui vient s'ajouter dans la DB, je n'ai pas d’erreur (tester avec un try-catch) et mon fichier est bien Ulpoader dans mon dossier.
 
je ne comprends pas pourquoi lorsque j'indique le nom du fichier 'comme dans le commentaire' cela fonction et pas de l'autre manière...  
 
Si quelqu'un à une idée?


Message édité par recep le 29-01-2015 à 11:57:54
mood
Publicité
Posté le 28-01-2015 à 11:58:27  profilanswer
 

n°2249635
olivthill
Posté le 28-01-2015 à 15:39:14  profilanswer
 

Ne manquerait-il pas des apostrophes autour de la chaine ?
Personnellement, je construis toujours en concaténant avec le point. Par exemple :
 

Code :
  1. $DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('','".$titre."', '".$contenu."', ".$date.", '".$chaine."')" );

n°2249642
recep
Posté le 28-01-2015 à 16:03:56  profilanswer
 

olivthill a écrit :

Ne manquerait-il pas des apostrophes autour de la chaine ?
Personnellement, je construis toujours en concaténant avec le point. Par exemple :
 

Code :
  1. $DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('','".$titre."', '".$contenu."', ".$date.", '".$chaine."')" );



Merci, mais cela ne fonctionne pas non plus...
Voici la structure de ma table :
https://drive.google.com/file/d/0B2 [...] sp=sharing
 
peut-être que le "type" de mon champs n'est pas bon ???

n°2249682
recep
Posté le 29-01-2015 à 09:58:11  profilanswer
 

Là je sèche... personne n'a une idée d'où mon problème peut-il venir? :??:

n°2249689
hinomura
Posté le 29-01-2015 à 10:18:17  profilanswer
 

Tu as fais un var_dump de ta variable chaine ?
 
Comme l'a dit olivthill, déjà échappe obligatoirement tes insertions ( rajoute tes variables entre ' ' et mets y au moins du addslashes ou du mysql_real_escape_string ou encore $DB->quote($mavar) )
 
Ensuite je serai toi, je ferai une variable query = ta requete avec les différentes concaténations, un echo/die de la variable query, et tu l'executes en direct sur ta base.
 

n°2249690
FlorentG
Unité de Masse
Posté le 29-01-2015 à 10:19:23  profilanswer
 

Faut regarder si la méthode query ne renvoie pas une erreur. $DB c'est quoi comme objet ?

n°2249695
antac
..
Posté le 29-01-2015 à 10:47:11  profilanswer
 

pense à ajouter un addslashes avant tes variables pour éviter les caractères d'échappements
 
pas besoin de mettre id si il est autoincrémenté  
 
$DB correspond à quoi, je n'ai pas vu de mysql_connect dans ton code, tu es sur que tu as la bonne portée ?
 
qu'est ce que tu as dans le php_error quand tu fais ça ?

n°2249701
recep
Posté le 29-01-2015 à 11:22:59  profilanswer
 

antac a écrit :

pense à ajouter un addslashes avant tes variables pour éviter les caractères d'échappements
 
pas besoin de mettre id si il est autoincrémenté  
 
$DB correspond à quoi, je n'ai pas vu de mysql_connect dans ton code, tu es sur que tu as la bonne portée ?
 
qu'est ce que tu as dans le php_error quand tu fais ça ?


voici l'objet $DB qui se trouve dans "config_rdq.php" :

Code :
  1. <?php
  2. require('config.php');
  3. try{
  4. $DB = new PDO($dsnlocal,$loginlocal,$mdplocal, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'));
  5.         //$DB = new PDO($dsndirect,$logindirect,$mdpdirect, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'));
  6. }
  7. catch(PDOException $e){
  8. echo 'Impossible de se connecter à la base de données... :'.$e->getMessage();
  9. exit();
  10. }
  11. ?>

dans mon bout de code plus haut au début (c'est vrai je n'ai pas affiché le début) où je fais un require de "config_rdq.hph" :

Code :
  1. <?php
  2.         require('../outils/config_rdq.php');
  3.         if (isset($_POST['titre']) AND isset($_POST['date'])){ 
  4.             $titre = $DB->quote($_POST['titre']);
  5.             $date = $DB->quote($_POST['date']);
  6.             $contenu = $DB->quote($_POST['contenu']);
  7.             $id = $DB->quote($_POST['id']);
  8.             // On vérifie si c'est une modification de news ou non.
  9.             if ($_POST['id'] == 0){
  10.                 // Ce n'est pas une modification, on crée une nouvelle entrée dans la table.
  11.                 $nomOrigine = $_FILES['chemin']['name'];
  12.                 $elementsChemin = pathinfo($nomOrigine);
  13.                 $extensionFichier = $elementsChemin['extension'];
  14.                 $extensionsAutorisees = array("jpeg", "JPEG", "jpg", "JPG", "gif", "GIF", "pdf", "PDF" );
  15.                 if (!(in_array($extensionFichier, $extensionsAutorisees))) {
  16.                     echo "Le fichier n'a pas l'extension attendue ou il n'y a pas de fichier attaché";
  17.                 } else {   
  18.                     $repertoireDestination = dirname(__DIR__)."\\fichiers\\";
  19.                     $nomDestination = "news".date("YmdHis" ).".".$extensionFichier;
  20.                     if (move_uploaded_file($_FILES["chemin"]["tmp_name"], $repertoireDestination.$nomDestination)) {
  21.                     } else {
  22.                         echo "Le fichier n'a pas été uploadé (trop gros ?) ou ".
  23.                                 "Le déplacement du fichier temporaire a échoué".
  24.                                 " vérifiez l'existence du répertoire ".$repertoireDestination;
  25.                     }
  26.                 }
  27.                 global $nomDestination;
  28.                 $arrayChaine=explode(".",$nomDestination);
  29.                 $c = $arrayChaine[0];
  30.                 echo $chaine;
  31.                 $DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('','".$titre."','".$contenu."','".$date."','".$chaine."')" );
  32.                 //$DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('',$titre,$contenu,$date,'news20150128114011')" );  
  33.                 //header('Location: http://localhost/RDQ/admin/liste_news.php');
  34.                 //exit();
  35.             }
  36.             else{
  37.                 // On protège la variable "id" pour éviter une faille SQL.
  38.                 $id = $DB->quote($_POST['id']);
  39.                 // C'est une modification, on met juste à jour le titre et le contenu.
  40.                 $DB->query("UPDATE rdq_news SET titre=$titre,date=$contenu. WHERE id='".$_POST['id']."'" );
  41.             }
  42.            
  43.         }
  44.         // Vérification 2 : est-ce qu'on veut supprimer une news ?
  45.         // Si l'on demande de supprimer une news.
  46.         if (isset($_GET['supprimer_news'])){
  47.             // Alors on supprime la news correspondante.
  48.             // On protège la variable "supprimer_events" pour éviter une faille SQL.
  49.             $_GET['supprimer_news'] = addslashes($_GET['supprimer_news']);
  50.             $DB->query('DELETE FROM rdq_news WHERE id=\'' . $_GET['supprimer_news'] . '\'');
  51.         }
  52.         ?>


 
Ma commande  

Code :
  1. $DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('',$titre,$contenu,$date,$chaine)" );

fonctionne très bien lorsque je remplace $chaine par du texte manuellement comme ceci :

Code :
  1. $DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('',$titre,$contenu,$date,'news20150128114011')" );


la requête plante lorsque j'utilise $chaine, mais pourquoi ? Comme expliqué plus haut j'ai mis un try/catch autour de ma requête qui ne me retourne aucune erreur...

n°2249702
rufo
Pas me confondre avec Lycos!
Posté le 29-01-2015 à 11:23:01  profilanswer
 

Je parie que dans $titre, $contenu ou $chaine, y'a un caractère non échappé (apostrophe ou guillemet) :o
Sinon, c'est peut-être son champ $date qui n'est pas au format YYYY-mm-dd...
 
Edit  :grilled by antac :/

Message cité 1 fois
Message édité par rufo le 29-01-2015 à 11:23:35

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2249703
recep
Posté le 29-01-2015 à 11:25:33  profilanswer
 

rufo a écrit :

Je parie que dans $titre, $contenu ou $chaine, y'a un caractère non échappé (apostrophe ou guillemet) :o
Sinon, c'est peut-être son champ $date qui n'est pas au format YYYY-mm-dd...
 
Edit  :grilled by antac :/


Je crois tu ass raison, je viens de tester cette commande et ça marche :  

Code :
  1. $DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('','ttt','tt','2015-02-02','".$chaine."')" );

mood
Publicité
Posté le 29-01-2015 à 11:25:33  profilanswer
 

n°2249705
recep
Posté le 29-01-2015 à 11:31:23  profilanswer
 

recep a écrit :


Je crois tu ass raison, je viens de tester cette commande et ça marche :  

Code :
  1. $DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('','ttt','tt','2015-02-02','".$chaine."')" );



 
lorsque je fais un

Code :
  1. echo $date;

j'ai =

Code :
  1. '2015-01-29'

vous pensez que ça peut venir des simples apostrophes qui entourent la date ?

n°2249707
hinomura
Posté le 29-01-2015 à 11:34:52  profilanswer
 

recep a écrit :


 
lorsque je fais un

Code :
  1. echo $date;

j'ai =

Code :
  1. '2015-01-29'

vous pensez que ça peut venir des simples apostrophes qui entourent la date ?


Vu ton code, tu n'as pas à tout requoter, tu le fais là:
 

Code :
  1. $titre = $DB->quote($_POST['titre']);
  2. $date = $DB->quote($_POST['date']);
  3. $contenu = $DB->quote($_POST['contenu']);
  4. $id = $DB->quote($_POST['id']);


 
Il faut juste le faire pour $chaine aussi

n°2249708
recep
Posté le 29-01-2015 à 11:57:17  profilanswer
 

voilà, problème résolu en faisant tout simplement :

Code :
  1. $DB->query("INSERT INTO rdq_news (id,titre,contenu,date,chemin) VALUES('',".$titre.",".$contenu.",".$date.",'".$chaine."')" );


Merci à tous!

n°2249709
antac
..
Posté le 29-01-2015 à 11:57:38  profilanswer
 

les apostrophes ne devraient pas être dans la variable date, c'est crade...


Message édité par antac le 29-01-2015 à 11:58:34
n°2249710
FlorentG
Unité de Masse
Posté le 29-01-2015 à 12:02:13  profilanswer
 

recep a écrit :


voici l'objet $DB qui se trouve dans "config_rdq.php" :

Code :
  1. <?php
  2. [...]
  3.         // Vérification 2 : est-ce qu'on veut supprimer une news ?
  4.         // Si l'on demande de supprimer une news.
  5.         if (isset($_GET['supprimer_news'])){
  6.             // Alors on supprime la news correspondante.
  7.             // On protège la variable "supprimer_events" pour éviter une faille SQL.
  8.             $_GET['supprimer_news'] = addslashes($_GET['supprimer_news']);
  9.             $DB->query('DELETE FROM rdq_news WHERE id=\'' . $_GET['supprimer_news'] . '\'');
  10.         }
  11.         ?>



Là y'a une belle possibilité d'injection + CSRF [:johneh]

n°2249711
hinomura
Posté le 29-01-2015 à 12:04:20  profilanswer
 

Le pire c'est que dans le reste du code il y a du $db->quote()..

n°2249712
FlorentG
Unité de Masse
Posté le 29-01-2015 à 12:26:16  profilanswer
 

Ah merde j'avais pas vu le addslashes [:petrus75] Bon en tous cas c'est pas bien de faire ça en GET :o

n°2249717
antac
..
Posté le 29-01-2015 à 13:49:39  profilanswer
 

En plus faire du PDO pour arriver à ce type de truc... c'est franchement dommage mais bon...


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

  [RESOLU][PHP][MYSQL]requête Mysql (INSERT)

 

Sujets relatifs
[Mysql] Pertinence des résultats avec MATCH / AGAINSTEnvoi données vers base mysql
[Mysql] DB Mediawiki ne contient plus que hitcounter et searchindexRequête SQL jointure deux champs vers un même champ
Aide php mySql[Mysql] redéfinition des id auto incrémentés après suppression
(SQL] AIde pour requèteProblème lien Access-MySQL
requête mysql : insert into where exists ?[MySQL] Insert + sous requete
Plus de sujets relatifs à : [RESOLU][PHP][MYSQL]requête Mysql (INSERT)


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