salut,
heu les gars y a quand même un constructeur privé donc $mysql1 = new singletonConnexionBD(); devrait retourner une erreur
ton dernier code n'est pas bon il ne fonctionnera jamais vu que la classe n'est jamais instanciée (et que toute la chose est lancée dans le constructeur).
tu ne permet pas le passage de paramètre à la classe donc tu ne pourra jamais fournir les identifiants / mot de passe.
Ton premier est mieux, effectivement les setter sont inutile et j'ajouterais que le copier collé c'est la mort du développeur. en clair tu as des messages d'erreurs identique quelque soit ce que tu fait (le setter utilisé).
displayErrorAndExit() n'existe pas, c'est définie autre part je suppose ? (general_functions.php ?)
$_id devrait être privée et et non public.
vu que tu utilise php5 pourquoi ne pas utiliser PDO ?
catch (Exception $e) {
$e->getMessage();
}
Inutile car ne fait rien => affiche l'erreur, ou uilise ta fonction perso.
$c = __CLASS__;
self::$_instanceConnexion = new $c($hostname, $username, $userpwd, $dbname, $createBase, $configDir);
heu normalement tu connais le nom de ta classe hein, ça c'est bon pour de l'instanciation à la volée à partir d'une interface (pattern factory par exemple).
J'avais aussi retourné une instance de connexion et un objet de la classe car il y avait du code déjà mis en place ne demandant qu'une connexion et non un objet.
Après ça dépend si tu peux refaire l'appli complète ou pas :d
Perso je préfère avoir un fichier de conf, qui se charge dans la base (ficher XML ou texte) y a surement d'autre possibilité comme utiliser un objet qui gère les fichiers de se style et qui fournit les infos sous une forme ou une autre (un objet ou un tableau).
Les setter / getter sont normalement utilisé pour le "dialogue" de l'objet avec l'extérieur, souvent ce n'est pas utilisé en interne, donc effectivement setter / getter en private moyen bof.
au final je pense que ta classe peux ressembler à ceci :
<?php
//require_once 'general_functions.php';
function displayErrorAndExit($msg){
echo '<p style="border: 1px solid red;">'.$msg.'</p>';
}
function createDbTables(){
$db = singletonConnexionBD::getConnexionDatabase();
mysql_query('create table test1( id int auto_increment primary key, truc text);', $db);
mysql_query('create table test2( id int auto_increment primary key, truc text);', $db);
mysql_query('create table test3( id int auto_increment primary key, truc text);', $db);
mysql_query('create table test4( id int auto_increment primary key, truc text);', $db);
mysql_query('create table test5( id int auto_increment primary key, truc text);', $db);
mysql_query('create table test6( id int auto_increment primary key, truc text);', $db);
mysql_query('create table test7( id int auto_increment primary key, truc text);', $db);
mysql_query('create table test8( id int auto_increment primary key, truc text);', $db);
mysql_query('create table test9( id int auto_increment primary key, truc text);', $db);
mysql_query('create table test10( id int auto_increment primary key, truc text);', $db);
}
class singletonConnexionBD {
// identifiant connexion
private static $_id;
//serveur
private $_hostname = "localhost";
// Login
private $_username = "root";
// Password
private $_userpwd = "cdi2012";
// Nom BD
private $_dbname = "ajeslic_nov";
//
private $_createBase = true;
//
private $_configDir = "";
/**
* Ouverture de la connexion et sélection de la base
* + création de la base et des tables (initilisation quoi)
*/
private function connectToDB() {
// Open a connection to a MySQL server.
self::$_id = mysql_connect($this->_hostname, $this->_username, $this->_userpwd);
if (self::$_id === false) {
displayErrorAndExit('Impossible de se connecter au serveur MySQL : ' . mysql_error());
} else {
// Select the MySQL database
$db = mysql_select_db($this->_dbname, self::$_id );
// la selection de la base n'est pas possible, problème de droit ? ou base inexistante ?
if($db === false){
// on tente de créer la base
if ($this->_createBase === true){
$ret = mysql_query('drop database '. $this->_dbname. ' if exists', self::$_id );
$query = 'CREATE DATABASE ' . $this->_dbname;
$ret = mysql_query($query, self::$_id );
if ($ret === FALSE) {
displayErrorAndExit('Impossible de creer la base de donnees : ' . mysql_error());
} else {
// create all database tables
$db = mysql_select_db($this->_dbname, self::$_id );
if($db === false){
displayErrorAndExit('Grrrrrrrrrrrrooooooooooooosssssssseeeeeeeeeuuuuuuuuuu Erreur : '. mysql_error());
}
else {
createDbTables($this->_configDir);
}
}
}
else {
displayErrorAndExit('Impossible de selectionner la base de donnees : ' . mysql_error());
}
}
}
}
/**
* constructeur, privée car singleton
* Vide car inutile dans ce context (ce n'est pas un objet complet à proprement parler).
*/
private function __construct() {
$this->connectToDB();
}
/**
* Récupérer la connexion MySQL existante
*/
public static function getConnexionDatabase() {
if (is_null(self::$_id)) {
try {
new singletonConnexionBD();
} catch (Exception $e) {
displayErrorAndExit('Grosssssseeeuuuuuuuu errrrreeeeuuurrrrrr : ',$e->getMessage());
}
}
return self::$_id;
}
/**
* Fermeture de la connexion
*/
public static function close() {
if (self::$_id !== null)
mysql_close(self::$_id);
}
/**
* Gestin du clone de la classe
*/
public function __clone() {
trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR);
}
}
// test de la chose !
echo '<pre>';
$db = singletonConnexionBD::getConnexionDatabase();
var_dump($db);
$ret = mysql_query('select version() as v', $db);
$d = mysql_fetch_assoc($ret);
echo 'version : '.$d['v'];
$xxx = singletonConnexionBD::getConnexionDatabase();
var_dump($xxx);
$r = mysql_query("show tables;", $db);
while($data = mysql_fetch_row($r)){
echo $data[0].'<br />';
}
echo '</pre>';
singletonConnexionBD::close();
?>
résultat
Code : Tout sélectionner
resource(3, mysql link)
version : 5.5.27
resource(3, mysql link)
test1
test10
test2
test3
test4
test5
test6
test7
test8
test9
on a toujours la même ressource qui est servie et les requêtes fonctionnes
Problème de ce code ?
si tu colle un close au milieux de tous ça tu risque de ré employer un lien de base qui n'existe plus.
Après pour faire bien il faudrait que toute les requêtes passent par cet objet, de façon à ce qu'en cas de query tu test si la connexion est toujours bonne et relance si besoin.
@+