Gestion d'un user

Résolu
atchoumen Messages postés 117 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 17 avril 2008 - 17 avril 2008 à 21:38
atchoumen Messages postés 117 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 17 avril 2008 - 17 avril 2008 à 23:02
Bonjour,

J'ai récupere la class de connection sur php.fr http://fr.php.net/manual/fr/language.oop5.magic.php. La connection est nickel et je peux faire des requetes.
Je souhaiterais maintenant créer une nouvelle classe utilisateur dans laquelle je pourrais effectuer des requetes. Ainsi en appelant des fonctions je serais capable de me retourner un boolean pour savoir par exemple si mon user existe dans la base de donnée.

Le hic c'est que je n'arrive pas a faire la liaison entre ma class user et connection.
Si quelqu'un à une idée ou pouvait m'orienter ca serait vraiment génial.

Merci

4 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
17 avril 2008 à 22:49
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...

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
3
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
17 avril 2008 à 21:57
Salut,

Je ne comprends pas bien ce que tu veux faire comme lien exactement ?
Utiliser une classe dans l'autre ?
Si c'est ça, tu peux simplement passer l'instance d'une classe en paramètre au constructeur de la seconde.
Sinon, tu peux utiliser la méthode crados qui consiste à faire appel aux globals. Mais c'est vraiment crade.
Sinon, le plus propre, c'est que ta classe connexion (puisque c'est elle, je suppose, que tu souhaite utiliser dans ta class user) soit un singleton, ou un multiton : elle serait alors appelée via une méthode statique, donc utilisable de partout.
Exemple :

class oUser {
    private $oDB;
    public function __construct() {
       $this -> oDB = DB::getInstance();
    }
}

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
atchoumen Messages postés 117 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 17 avril 2008
17 avril 2008 à 22:14
Salut,

Oui en faite, je voudrais pouvoir créer une fonction dans ma class user qui permet d'aller vérifier l'existance de mon abonnée dans ma base.
Pour l'instant je suis en fase de test est voici ce que j'ai fait

Page contenant ma class user (ma class connection est copié coller de php.net)
class useraccount extends connection{
    protected $identifiant;
    protected $motdepasse; 

    public        function __construct($identifiant,$motdepasse){
        $this->identifiant = $identifiant;
        $this->motdepasse = $motdepasse;
    }
   
    public function login() {
        echo "LOGIN : " . $this->identifiant . " - MDP : " . $this->motdepasse;
    }
}

Dans ma page de test, j'ai le code suivant

$user = new useraccount($_REQUEST['identifiant'],$_REQUEST['motdepasse']);
$user->login();
Cela me renvoi bien les bonnes info saisie dans mon formulaire. (LOGIN: toto - MDP: tata)
Parallelement, j'ai déclaré une nouvelle class connection
$sql = $conn->requete("SELECT * FROM users_account WHERE username='".$_REQUEST['identifiant']."'");
$val = mysql_fetch_object($sql);
echo "rep requete : ".$val->id;
Cela fonctionne aussi et me renvoi bien l'identifiant (1)

Je voudrais donc faire un mélange des deux, mais par contre meme à partir de ton exemple je ne vois pas comment faire !
Pourrais tu me réorienter à partir de ce que j'ai fait ?
Merci pour ton aide
0
atchoumen Messages postés 117 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 17 avril 2008
17 avril 2008 à 23:02
Merci pour ton explication,
je me doutais que mon code était un peu foireux ! en tout cas grace à toi j'y vois plus clair et la connexion dans mon cerveau c'est refaite aléluhia !!!!!
Encore merci ++
0
Rejoignez-nous