Singleton : intérêt et bon fonctionnement ?

cs_eltyty Messages postés 86 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 22 novembre 2011 - 16 août 2009 à 21:10
cs_eltyty Messages postés 86 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 22 novembre 2011 - 17 août 2009 à 00:43
Bonjour,

je suis en train de me mettre sur la notion de singleton afin d'obtenir une seul connexion mais du coup j'ai quelques questions.
Actuellement moi j'ai un seul fichier qui fait une connexion au serveur et un pour les requêtes sql. Donc pour moi chaque utilisateur ne fait qu'une seul connexion au serveur donc je ne sais pas trop si la notion de singleton peu m'être utile...

Donc j'ai essayé de faire un fichier avec la connexion au serveur + les requêtes sql dans le même fichier afin de m'assurer de ne faire qu'une seule connexion afin de limiter le travail du serveur.

Voici ce que j'ai essayer de faire :

<?PHP
class MysqlConnection {
    /**
     * Propriété privée stockant une instance de la classe si MysqlConnection::getInstance() est appelé
     * @var MysqlConnection
     */
  private static $_instance = null;

  private function __construct () {
        //echo 'je suis une instance de MysqlConnection';
self::$instance = mysql_connect(SERVEUR, LOGIN, PASS) OR DIE (header("Location: ".ABS."/erreur.php?erreur=connexion base"));
//mysql_connect("cl2-sql4", "tyty14", "thetytyadmi") OR DIE (header("Location: ".ABS."/erreur.php?erreur=connexion base"));
mysql_select_db(BASE, self::$instance)OR DIE (header("Location: ".ABS."/erreur.php?erreur=base"));
mysql_query("SET NAMES 'utf8'");

}
  /**
     * Méthode implémentant le design pattern MysqlConnectionton
     * @return MysqlConnection
     */
 public static function getInstance() {
if(is_null(self::$_instance)) {
self::$_instance = new MysqlConnection();       
}
return self::$_instance;   
 }
  /**
     * Méthode publique quelconque 
     */
    public function doSomething () {
        echo 'requete';
    }

   public function query($query, $idRequete = 0) {
$this->sql_results[$idRequete] = mysql_query($query);
return (bool)$this->sql_results[$idRequete];
        
    }	
}
$o = MysqlConnection::getInstance ();
$o ->doSomething ();
?>


Par contre j'obtiens : Fatal error: Access to undeclared static property: MysqlConnection::$instance in ..... on line 13



Moralité de l'histoire voici mes questions :
[list]
Quel est mon erreur ?
/list
[list]
Est-ce que le principe de créer un singleton avec la connexion serveur et les requêtes sql est judicieux. Car je trouve que ça permet de mieux organiser mais...
/list
[list]
est-ce que le fait de faire une seule fois la connexion au serveur (à travers un seul fichier qui est appelé une fois par page) est suffisant.
/list
Voilà merci à la personne qui pourra m'apporter ces quelques explicationns. Car je me demande toujours comment je peux faire pour qu'il y ai le moins de connexion possible et pour utiliser au mieux la POO car je vais être amener à utiliser ces modules que je développe : module d'authentification, formulaire de connexion, etc.

Voilà donc merci.

3 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
16 août 2009 à 22:36
Salut,

Mettre la connexion dans un singleton c'est pas tres recommandé.

Il y a n connexions parallèle a une base de données.

Et les bases de données gère des pools de connexions.

Bon dev.
0
cs_eltyty Messages postés 86 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 22 novembre 2011
16 août 2009 à 22:45
donc on ne met pas non plus les requêtes sql par exemple en singleton ??
0
cs_eltyty Messages postés 86 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 22 novembre 2011
17 août 2009 à 00:43
Voilà dans ce cas est-ce que cet exemple est mieux dans ce cas ?

class MysqlConnection {
private static $instance;
private function __construct() {
self::$instance = mysql_connect(SERVEUR, LOGIN, PASS)OR DIE ("Impossible de se connecter au serveur - ".mysql_error());
mysql_select_db(BASE, self::$instance)OR DIE("Impossible de se connecter à la base ".mysql_error());
mysql_query("SET NAMES 'utf8'");
}
   /***************************************************/
   /*                  <SINGLETON>                    				      */
   /***************************************************/	
public static function getInstance() {
if(!isset(self::$instance) || self::$instance == null) {
new MySqlConnection();
}
return self::$instance; 
}
public static function close(){
mysql_close(self::$instance);
}
}

Et au niveau de ma page index :
//connexion
MySqlConnection::getInstance();

Le code html, mes requêtes sql puis :
$o=MySqlConnection::getInstance();
$o->close();

Est-ce mieux sur le principe ?
0
Rejoignez-nous