8791 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

ClR a écrit :
Bonjour,
@Christele : tous les conseils sont les bienvenus, et tu peux ouvrir le débat. Moi je débute alors je suis à l'écoute... Smiley smile

Dans ma caricature, je parlais de CLASS de CLASS de CLASS Smiley eek

Toi n'exagérons pas tu n'est qu'a CLASS de CLASS , mais il te suffit de lire la litanie des erreurs obtenues pour comprendre que si tu as des CLASS a toi c'est parfait,
mais appelles PDO toi même directement ...
Dans la classe Connexion, ton constructeur instancie PDO et dans get instance tu instancie Connexion, joli mélange ^^

En réalité tu n'as pas besoin du constructeur puisque tu étends la classe PDO.

Le code que je t'ai donné plus haut est suffisant pour la gestion de la connexion de PDO via singleton.
Tu peux ajouter ta gestion du temps d'execution dans la fonction singleton.



@Christele
Il est vrai qu'il vaut mieux limiter la hiérarchie des classes (encore que c'est débat sur la factorisation du code). Surtout dans le cas de PDO qui est déjà complet.
Mais le fait que la classe PDO ne soit pas "final" sous-entend que l'équipe de développement de PHP prévoyait lors de l'écriture de PDO que la classe puisse être étendu pour lui ajouter certaines fonctionnalités particulières.

Le problème est donc plus de déterminer dans quel cas il est judicieux d'étendre une classe ou de partir d'une classe indépendante.
La doctrine à ne jamais perdre de vue étant toujours de ne pas réinventer la roue à chaque fois Smiley cligne
@Christele : Peut-être je vais te paraître un peu dure de la feuille mais c'est juste pour être sûre de comprendre : tu veux dire : ne pas faire de classe "extends PDO", ou de ne pas mettre du tout de PDO dans mes classes ?
@moust : je n'avais pas lu ta réponse et je te remercie, comme Christele des précisions apportées. Et oui, je vais essayer avec l'exemple de ta classe.

Merci de votre aide et bon apétit Smiley smile
Modifié par ClR (08 Jul 2011 - 13:00)
Bonjour à tous,
ayant un peu avancé cette classe de connexion, je viens dresser le bilan... Smiley smile
et pour le moment, tout semble coller...

donc un fichier d'index

<?php
//INCLUSIONS environnement de travail
	//CONFIG includes
		define('INCLUDES','includes/');
		set_include_path(get_include_path().PATH_SEPARATOR.INCLUDES);
		
	//CONFIG 
		require_once('config.inc');	
	
	$config['driver'] = DRIVER;
	$config['dbname'] = DBNAME;
	$config['host'] = HOST;
	$config['user'] = USER;
	$config['password'] = PASSWORD;
	$config['dsn'] = $config['driver'] 
					. ':dbname=' . $config['dbname'] 
					. ';host=' . $config['host'];
	
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
		//$connexion = dmde conexion
		$connexion = Connexion::getConnexion($config);
		var_dump($connexion);
		?>


le fichier de config, config.inc, qui contient mes constantes et mes fichiers de classes à inclure avec un spl_autoload

ma classe Connexion

class Connexion
{ 
    private static $_connexion = null; 
	private static $_instance = null;
    //durée d'execution du script
	private static $_startTime;
	private static $_endTime;
	private static $_time; 
	
    private function __construct($pConfig) 
	{
		$config = $pConfig;
		try 
		{ 
			//dbt du script
				self::$_startTime = round(microtime(), "6");
			//connexion
            self::$_connexion = new PDO($config['dsn'],$config['user'],$config['password']);
		} 
        catch (PDOException $e) 
		{ 
            throw new Exception('Erreur de connexion à la base de données ! <br /> Erreur détectée : '.$e->getMessage());
			exit(); 
        } 
    }
    
    public static function getConnexion($pConfig)
	{
        if (is_null(self::$_connexion))
		{
            self::$_instance = new Connexion($pConfig);
        }
		return self::$_connexion;
    }

	public static function getTimeScriptConnexion()
	{
		//calcul du temps d'éxecution du script de connexion BDD en microsecondes
			self::$_time = self::$_endTime - self::$_startTime;
			self::$_time = round(self::$_time, "6");
			
			$timeScript = 
				'<table border="1" cellspacing="0" cellpadding="5">
					<th colspan=2 style="background:#cccccc">Temps du script
					</th>
					<tr> 
						<td style="background:#eeeeee">Début du script
						</td>
						<td>' . self::$_startTime . '
						</td>
					</tr>
					<tr>
						<td style="background:#eeeeee">Fin du script
						</td>
						<td>' . self::$_endTime . '
						</td>
					</tr>
					<tr>
						<td style="background:#eeeeee">Tps d\'éxecution total
						</td>
						<td>' . self::$_time . '
						</td>
					</tr>
				</table>' ;	
			echo $timeScript ;
	}	
		
	//"anti-cloning" (classe Singleton)
	public function __clone()
	{
	}
	/*  2nd type d'"anti-cloning" :
			public function __clone()
			{
			  throw new Exception('ERREUR DE MANIPULATION : Tentative de clônage de la classe Singleton Connexion !');
			}
	*/
	
	//destructeur
	public function __destruct()
	{
		//fin du script
			self::$_endTime = round(microtime(), "6");
		//tps de connexion
			self::getTimeScriptConnexion();
		if (!is_null(self::$_connexion)) 
		{
			self::$_connexion = null;
			echo 'Connexion fermée.';
		}
	}
} 


et ma classe Model, qui gère les demandes de base de données.

class Model 
{
	//propriété nom de la table
	public $table;
	//prefixe
	public $prefId;
	//$id pr delete
	public $id;
	//connexion Database
	protected $_cnx;
	//sql
	private $_sql;
	
	public function __construct($pCnx)
    {
        //vérif param de config
		//var_dump($pCnx);
		$this->_cnx=$pCnx;
    }	
	
	//fction lecture champs BDD
	public function lire($pId,$pChamps="*")
	{
		//champs :  si pas de paramètre = *
		$champs=(is_array($pChamps))? implode(',',$pChamps):$pChamps;
		//prépare la requete
		$this->_sql = 'SELECT '.$champs.' FROM '.$this->table.' WHERE '.$this->prefId.'id='.$pId;
		echo $this->_sql;
		
		try
		{
			//prépare & execute la requete
			$stmt = $this->_cnx->prepare($this->_sql);
			if($stmt->execute())
			{ 
				$infos=$stmt->fetch(PDO::FETCH_ASSOC);
			}
			if ($stmt->rowCount() === 1)
			{
				$this->id = $pId;
				//récupération du tableau des données
				print_r($infos);			
				return $infos;
			}
			else
			{
				return false;
			}
		}
		catch(PDOException $e)
		{
		   echo 'Erreur : '.$e->getMessage();
		   exit();
		}
	}
}

Comme vous le voyez, je suis revenu sur l'extends pdo... mais j'ai un constructeur du coup.
en gros, j'ai essayé de suivre les conseils qui me paraissaient les plus pertinents eut égard à ce que j'essaie de faire, et puis j'ai reprit un peu plus profondément les bases aussi parceque ce n'est pas évident.

Pour le moment, je n'ai fait qu'une fonction lire(), mais je vais approfondir plutôt avec une fonction trouver, sauvegarder, enregistrer ou modifier...

ça a l'air de marcher pas trop mal. Qu'en pensez-vous?
Modifié par ClR (18 Jul 2011 - 16:03)
Pages :