PDO dans class "Membre"

Résolu/Fermé
MichaelOfCourse Messages postés 87 Date d'inscription jeudi 21 juin 2012 Statut Membre Dernière intervention 2 septembre 2016 - 16 sept. 2013 à 20:22
MichaelOfCourse Messages postés 87 Date d'inscription jeudi 21 juin 2012 Statut Membre Dernière intervention 2 septembre 2016 - 17 sept. 2013 à 22:58
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 lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
17 sept. 2013 à 20:57
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 jeudi 21 juin 2012 Statut Membre Dernière intervention 2 septembre 2016 6
17 sept. 2013 à 21:35
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
17 sept. 2013 à 21:43
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 jeudi 21 juin 2012 Statut Membre Dernière intervention 2 septembre 2016 6
17 sept. 2013 à 21:51
Ah, alors du coup va falloir m'expliquer, tu fais ça comment ? Je comprends pas trop :/
0
Utilisateur anonyme
17 sept. 2013 à 21:58
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 jeudi 21 juin 2012 Statut Membre Dernière intervention 2 septembre 2016 6
17 sept. 2013 à 22:03
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
16 sept. 2013 à 23:40
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 jeudi 21 juin 2012 Statut Membre Dernière intervention 2 septembre 2016 6
17 sept. 2013 à 20:15
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