Compréhension et transformation en PDO avec Singleton
yukimura27
Messages postés10Date d'inscriptionmardi 13 avril 2010StatutMembreDernière intervention21 février 2011
-
18 févr. 2011 à 18:01
yukimura27
Messages postés10Date d'inscriptionmardi 13 avril 2010StatutMembreDernière intervention21 février 2011
-
21 févr. 2011 à 17:51
Bonjour à tous,
Voila j'ai un problème de compréhension, j'ai repris le code d'une de vos application.
J'aurai aimé que l'on m'explique clairement ce bout de code et surtout que l'on m'aide a le transformer en PDO car a chaque fois que j'ai utilisé un singleton + PDO, j'avais une erreur de type call query() ou prepare () on non objet et la tou marche pour le mieux.
D'ou mes questions :
Pourquoi ça marche ?
Explication lignes par lignes si possible ?
Transformation en PDO ?
Pour qu'elle raison utiliser une classe abstract dans dbfactory ?
Qu'elle est l'utilité de __autoload dans index.php, pourquoi ne pas mettre require_once direct ?
J’espère que quelqu'un aura la gentillesse et la patience de m'expliquer tout ça.
// connection à la base
protected function connect () {
$this->_config['link'] = @mysql_connect($this->_config['host'], $this->_config['user'], $this->_config['passwd']);
if (!$this->_config['link'] ) {
throw new Exception('Erreur lors de la connection vers : '.$this->_config['host'].'.');
}
$this->_config['base'] = @mysql_select_db($this->_config['name'], $this->_config['link']);
if (!$this->_config['base'] ) {
throw new Exception('Erreur lors de l\'ouverture de la base de donnée : '.$this->_config['name'].'.');
unset($this->_config);
}
echo 'connection réussie avec '.__CLASS__;
echo '
';
}
// Fermeture de la base de données au moment de la destruction de la classe.
public function __destruct() {
mysql_close($this->_config['link']);
}
// création d'une requête
public function query ($sql, $desc=NULL) {
$this->query = @mysql_query ($sql, $this->_config['link'] );
if ($this->query) {
return $this->query;
} else {
throw new Exception (mysql_error() );
return false;
}
}
// récupère les résultats dans un tableau associatif
public function fetch_assoc ($query=NULL) {
if (isset($query)) {
$this->query = $query;
}
return mysql_fetch_assoc ($this->query);
}
}
?>
page dbfactory.php:
<?php
abstract class dbfactory {
private static $instance; // Instance courante de la classe
protected $_config; // Paramètres de configuration base de donnée.
protected $query; // Ressource de query
protected $bdd;
// Initialise les variables de connections et active la connection à la base de donnée.
// Constructeur protégé permettant de n'avoir qu'une unique instance de la classe grâce à la méthode singleton
protected function __construct ($host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
if (!is_array($this->default_cfg)) {
throw new Exception('Vous devez remplir les paramètres de la configuration par defaut de votre base de donnée');
}
unset ($this->default_cfg); // Enlève les paramètres par defaut pour éviter toute confusion possible.
$this->connect ();
}
// usinage : permet d'instancier la classe correcte en fonction de la db choisie
public static function factory ($type, $host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
if (class_exists ($type)) {
$className = $type;
return new $className ($host, $user, $passwd, $name);
} else {
throw new Exception ('Pas d\'implémentation disponible pour ' . $type);
}
}
// n'autorise qu'une seule instance de la classe
public static function singleton () {
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// on avertit le développeur qu'il n'a pas le droit de cloner l'objet instancié
public function __clone() {
trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR);
}
// méthodes abstraites
abstract protected function connect();
abstract public function __destruct();
abstract public function query($sql, $desc=NULL);
abstract public function fetch_assoc($query=NULL);
/*
abstract public function num_rows($query=NULL);
abstract public function fetch_row($query=NULL);
abstract public function fetch_array($query=NULL);
abstract public function free();
*/
}
?>
et index.php basic ^^ :
<?php
// on utilise la fonction magique __autoload pour charger automatiquement tous les fichiers de classe lorsqu'un appel est demandé.
function __autoload($class_name) {
require_once ($_SERVER['DOCUMENT_ROOT'].'/CDMEF/CLASSES/'.$class_name . '.php');
}
Je ne pense pas que tu trouvera âme charitable pour faire ça !
Pour qu'elle raison utiliser une classe abstract dans dbfactory ?
- Ce n'est ni plus ni moins une classe normale sauf qu'on ne peut pas l'instancier directement
- Si tu veux l'utiliser tu sera obliger de l'étendre à une autre classe et de définir dans la classe fille les méthodes abstraites qui s'y trouve.
Qu'elle est l'utilité de __autoload dans index.php, pourquoi ne pas mettre require_once direct ?
Ben justement ça t'évite de mettre des require() à chaque fois que tu veux utiliser une classe.
__autoload() se chargera de le faire quand une classe quelconque sera appelé.
yukimura27
Messages postés10Date d'inscriptionmardi 13 avril 2010StatutMembreDernière intervention21 février 2011 21 févr. 2011 à 17:51
Bonjour,
Depuis le temps j'ai réussi a faire tout ce que je demandais moi même ^^.
Pareille pour __autoload() mais merci d'avoir répondu.
J'aurais juste une question, on m'a dit d'utiliser $PDOinstance a la place de ma variable, pour qu'elle raison ???? et aussi j'utiliser une requête préparé pour afficher ma liste de news sans utiliser les Getters et Setters, qu'elle est l’intérêt de les utiliser est ce vraiment mieux ????
Je donne le code de mon singleton pour$PDOinstance:
<?php
class DatabaseConnection
{
/**
* Instance de la class SPDO
*
* @var SPDO
* @access private
* @static
*/
private static $_instance = null;
private $_handle;
private function __construct()
{
try
{
$this->_handle = new PDO("mysql:host=localhost; dbname=cdmef", 'root', '');
$this->_handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo 'Connection established and database';
echo "
";
}
catch (PDOException $e)
{
die('Connection failed or database cannot be selected : ' . $e->getMessage());
}
}
public function __destruct()
{
var_dump($this->_db); // Vérification
if (!is_null($this->_handle))
{
$this->_handle = null;
echo 'Connection closed.';
}
var_dump($this->_db); // Une dernière vérification pour voir si l'objet a été détruit
}
private function __clone()
{
}
public static function getInstance()
{
if (is_null(self::$_instance))
{
self::$_instance = new self();
}
return self::$_instance;
}
public function handle()
{
return $this->_handle;
}
}
?>
et ensuite par exemple dans ma classe Comment.php je l'utilise comme ça