Page 1 sur 1

Classes database

Posté : 02 févr. 2011, 00:31
par labyelo
Bonjour,

Je me crée une classe qui devrait me permettre de créer des requête plus facilement et j'aimerais savoir si ma méthode est correcte.
Voici mon code:
class DB
 {

        protected $select;


			public function __toString()
			{
				$this->tostring  = "<p><b><u>Cette classe permet la création de requêtes (SELECT, UPDATE, DELETE).</u></b></p>";
				$this->tostring .= "<p>Utilisation.</p>";
				$this->tostring .= "<li>SELECT</li>";
				$this->tostring .= "<ul><li><b>db_select</b>(debug, champs, table, where, and, group, order) : appel la fonction</li>";
				$this->tostring .= "<li><b>debug :</b> == false 'permet d'afficher la requête</li>";
				$this->tostring .= "<li><b>champs :</b> indique les champs à utiliser</li>";
				$this->tostring .= "<li><b>table :</b> indique la table à utiliser</li>";
				$this->tostring .= "<li><b>where :</b> permet d'indiquer une condition</li>";
				$this->tostring .= "<li><b>and :</b> permet d'indiquer une condition</li>";
				$this->tostring .= "<li><b>group :</b>GROUP BY</li>";
				$this->tostring .= "<li><b>order :</b>ORDER BY</li></ul>";


				return $this->tostring;
			}


			public function db_select($debug, $champs, $table, $where, $and, $group, $order)
			{

				$this->table = $table;                                //- Choix de la table.
				$this->champ = $champs;                               //- Choix des champs de la table.
				$this->where = (( $where === true) ? NULL : $where ); //- En cas de clause WHERE.
				$this->and   = (( $and   === true) ? NULL : $and );   //- En cas de clause AND.
				$this->group = (( $group === true) ? NULL : $group ); //- En cas de GROUP BY.
				$this->order = (( $order === true) ? NULL : $order ); //- En cas de ORDER BY.

				$stmt = SPDO::getInstance()->prepare("SELECT
				                                       $this->champ
				                                    FROM
				                                       $this->table
				                                    $this->where
				                                    $this->and
				                                    $this->group
				                                    $this->order");

	            $stmt->execute();
	            $this->select = $stmt->fetchAll(PDO::FETCH_OBJ);

                //************DEBUG**************//
                //**Paramètre qui permet d'afficher la requête**//
                $this->debug =  (($debug === false) ?  $stmt->debugDumpParams() : null );

                echo $this->debug;
			}



			public function getSelect()
			{
				return $this->select;
			}

 }
Elle fonctionne correctement mais je ne suis pas certain que la méthode soit bonne
D'avance merci de vos remarques

@+ :)

Re: Classes database

Posté : 02 févr. 2011, 00:43
par xTG
Rien que le fait de ne pouvoir faire que des requêtes préparés n'est pas bon. :)
On ne fait pas ce genre de requête pour tout et n'importe quoi.
Une requête du genre :
SELECT id FROM maTable
ne devrait pas être préparée car elle ne possède aucun paramètre.

Re: Classes database

Posté : 02 févr. 2011, 00:59
par labyelo
Oui effectivement
public function db_select($debug, $champs, $table, $where, $and, $group, $order)
			{

				$this->table = $table;                                //- Choix de la table.
				$this->champ = $champs;                               //- Choix des champs de la table.
				$this->where = (( $where === true) ? NULL : $where ); //- En cas de clause WHERE.
				$this->and   = (( $and   === true) ? NULL : $and );   //- En cas de clause AND.
				$this->group = (( $group === true) ? NULL : $group ); //- En cas de GROUP BY.
				$this->order = (( $order === true) ? NULL : $order ); //- En cas de ORDER BY.


				if($this->where === null)
				{
					$stmt = SPDO::getInstance()->query("SELECT
				                                       		$this->champ
					                                    FROM
					                                        $this->table
					                                    $this->group
					                                    $this->order");
				}
				else
				{
					$stmt = SPDO::getInstance()->prepare("SELECT
					                                         $this->champ
					                                      FROM
					                                         $this->table
					                                      $this->where
					                                      $this->and
					                                      $this->group
					                                      $this->order");

	            }

	            $stmt->execute();
	            $this->select = $stmt->fetchAll(PDO::FETCH_OBJ);

                //************DEBUG**************//
                //**Paramètre qui permet d'afficher la requête**//
                $this->debug =  (($debug === false) ?  $stmt->debugDumpParams() : null );

                echo $this->debug;
			}

Re: Classes database

Posté : 02 févr. 2011, 21:20
par devlop78
Un jour j'ai créé une classe de gestion de requêtes. Pas tout à fait comme ça. En fait, je travaillais sous mysqli, et j'ai tout simplement créer un ... PDO. Depuis, j'utilise PDO ;)

PDO est suffisamment riche pour ne pas nécessiter de le faire ce genre de méthodes (très restrictive). Toutefois, on peut l'étendre pour y ajouter quelques fonctionnalités (par exemple récupérer toutes les lignes dans un tableau pour l'envoyer à la vue).

Par contre, il est très intéressant (voire important) de regrouper tous les codes modèles dans des classes. Une idée est de faire une classe par table. Ainsi, toutes les requêtes sur une table sont regroupées dans une table, ainsi lors d'un changement de la structure de la table, on a pas besoin de courir après les requêtes. Après, quezako des requêtes avec jointures, ça reste à voir. En tout cas, regrouper les codes modèles est aussi important que regrouper les codes vues. C'est un début de respect de la POO et une bonne introduction au MVC ;)

Re: Classes database

Posté : 03 févr. 2011, 08:41
par labyelo
Merci