Réponse acceptée !
Je ne peux pas te réorienter à partir de ce que tu as fait... T'as pas pris la bonne route. Fais demi-tour, et prends à gauche.
Plus sérieusement, le fait que ta classe user étende ta classe connexion, ça me chagrine quelque peu.
Ce sont deux choses différentes qui n'ont rien à voir : la classe connexion sert à gérer l'accès au serveur de base de données. La classe user sert (doit servir) à connecter un membre, à gérer sa session, gérer ses préférences, des trucs comme ça.
En gros, ce sont deux machines différentes qui n'ont rien à voir, si ce n'est que l'une a besoin de l'autre. Mais cela n'implique pas pour autant qu'il faille qu'elle se colle dessus.
Si une classe doit étendre la classe connexion, il faut que ce soit pour faire le même genre de travail : accéder à un serveur de base de données (un autre, ou un avec des caractéristiques bien particulières, ou un d'un autre genre, comme pgSql, etc).
Bon reprenons au début.
La classe connexion présentée dans la doc de PHP n'est là qu'à titre d'illustration. Elle n'est pas complète et ne sert à peu près à rien en l'état. Elle ne fait rien si ce n'est se connecter à la base de données... La belle affaire ! Une fonction fait la même chose en 2 lignes.
D'ailleurs, si elle s'appelle connexion, c'est qu'elle ne sert qu'à illustrer le fonctionnement des méthodes magiques __sleep() et __wakeup() au traver du processus de connexion à un serveur de données.
Pour bien faire, il faudrait qu'elle te permette de gérer l'exécution des requêtes, les erreurs (affichées, exceptions, logguées, etc), permettre la manipulation de résultats en fournissant par exemple un itérateur, etc.
Bon ceci étant posé, je te donne un début de classe exemple, qui est un singleton. Un singleton est une classe que l'on ne peut instancier qu'une seule fois.
class DB_single {
private $instance;
public static function getInstance($host, $user, $password, $dbname) {
if (!isset(self::$instance)) {
self::$instance = new DB_single($host, $user, $password, $dbname);
}
return self::$instance;
}
protected function __construct() {
mysql_connect($host, $user, $password, $dbname);
}
}
Pour instancier la classe :
$DB = DB_single::getInstance('host', 'user', 'pasword', 'dbname');
Cette classe fait la même chose que la classe en question de la doc PHP, hormis le fait que si je linéarise $DB et que je le délinéarise, elle ne restaure pas la connexion.
Sinon, elle t'apporte exactement la même chose en terme de fonctionnalités.
A une différence près : en PHP5, puisque les objets sont TOUJOURS passés par référence (ce n'est pas une copie de l'objet qui est passée en argument, mais un pointeur vers l'objet, qui n'existe donc qu'en un seul exemplaire dans la mémoire de PHP), je peux tout à fait utiliser $DB depuis n'importe quel endroit dans mon script. Y compris depuis une fonction.
La méthode statique getInstance() se charge de renvoyer un pointeur vers le seul objet DB_single existant dans PHP, qui est stocké dans la variable statique $instance. (lire la doc sur les propriétés statiques si besoin pour voir quel est son intérêt).
Si ma classe me permettait de faire autre chose que de me connecter à mon serveur de base de données, je pourrais en avoir besoin dans une méthode d'une autre classe, dans une fonction. Plus exactement, je pourrais avoir besoin d'une instance de cette classe, pas de la classe elle-même.
Par exemple, $DB -> query() pourrait être une méthode qui permet d'exécuter une requête sur la base de données.
Si j'ai besoin de cette méthode dans une méthode de la classe user, c'est très simple :
class useraccount {
private $DB;
public function __construct() {
$this -> DB = DB_single::getInstance('host', 'user', 'password', 'dbname');
}
public function log_in() {
if ($this -> DB -> query('.............')) {
// Patati patata
}
}
}
Mais bon... L'intérêt d'une classe de connexion à un serveur de base de données est essentiellement de permettre l'utilisation de plusieurs types de serveurs (MySQL, PostGreSQL, Oracle, MSSQL, Access, SQLite, etc), et ce, sans jamais changer une seule ligne de code.
Ton code, tel que tu le présente, ne sert pas à grand chose. Que la classe user étende la classe connexion est aberrant : tu vas créer une nouvelle connexion en même temps que la première. Si ton serveur est limité en nombre de connexion simultanées, ça pourrait poser problème.
C'est inutile : lorsque, dans un script, tu te connectes à une base de données, la connexion est active pour tout le script. Tu peux en ouvrir, plusieurs, mais ce n'est intéressant que si elles sont différentes (autre user ou autre serveur, dans une moindre mesure, autre base).
Bon... j'ai écrit une tartine, je ne sais plus trop où je voulais aller. Si ça te permet d'y voir plus clair, c'est déjà ça...
Neige
N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...