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 :

Requête preparé dynamique


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 85
    Points : 77
    Points
    77
    Par défaut Requête preparé dynamique
    Bonjour,

    Je voudrai fait une méthode qui effectue un INSERT INTO de manière dynamique.

    J'ai regardé sur google et même ici mais c'est essentiellement sur des SELECT.
    Moi c'est sur un insert et udpate.
    Voici le code qui appel ma méthode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $bdd = bdd::getInstance();
     
                    $valeur = array($nom, $prenom, $sexe, $birth, $mail, $adresse, $zip, $ville, $passDatabase, $newsletter);
     
                    $cles = array("nom", "prenom", "sexe", "birth", "mail", "adresse", "zip", "ville", "pass", "optin");
     
                    $valeurs = array('keys'=>$cles,'values'=>$valeur);
     
                    $table = "users";
     
                    $idInsert = $bdd->insert($valeurs,$table);
    Et voici ma methode

    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
     
    public function insert($array,$table){
     
            $keys       = implode(", ", $array['keys']);
            $values     = implode("', '", $array['values']);
            $values     = "'".$values."'";
     
            $sql = "INSERT INTO $table ($keys) VALUES ($values)";
     
            $req = $this->bdd->prepare($sql);
     
            $req->execute();
     
            return $this->bdd->lastInsertId();
     
        }
    Mais je sais que c'est pas du tout sécurisé, mais je coince au niveau de l'élaboration.
    JE me suis dit, faut bien sur passé par des bindParam mais je ne peux pas changer le (:values) si j'en fais un.
    Vous pouvez me dire mais c'est bon il faut juste casté ou sécurisé $values, mais j'ai pas envie d'avoir des htmlentities de partout et faire de html_entity_decode sur mes pages...

    Alors si quelqu'un à une réponse ou je dois faire à chaque fois mes requête ?

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 85
    Points : 77
    Points
    77
    Par défaut
    Bon bah j'ai trouvé la solution, mais je ne sais pas si c'est sécurisé.
    Je fais ceci :

    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
    public function insert($array,$table){
     
            $keys       = implode(", ", $array['keys']);
            $keys2      = implode(", :", $array['keys']);
            $keys2      = ":".$keys2."";
     
            $sql = "INSERT INTO $table ($keys) VALUES ($keys2)";
     
            $req = $this->bdd->prepare($sql);
     
            $tab = array_combine($array['keys'], $array['values']);
     
            $arrayExecute = array();
     
            foreach($tab as $d => $r){
     
                $arrayExecute[":".$d] = $r;
     
            }
     
            $req->execute($arrayExecute);
     
            //$req->bindParam($keys2, $values);
     
     
            return $this->bdd->lastInsertId();
     
        }
    Si quelqu'un peux me dire si c'est sécurisé ou pas ?

    Merci !

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    ce n'est pas du tout sécurisé :
    - aucune validation des données présentées (quid de la remontées des erreurs ?),
    - les valeurs ne sont pas échappées,
    - aucun contrôle sur l'existence des clés dans la liste des colonnes disponibles

    Sois tu revois ton approche et cela va sacrément se compliquer, soit tu prends une classe qui existe déjà et tu fais avec mais dans tous les cas, tu ne peux utiliser ton code en production.

    bon courage

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 85
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Salut,

    ce n'est pas du tout sécurisé :
    - aucune validation des données présentées (quid de la remontées des erreurs ?),
    - les valeurs ne sont pas échappées,
    - aucun contrôle sur l'existence des clés dans la liste des colonnes disponibles

    Sois tu revois ton approche et cela va sacrément se compliquer, soit tu prends une classe qui existe déjà et tu fais avec mais dans tous les cas, tu ne peux utiliser ton code en production.

    bon courage
    J'ai aucune erreur tout marche niquel avec la dernière solutions que j'ai mise.
    -Donc mon tableau ne permet pas de simulé les :var => $var ?
    - Si puisque c'est en appelant ma méthode que je lui indique les colonnes leur noms.
    Un classe qui existe déjà ? ou puis-je la trouvé ?

    Donc je pense faire dans mes models ceci =>
    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
    public function addUser($nom, $prenom, $sexe, $birth, $mail, $adresse, $zip, $ville, $passDatabase, $newsletter){
     
            $connexion = connexion::getInstance()->getConnexion();
     
            $req = $connexion->prepare("INSERT INTO users (nom, prenom, sexe, birth, mail, adresse, zip, ville, pass, optin) VALUES (:nom, :prenom, :sexe, :birth, :mail, :adresse, :zip, :ville, :pass, :optin)");
     
            $req->bindParam(":nom", $nom, PDO::PARAM_STR);
            $req->bindParam(":prenom", $prenom, PDO::PARAM_STR);
            $req->bindParam(":sexe", $sexe, PDO::PARAM_STR);
            $req->bindParam(":birth", $birth, PDO::PARAM_STR);
            $req->bindParam(":mail", $mail, PDO::PARAM_STR);
            $req->bindParam(":adresse", $adresse, PDO::PARAM_STR);
            $req->bindParam(":zip", $zip, PDO::PARAM_STR);
            $req->bindParam(":ville", $ville, PDO::PARAM_STR);
            $req->bindParam(":pass", $passDatabase, PDO::PARAM_STR);
            $req->bindParam(":optin", $newsletter, PDO::PARAM_STR);
     
            $req->execute();
     
            return $connexion->lastInsertId();
     
     
        }

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    je suis désolé mais je t'ai dit une ânerie quand j'ai écrit que tes données n'étaient pas échappées. Tiens je me tout seul

    Sinon des classes PHP qui gèrent ce qu'on appelle le CRUD (Create Read Update Delete) tu vas en trouver des milliers sur le web.
    Une ferme de codes PHP où il y a de tout (du bon et du moins bon) : http://www.phpclasses.org/
    Et pour le reste, le web est ton ami.

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 85
    Points : 77
    Points
    77
    Par défaut
    Ah oui des class CRUD ok... Je pense faire des méthodes personnalisées pour chaque insert...

    Je préfère un truc sécurisé...

    Merci

Discussions similaires

  1. Requête croisée dynamique
    Par totocasagrandi dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 09/01/2007, 17h56
  2. [SQL2K][TSQL] Curseur : Requête select_statement dynamique
    Par Fred72250 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/09/2006, 22h31
  3. [ODBC] Afficher une requête croisée dynamique dans une page PHP
    Par resterzen dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/08/2006, 16h24
  4. Requête crosé dynamique avec paramètres saisi
    Par tamerlan dans le forum Access
    Réponses: 3
    Dernier message: 23/03/2006, 14h30
  5. requête croisée dynamique
    Par gregius dans le forum Access
    Réponses: 8
    Dernier message: 17/03/2006, 11h24

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