IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

AutoGénerer une requête d'insertion dans mysql (Json->PhpMysql) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Invité
    Invité(e)
    Par défaut AutoGénerer une requête d'insertion dans mysql (Json->PhpMysql)
    Hem... Je sais que j'abuse un peu...Mais c'est mon dernier post.

    Voilà, j'insère mes données qui proviennent d'Ajax, de cette manière avec Php, dans la base de données mysql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /*Function qui insère les notes : */
     function insert_evaluation() {  
     
    /* Récupération des données POST provenant du Front End */
     $data = json_decode(file_get_contents("php://input"));    
     
     
    /* SQL. */
    $q = "INSERT INTO evaluations VALUES ('','".$data->idintervenant."','".$data->idresto."','".$data->noteglobale."','".$data->service."','".$data->ambiance."','".$data->attente."','".$data->caisses."','".$data->cuisines."','".$data->toilettes."')"; 
     
    $qry = mysql_query($q);
     
     if ($qry) {
            $arr = array('msg' => "Impression enregistree avec succès!!!", 'error' => '');
            $jsn = json_encode($arr);
            // print_r($jsn);
        } else {
            $arr = array('msg' => "", 'error' => 'Erreur dans la mise à jour de l enregistrement');
            $jsn = json_encode($arr);
            // print_r($jsn);
        }
        exit();  
     
    }
    Comme vous pouvez le constater, c'est hyper lourd de réecrire le nom de chaque variable dans la requête SQL ...


    Je me dit qu'il doit exister peut être une méthode pour écrire toutes les variables automatiquement dans l'insert, je ne sais pas.
    Peut être connaissez vous un truc ?
    Sinon je pense à une boucle for peut être ...

    Le truc c'est qu'il ne doit pas y avoir d'erreur dans l'ordre ou l'on place les variables dans la requête INSERT.

    Ce qui serait génial, si cela marchait, c'est que l'insert serait auto-évolutif en fonction des variables reçues par le front end... Je veux dire, au lieu qu'il y ait 10 variables reçues, il pourrait il y en avoir 12 et l'insert cela fonctionnerait encore...(Bien sur, il faudra modifier la table SQL avant, mais au moins, il ne faudra plus retoucher le code PHP)

    je pense vraiment à une boucle FOR, mais bonjour, c'est dur !
    Dernière modification par Invité ; 02/08/2016 à 23h19.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    La bonne solution est d'utiliser une requête préparée PDO.
    Déjà ça corrige ta faille de sécurité puisque ton script actuel ne contrôle pas les données reçus et ensuite ça te permet de construire dynamiquement ta requête avec autant de paramètre que tu veux.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup, oui il n'y a pas de sécurité pour l'instant.
    PDO ? Glup c'est hard à apprendre! Merci.

    Dans mon script, apparemment la piste serait de faire une requête de ce genre avec un implode (Mais celle ci ne marche pas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $q = "INSERT INTO evaluations VALUES ('','"'.implode('","', (array)$data) . '")";
    ça mettrait toutes les variables $data directement dans la requête INSERT.

    le premier champs est un id incrémental il doit être vide.
    Bon ben j'essayerais avec PDO plus tard.

    A mon sens, dans mon script, je dois faire une boucle for qui transfère toutes les variables dans un ARRAY, puis l'imploder dans la requête INSERT, mais je sais pas trop comment faire.
    Et puis, c'est chaud si il y a des valeurs de type INT et des valeurs de type STRING, pas sur que cela fonctionne.

    Ah j'ai une piste ici :http://stackoverflow.com/questions/1...mysql-database

    et ici :

    http://stackoverflow.com/questions/1...abase-with-php

    ils ont des supers exemples par contre mon problème c'est que j'ai une première colonne vide vu que c'est incrémental
    Dernière modification par Invité ; 02/08/2016 à 21h30.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    PDO s'utilise quasiment pareil que l'extension mysql donc non ce n'est pas dur du tout.

    Dans ton essai tu t'es emmelé dans les guillemets, ça se voit à la coloration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $q = "INSERT INTO evaluations VALUES ('','" . implode("','", (array)$data) . "')";
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ca y est, ça marche presque j'ai écris ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     $data = json_decode(file_get_contents("php://input"), true);    
    $columns = implode(", ",array_keys($data));
    $escaped_values = array_map('mysql_real_escape_string', array_values($data));
    $values  = implode(", ", $escaped_values);
    var_dump($escaped_values);
    $sql = "INSERT INTO evaluations VALUES ($values)";
    Résultat, mon var_dump de $escaped_values m'affiche bien les bonnes valeurs à insérer dans ma requête SQL.

    Mais mon dernier problème à rêgler est que j'ai une colonne vide à insérer dans $value en premier, ou dans la requête SQL en premiere valeur à insérer.

    Il fallait écrire true à la première ligne pour spécifier que le json_decode doit retourner un array.

    Pour que ça marche, il faudrait que je puisse faire un "PUSH()" dans $values au premier rang, mais un PUSH d'une valeur NULL ou VIDE !! C'est hard !

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    En enlevant ce qui ne sert pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $data = json_decode(file_get_contents("php://input"), true);    
    $escaped_values = array_map('mysql_real_escape_string', $data);
    $values  = implode(", ", $escaped_values);
    $sql = "INSERT INTO evaluations VALUES ('', $values)";
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $data = json_decode(file_get_contents("php://input"), true);    
    $escaped_values = array_map('mysql_real_escape_string', $data);
    $values  = implode(", ", $escaped_values);
    $sql = "INSERT INTO evaluations VALUES ('', $values)";
    Waouw merci beaucoup ! Je teste ça, et bien sur Le Pdo et la sécurité comme conseillé mercii ! J'espère pouvoir aider d'autres si possible à l'avenir .
    Si ça marche, ça va grandement me simplifier la vie à l'avenir pour les backs end PHP (Plus rien à écrire !!)!

  8. #8
    Invité
    Invité(e)
    Par défaut
    Mince j'ai essayé ça, cela devrait marcher mais pourtant toujours rien ne s'ecrit dans Mysql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $columns = implode(",",array_keys($data));
    var_dump($columns);
    $escaped_values = array_map('intval', array_values($data));
    $values  = implode(",", $escaped_values);
    var_dump($escaped_values);
    $sql = "INSERT INTO evaluations (idevaluation,".$columns.") VALUES (null,".$values.")";
    Mes colonnes ne sont pas dans l'ordre dans $columns, mais je me dit que ca devrait marcher quand même tant que cela correspond à l'ordre de $values,ce qui est le cas... Je sêche :
    http://stackoverflow.com/questions/1...ent-are-not-in

    J'ai fait un echo de ma requête sql et j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO evaluations (idevaluation,noteglobale,service,ambiance,attente,caisses,cuisines,toilettes,idintervenant,idresto) VALUES (null,1,1,1,1,1,1,1,3,2)
    ARGHHH : Edit : Normal j'avais nommé ma requête sql $sql au lieu de l'appeller $q , oui ça marche maintenant ! Niquel !

    Voici le code définitif qui fonctionne et qui génére une requête sql à partir de la réception de données JSON du front end :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    /*Function qui insère les notes d un resto: */
     function insert_evaluation() {  
     
    /* Récupération des données POST */
     $data = json_decode(file_get_contents("php://input"), true);
     
    /* Traitement des données pour les mettre dans la requête INSERT - Séparation en noms de colonnes(strings) et en valeurs(int) */    
    $columns = implode(",",array_keys($data));
     
    $escaped_values = array_map('intval', array_values($data));
    $values  = implode(",", $escaped_values);
     
     
    /* SQL. */
    $q = "INSERT INTO evaluations (idevaluation,".$columns.") VALUES (null,".$values.")";
     
    $qry = mysql_query($q);
     
     if ($qry) {
            $arr = array('msg' => "Impression enregistree avec succès!!!", 'error' => '');
            $jsn = json_encode($arr);
            // print_r($jsn);
        } else {
            $arr = array('msg' => "", 'error' => 'Erreur dans la mise à jour de l enregistrement');
            $jsn = json_encode($arr);
            // print_r($jsn);
        }
        exit();  
     
    }
    Reste à le faire aussi sur un update mais pas sur que cela soit possible !
    Plus rien à écrire ! J'adore !
    Dernière modification par Invité ; 02/08/2016 à 23h31.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour, au cas ou cela intéresse quelqu'un, j'ai rendu ma requête UPDATE dynamique comme ceci (JSON TO PHP MYSQL), du coup je n'ai plus besoin d'écrire les noms des colonnes dans la requête update, la boucle for le fait pour moi.
    Et il faut voir aussi que c'est auto adaptatif et dynamique en fonction des données reçues.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /*Function qui maj les notes d un resto: */
     function maj_evaluation() {  
     
    	/* Récupération des données POST POUR USAGE IMMEDIAT AVEC SYNTAXE DU STYLE $dataFull->idevaluation  */
    	 $dataFull = json_decode(file_get_contents("php://input"));
     
    	/* Récupération des données POST POUR MANIPULATION PHP*/
    	$data = json_decode(file_get_contents("php://input"), true);    
     
    	 /* CONVERSION DES DONNES EN TABLEAUX PHP POUR INSERTION DYNAMIQUE DANS LA BOUCLE FOR  */
    	$columns = array_map('strval',array_keys($data));
    	$escaped_values = array_map('intval', array_values($data));
     
     
    	/* Oblige de supprimer idevaluation des arrays parce que il ne peux pas être mis a jour dans un update cest la clef primaire. */
    	array_shift($columns);
    	array_shift($escaped_values);
     
    	for($i=0;$i<sizeof($columns);$i++){
    		$q = "UPDATE test.evaluations SET ".$columns[$i]." = ".$escaped_values[$i]." WHERE  idevaluation=".$dataFull->idevaluation." ";
    		$qry = mysql_query($q);
    		echo($q); 
    		if ($qry) {
    			$arr = array('msg' => "Impression enregistree avec succès!!!", 'error' => '');
    			$jsn = json_encode($arr);
    			print_r($jsn);
    		} else {
    			$arr = array('msg' => "", 'error' => 'Erreur dans la mise à jour de l enregistrement');
    			$jsn = json_encode($arr);
    			print_r($jsn);
    		}        
    	}
    }

    Alors qu'avant, je devais écrire tous les noms des colonnes, trop lourdingue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* $q = "UPDATE test.evaluations SET noteglobale='".$data->noteglobale."',service='".$data->service."',ambiance='".$data->ambiance."',attente='".$data->attente."',caisses='".$data->caisses."',cuisines='".$data->cuisines."',toilettes='".$data->toilettes."' WHERE  idevaluation='".$data->idevaluation."' "; 
     
    $qry = mysql_query($q); */

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Problème de requête d'insertion dans une base SAGE
    Par Swapyyy dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/07/2008, 10h14
  2. Problème dans une requête d'insertion
    Par celica dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 19/09/2007, 15h28
  3. Optimiser une requête mysql
    Par Raideman dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/09/2007, 21h18
  4. Requête d'insertion dans une base ACCESS
    Par kurul1 dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/11/2006, 17h41
  5. Optimisation d'une requête d'insertion
    Par fdraven dans le forum Oracle
    Réponses: 15
    Dernier message: 01/12/2005, 14h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo