Problème avec mysql_query après un singleton de connexion

Eléphanteau du PHP | 27 Messages

11 mai 2012, 11:28

Bonjour,
je travaille actuellement sur un projet existant dans lequel je devais insérer un singleton pour la connexion à la base de donnée mysql.
Le problème c'est que de nombreuses fonctions mysql_query sont présentes dans le projet et qu'elles ont 2 paramètres :
$result = mysql_query($query, $dataBase);

Avant l'insertion du singleton $dataBase était défini ainsi :
$dataBase=mysql_connect($hostname, $username, $userpwd);

mais maintenant :
$dataBase=singletonConnexionBD::getInstanceConnexion($hostname, $username, $userpwd);

Le parametre n'est plus valide et l'erreur renvoyée est :
mysql_query() expects parameter 2 to be resource, object given in...

Je voudrais rester au plus près du projet initial mais je n'arrive vraiment pas à trouver de solution...
Pourriez-vous m'aider ?
Merci,
Julie

ViPHP
xTG
ViPHP | 7331 Messages

11 mai 2012, 11:30

Ta fonction getInstanceConnexion() ne doit pas renvoyer son instance d'objet, mais son instance de connexion, à savoir le retour de mysql_connect(). :)

Eléphanteau du PHP | 27 Messages

11 mai 2012, 11:49

Merci !
Je comprends mon erreur maintenant effectivement...
En fait la connexion est faite dans une première fonction connectToDB.
Elle est appelée par le constructeur.
Et c'est dans le getInstanceConnexion que ça ne va plus...
Mais sans instance de classe je ne vois plus comment réorganiser le tout j'avoue...
Il faudrait que je fusionne mes fonctions connectToDB à getInstanceConnexion ?
private function connectToDB($hostname, $username, $userpwd, $dbname, $createBase = FALSE, $configDir="") {
// Open a connection to a MySQL server.
$connection = mysql_connect($hostname, $username, $userpwd);
if ($connection == FALSE) {
displayErrorAndExit('Impossible de se connecter au serveur MySQL : ' . mysql_error());
}
// Select the MySQL database.
$db = mysql_select_db($dbname, $connection);
if ($db == FALSE AND $createBase == TRUE) {
$query = 'CREATE DATABASE ' . $dbname;
if (mysql_query($query, $connection) == FALSE) {
displayErrorAndExit('Impossible de créer la base de donnée : ' . mysql_error());
} else {
// create all database tables
createDbTables($configDir);
$db = mysql_select_db($dbname, $connection);
}
} elseif ($db == FALSE and $createBase == FALSE) {
displayErrorAndExit('Impossible de sélectionner la base de donn�es : ' . mysql_error());
}
return $connection;
}


// Constructeur de la classe Connexion
private function __construct($hostname, $username, $userpwd, $dbname, $createBase = FALSE, $configDir="") {
//Methodes permettant l'acces en ecriture des variables
$this->setHostname($hostname);
$this->setUsername($username);
$this->setUserpwd($userpwd);
$this->setDbname($dbname);
$this->setCreateBase($createBase);
$this->setConfigdir($configDir);
//Tentative de connexion à la base
try {
self::$_id = $this->connectToDB($this->_hostname, $this->_username, $this->_userpwd, $this->_dbname, $this->_createBase, $this->_configDir);
} catch (Exception $e) {
$e->getMessage();
}
}

// Création d'une instance de connexion
public static function getInstanceConnexion($hostname, $username, $userpwd, $dbname, $createBase = FALSE, $configDir="") {
if (!isset(self::$_instanceConnexion)) {
    $c = __CLASS__;
    self::$_instanceConnexion = new $c($hostname, $username, $userpwd, $dbname, $createBase, $configDir);
}
return self::$_instanceConnexion;
}

Eléphanteau du PHP | 27 Messages

11 mai 2012, 11:51

D'ailleurs mes noms de fonctions traduisent ma confusion entre instance d'objet et de connexion... Désolée

ViPHP
xTG
ViPHP | 7331 Messages

11 mai 2012, 11:58

Donc soit tu modifies le retour de ton getInstance() pour qu'il retourne l'instance de connexion et non de l'objet.
Soit tu en as l'utilité et tu te fais une seconde fonction qui retourne l'instance de connexion.
$dataBase=singletonConnexionBD::getInstanceConnexion($hostname, $username, $userpwd)->getConnexionDatabase();

ViPHP
ViPHP | 2577 Messages

11 mai 2012, 12:01

Si ta fonction retournait self::$_id, ca devrait marcher puisque c'est cette zone que contient le résultat de la connexion.

Eléphanteau du PHP | 27 Messages

11 mai 2012, 14:23

Merci beaucoup à vous deux !
Il me reste quelques réglages à faire mais c'est nettement mieux !!!