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 : 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();
	}
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 : 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);
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 : 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'
		     ));
avec cette classe :

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;
        }
    }
 
 
?>
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