par
caroube » 22 mai 2008, 18:45
Oui, ça pourrait ressembler à ça. Mais il faut aller un peu plus loin.
Tout tes objets utilisent la même connexion : imagine que tu crées un objet 1, un objet 2, puis que tu détruises l'objet 2 et que tu essayes de faire une requête avec l'objet 1 : la connexion est fermée et donc ... erreur
Il faut donc que chaque objet soit indépendant et que tu utilises la possiblilté d'avoir plusieurs connexions. Quelque chose comme :
class dbquery {
protected $link;
function __construct() {
$this->link = mysql_connect($this->config['host'],
$this->config['user'],
$this->config['pass']);
mysql_select_db($this->config['dbname'], $this->link);
//Idem utilisation de link dans le query et dans le close
}
Deuxième point : non aux constantes dans la classe, du moins à ce niveau le plus bas. Ton objet doit être capable de se connecter à n'importe quelle base de données MySQL (qui te dit que tu n'auras pas un jour un besoin de transférer des données d'une base vers une autre).
Donc là, deux solutions :
1) Quand tu crées l'objet, tu lui passes les paramètres de connexion
2) Tu utilises l'héritage : la connexion à la base test_admin est bien une sorte de connexion à une base de données et donc tu crées un objet dbquery_test_admin qui étend dbquery avec juste les variables de connexion positionnées (toutes les méthodes étant définies au niveau de l'objet générique). Mais c'est quand même très limite : une voiture rouge est bien une sorte de voiture, mais on préfèrera quand même instancier un objet voiture en positionnant la variable couleur.
Enfin, faire de l'objet c'est bien beau, mais si c'est juste pour faire la même chose qu'en procédural classique, cela ne sert pas à grand chose. Je sais bien que la bibliothèque Pear:DB n'est plus maintenue (
http://pear.php.net/manual/en/package.database.db.php) mais tu peux t'inspirer d'elle si tu veux créer ta propre classe. Crée une méthode pour exécuter des requêtes "sans réponse" (type insert), une méthode pour exécuter des requêtes qui renvoie une seule valeur, une méthode pour exécuter des requêtes en récupérant les valeurs sous forme de tableau associatif, une méthode pour exécuter des requêtes en récupérant les valeurs sous forme d'un XML, ...
Même si à l'intérieur de l'objet, c'est la même chose (un mysql_query), ça fait plus propre dans ton code d'avoir des noms de méthodes explicites :
mydbquery->query ("insert ...");
$max = mydbquery->getRow ("select max(jour) from evenement");
$tableau = mydbquery->getAll ("select * from evenement");
Oui, ça pourrait ressembler à ça. Mais il faut aller un peu plus loin.
Tout tes objets utilisent la même connexion : imagine que tu crées un objet 1, un objet 2, puis que tu détruises l'objet 2 et que tu essayes de faire une requête avec l'objet 1 : la connexion est fermée et donc ... erreur
Il faut donc que chaque objet soit indépendant et que tu utilises la possiblilté d'avoir plusieurs connexions. Quelque chose comme :
[php]
class dbquery {
protected $link;
function __construct() {
$this->link = mysql_connect($this->config['host'],
$this->config['user'],
$this->config['pass']);
mysql_select_db($this->config['dbname'], $this->link);
//Idem utilisation de link dans le query et dans le close
}
[/php]
Deuxième point : non aux constantes dans la classe, du moins à ce niveau le plus bas. Ton objet doit être capable de se connecter à n'importe quelle base de données MySQL (qui te dit que tu n'auras pas un jour un besoin de transférer des données d'une base vers une autre).
Donc là, deux solutions :
1) Quand tu crées l'objet, tu lui passes les paramètres de connexion
2) Tu utilises l'héritage : la connexion à la base test_admin est bien une sorte de connexion à une base de données et donc tu crées un objet dbquery_test_admin qui étend dbquery avec juste les variables de connexion positionnées (toutes les méthodes étant définies au niveau de l'objet générique). Mais c'est quand même très limite : une voiture rouge est bien une sorte de voiture, mais on préfèrera quand même instancier un objet voiture en positionnant la variable couleur.
Enfin, faire de l'objet c'est bien beau, mais si c'est juste pour faire la même chose qu'en procédural classique, cela ne sert pas à grand chose. Je sais bien que la bibliothèque Pear:DB n'est plus maintenue ([url]http://pear.php.net/manual/en/package.database.db.php[/url]) mais tu peux t'inspirer d'elle si tu veux créer ta propre classe. Crée une méthode pour exécuter des requêtes "sans réponse" (type insert), une méthode pour exécuter des requêtes qui renvoie une seule valeur, une méthode pour exécuter des requêtes en récupérant les valeurs sous forme de tableau associatif, une méthode pour exécuter des requêtes en récupérant les valeurs sous forme d'un XML, ...
Même si à l'intérieur de l'objet, c'est la même chose (un mysql_query), ça fait plus propre dans ton code d'avoir des noms de méthodes explicites :
[php]
mydbquery->query ("insert ...");
$max = mydbquery->getRow ("select max(jour) from evenement");
$tableau = mydbquery->getAll ("select * from evenement");
[/php]