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

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

Marsh Posté le 28-01-2015 à 11:58:27    

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
Reply

Marsh Posté le 28-01-2015 à 11:58:27   

Reply

Marsh Posté le 28-01-2015 à 15:39:14    

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."')" );

Reply

Marsh Posté le 28-01-2015 à 16:03:56    

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

Reply

Marsh Posté le 29-01-2015 à 09:58:11    

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

Reply

Marsh Posté le 29-01-2015 à 10:18:17    

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.
 

Reply

Marsh Posté le 29-01-2015 à 10:19:23    

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

Reply

Marsh Posté le 29-01-2015 à 10:47:11    

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 ?

Reply

Marsh Posté le 29-01-2015 à 11:22:59    

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...

Reply

Marsh Posté le 29-01-2015 à 11:23:01    

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
Reply

Marsh Posté le 29-01-2015 à 11:25:33    

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."')" );

Reply

Marsh Posté le 29-01-2015 à 11:25:33   

Reply

Marsh Posté le 29-01-2015 à 11:31:23    

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 ?

Reply

Marsh Posté le 29-01-2015 à 11:34:52    

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

Reply

Marsh Posté le 29-01-2015 à 11:57:17    

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!

Reply

Marsh Posté le 29-01-2015 à 11:57:38    

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


Message édité par antac le 29-01-2015 à 11:58:34
Reply

Marsh Posté le 29-01-2015 à 12:02:13    

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]

Reply

Marsh Posté le 29-01-2015 à 12:04:20    

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

Reply

Marsh Posté le 29-01-2015 à 12:26:16    

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

Reply

Marsh Posté le 29-01-2015 à 13:49:39    

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

Reply

Sujets relatifs:

Leave a Replay

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