Bonjour à tous,
Je débute en POO (avec PHP).
Pour débuter, j'ai décidé de m'attaquer au models et donc à l'interraction avec la base de données.
J'ai lu beaucoup de tuto, j'ai regardé beaucoup de vidéo, et j'en suis arrivé à ce résultat (pour l'insertion ou la mise à jour d'une donnée dans ma bd) :
Je pense que ce code est correct et qu'il va me permettre de devoir écrire moins de code.
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 class Model{ public $dbh; public $table; public $id; public function Model(){ try{ $this->dbh = new PDO("mysql:host=localhost;dbname=domabdd","root","mdp"); $this->dbh->exec('SET NAMES utf8'); } catch(Exception $e) { die(print_r("Erreur : ".$e->getMessage())); } } /** * Lit une ligne dans la base de donnée par rapport à l'ID de l'objet * @param $fields Liste des champs à récupérer * **/ public function read($fields=null) { if($fields==null){ $fields = "*"; } $sql = "SELECT $fields FROM ".$this->table." WHERE id=".$this->id; $req = $this->dbh->prepare($sql); $req->execute(); return $req->fetchAll(); } /** * Sauvegarde les donnée passé en paramètre dans la base de donnée * @param $data Donnée à sauvegarder * */ public function save($data, $marqueurs = array()){ if(isset($data["id"]) && !empty($data["id"])){ $sql = "UPDATE ".$this->table." SET "; foreach($data as $k=>$v){ if($k!="id"){ $sql .= "$k=$v,"; } } $sql = substr($sql,0,-1); $sql .= "WHERE id=".$data["id"]; } else{ $sql = "INSERT INTO ".$this->table."("; //unset($data["id"]); foreach($data as $k=>$v){ $sql .= "$k,"; } $sql = substr($sql,0,-1); $sql .=") VALUES ("; foreach($data as $v){ $sql .= "$v,"; } $sql = substr($sql,0,-1); $sql .= ")"; } //echo "ici ". $sql; $req = $this->dbh->prepare($sql); foreach($marqueurs as $key => $info) { //key est l'index (1,2...) qui doit commencer à 1 ! $req->bindParam($key+1, $info["key"], $info["type"]); //echo $info["key"]; //echo $info["type"]; } if(!isset($data["id"])){ //$this->id=PDO::lastInsertId; } else{ $this->id = $data["id"]; } $req->execute(); }
Par contre, je me pose certaines questions par rapport à ce code :
Pour utiliser l'objet "Model" et pour utiliser la méthode add, je dois écrire le code ci-dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $insererPersoC = new Model(); $insererPersoC->table = "personne_de_contact"; $insererPersoC->save(array('ref_Nom'=>'?','ref_Prenom'=>'?','ref_Email'=>'?','ref_Tel'=>'?','ref_GSM'=>'?','ref_FAX'=>'?'),$datas);
Je dois aussi écrire le code qui va créer le tableau "info" qui est passé à la méthode 'add' :
avec cette classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 $donnees = new ParametersInfos(); $datas = $donnees->add(array($ref_Nom_i => 's', // si je mets ceci =>'s' ça veut dire que je passe PDO::PARAM_STR (donc 2) //cela me permet de moins écrire de code //pour un entier, il faudra mettre ceci $_POST['ns']=>PDO::PARAM_INT $ref_Prenom_i => 's', $ref_Email_i => 's', $ref_Tel_i => 's', $ref_GSM_i => 's', $ref_FAX_i =>'s' ));
Je trouve que ça fait beaucoup de code et peu d'avantage par rapport à ce que je faisais avant (procédural) ?
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 <?php class ParametersInfos { function add($parametres) { $info = array(); foreach($parametres as $key=>$value) { //dans la majorité des cas, la key sera "PDO::PARAM_STR" donc 2, si je n'indique pas le type, il prendra 2 par défaut switch($value) { case "s" : $value = PDO::PARAM_STR; break; case "i": $value = PDO::PARAM_INT; break; } $info[] = array('key'=>$key,'type'=>$value); } return $info; } } ?>
1) Pensez-vous que ce code peut être amélioré (afin d'écrire moins de code lors de l'utilisation de l'objet) ?
2) pensez-vous que tout cela est bien protégé contre les injuctions ?
3) Je n'utilise pas de constructeur, d'atributs, d'interface... dans ce code, pensez-vous que cela pourrait améliorer ce code ?
Merci d'avance.
bee
Partager