Queqlues questions sur un code de models (interractions avec la bd en POO)
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) :
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 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();
} |
Je pense que ce code est correct et qu'il va me permettre de devoir écrire moins de code.
Par contre, je me pose certaines questions par rapport à ce code :
Code:
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); |
Pour utiliser l'objet "Model" et pour utiliser la méthode add, je dois écrire le code ci-dessus.
Je dois aussi écrire le code qui va créer le tableau "info" qui est passé à la méthode 'add' :
Code:
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'
)); |
avec cette classe :
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
|
<?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;
}
}
?> |
Je trouve que ça fait beaucoup de code et peu d'avantage par rapport à ce que je faisais avant (procédural) ?
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