Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/10/2012, 19h37   #1
prims
Nouveau Membre du Club
 
Homme
Inscription : février 2011
Messages : 58
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 58
Points : 28
Points : 28
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 ?
prims est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2012, 22h52   #2
prims
Nouveau Membre du Club
 
Homme
Inscription : février 2011
Messages : 58
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 58
Points : 28
Points : 28
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 !
prims est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2012, 11h59   #3
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 602
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 602
Points : 6 147
Points : 6 147
Envoyer un message via Skype™ à rawsrc
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...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2012, 16h37   #4
prims
Nouveau Membre du Club
 
Homme
Inscription : février 2011
Messages : 58
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 58
Points : 28
Points : 28
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();
 
 
    }
prims est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2012, 10h39   #5
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 602
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 602
Points : 6 147
Points : 6 147
Envoyer un message via Skype™ à rawsrc
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...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2012, 20h36   #6
prims
Nouveau Membre du Club
 
Homme
Inscription : février 2011
Messages : 58
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 58
Points : 28
Points : 28
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
prims est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h47.


 
 
 
 
Partenaires

Hébergement Web