PDO dans class "Membre"

Résolu
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   -  
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, 


je viens tout juste de me mettre à la POO, et j'ai commencé par créer une class "membre", dans cette classe j'ai plusieurs methodes, dont une qui est un constructeur.
J'essaye de récuperer les informations de l'user, mais je reçois l'erreur :

Fatal error: Call to a member function prepare() on a non-object in /home/u967210557/public_html/TrapCraftArena/Membre.class.php on line 17

Je vous montre le code :

public function __construct($pseudoMembre)
{
$infosJoueur = $pdo->prepare('SELECT * FROM users WHERE pseudo = :pseudo');
$infosJoueur->execute(array('pseudo' => $pseudoMembre));
$infosJoueur = $infosJoueur->fetch();
// Définir les variables avec les résultats de la base
$this->pseudo = $infosJoueur['pseudo'];
$this->email = $infosJoueur['email'];
}


Il me dit donct que le fonction prepare est utilisé sur un "non objet" mais je vois pas en quoi $pdo ne serait pas un objet, surtout qu'il marche très bien dans d'autres pages, sans passer par la prog orientée objet...

J'ai besoin de votre aide pour comprendre mon erreur :(

2 réponses

Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
Salut,

La variable $pdo dans ton constructeur est une variable locale (cf. Portée des variables) : essaye un simple var_dump($pdo) au début de ton constructeur pour t'en convaincre.
Il te faut donc l'initialiser.

Bon développpement
1
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
Merci beaucoup, j'ai initialisé la variable $pdo dans ma méthode __construct, ça marche d'un coup beaucoup mieux.

J'étais pas du tout au courant de la portée des variables, mais en effet, c'est bon a savoir :)

Bonne soirée a toi !
0
Utilisateur anonyme
 
Bonsoir

Bien sûr que c'est une variable locale, honte à moi ne ne pas l'avoir remarqué :(
Par contre, je ne partage pas ta conclusion. Qu'entends-tu par l'initialiser ? Recréer une instance à chaque appel du constructeur, et probablement aussi dans chaque fonction où cette variable est utilisée ?
Il me semble beaucoup plus simple et rationnel de traiter $pdo comme la variable globale qu'elle est et de mettre un simple global $pdo; dans les fonctions qui l'utilisent. Je sais, on n'aime pas beaucoup ça les variables globales, mais je crois que c'est un cas ou leur emploi est justifié.
0
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
Ah, alors du coup va falloir m'expliquer, tu fais ça comment ? Je comprends pas trop :/
0
Utilisateur anonyme
 
Tu ajoutes simplement
global $pdo;
au début de chaque fonction (en particulier ton constructeur) qui utilise cette variable.
Comme ça, c'est toujours la même variable qui est utilisée.
Sans ça, en initialisant la variable, je suppose que tu faisais un new PDO : nouvelle connexion au serveur, nouvelle vérification du nom d'utilisateur et du mot de passe etc... à chaque fois. Beaucoup plus de boulot pour le serveur.
0
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
Et je l'ajoute aussi au moment de l'initialisation de $pdo ?

Si c'est pas le cas je comprends pas la logique de php, la variable $pdo est une variable locale, MAIS en disant a une fonction qu'elle peut l'utiliser, elle peut l'utiliser ? O.o

Ou alors j'ai pas tout compris ;)
0
Utilisateur anonyme
 
Bonjour

Si tu es sûr que ton initialisation de $pdo marche bien, c'est sûrement que tu essayes d'instancier un objet de la classe "membre" AVANT d'avoir initialisé $pdo.
0
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
Le problème, c'est que non justement, la premiere chose que je fais sur chacune de mes pages est d'inclure le fichier de connexion a la bdd, donc l'initialisation de $pdo :/
0