Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre du Club
    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 : 59
    Points
    59

    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 :
    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 :
    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 du Club
    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 : 59
    Points
    59

    Par défaut

    Bon bah j'ai trouvé la solution, mais je ne sais pas si c'est sécurisé.
    Je fais ceci :

    Code :
    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
    Modérateur
    Avatar de rawsrc
    Homme Profil pro Martin
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 599
    Détails du profil
    Informations personnelles :
    Nom : Homme Martin
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 3 599
    Points : 8 969
    Points
    8 969

    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
    # Dans la Création, tout est permis mais tout n'est pas utile...

  4. #4
    Membre du Club
    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 : 59
    Points
    59

    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 :
    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
    Modérateur
    Avatar de rawsrc
    Homme Profil pro Martin
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 599
    Détails du profil
    Informations personnelles :
    Nom : Homme Martin
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 3 599
    Points : 8 969
    Points
    8 969

    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.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  6. #6
    Membre du Club
    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 : 59
    Points
    59

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •