Error: Call to a member function prepare() on null

Par Le_Normand, il y a 6 ans


Bonjour,

Voila je rencontre un petit problème avec mon code. Cela fait quelque temps que je bloque sur cette erreur, et je n'arrive pas à comprendre d'où elle provient.
Je cherche à savoir si un email existe déjà dans ma bdd lors de l'inscription d'un utilisateur.

Mon erreur : https://www.zupimages.net/up/19/48/3jez.png
Mon arborécence : https://zupimages.net/up/19/48/sxlq.png
Mon code "/signup/index.php" : https://pastebin.com/qaADcDKt
Mon code "/config/includes/bdd/prepare.php" : https://pastebin.com/pqkbm8ks
Mon code "/config/includes/bdd/database.php" : https://pastebin.com/qYuFk40G

Merci d'avance pour votre aide.

22 réponses

Carouge10, il y a 6 ans

bonjour.
il te manque le return $this->pdo dans la fonction getpdo

Le_Normand, il y a 6 ans

Je les mit try

Le_Normand, il y a 6 ans

Et cela ne change rien

Carouge10, il y a 6 ans

poste nous ici avec le bouton </ > le code que tu as modifié

Le_Normand, il y a 6 ans

Je nai rien modifier etant donner que ce que tu me demande est deja present ou sinon je ne vois pas ou veut tu le mettre ?

Carouge10, il y a 6 ans

bah je ne vois aucun return dans la fonction

Le_Normand, il y a 6 ans

Je ne vois pas comment veut tu qur je le place ?

Ludo46, il y a 6 ans

Bonjour,

Ton code :

private function getPDO() { try { if($this->pdo == null){ $user = 'user_xxx'; $password = 'xxxx'; $pdo = new PDO('mysql:host=' . $this->tokenAuth['host'] . ';dbname=' . $this->tokenAuth['dbname'] . ';charset=UTF8', $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo = $pdo; } } catch (PDOException $e) { echo 'Connexion bdd = false <br/>Raison = '; die('Erreur : ' .$e->getMessage()); } }

La modification que @Carouge10 te propose ...

private function getPDO() { try { if($this->pdo == null){ $user = 'user_xxx'; $password = 'xxxx'; $pdo = new PDO('mysql:host=' . $this->tokenAuth['host'] . ';dbname=' . $this->tokenAuth['dbname'] . ';charset=UTF8', $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo = $pdo; } return $this->pdo; } catch (PDOException $e) { echo 'Connexion bdd = false <br/>Raison = '; die('Erreur : ' .$e->getMessage()); } }
Le_Normand, il y a 6 ans

Ahh d'accord. Mercii

Fortes Armando, il y a 6 ans

Bonjour
Ton code

/** * Connexion à la base de données. */ private function getPDO() { try { if($this->pdo == null){ $user = 'user_xxx'; $password = 'xxxx'; $pdo = new PDO('mysql:host=' . $this->tokenAuth['host'] . ';dbname=' . $this->tokenAuth['dbname'] . ';charset=UTF8', $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo = $pdo; } } catch (PDOException $e) { echo 'Connexion bdd = false <br/>Raison = '; die('Erreur : ' .$e->getMessage()); } } /** * Appel de la BDD */ public function BDD() { $this->getPDO(); }

la correction

/** * Connexion à la base de données. */ private function getPDO() { try { if($this->pdo == null){ $user = 'user_xxx'; $password = 'xxxx'; $pdo = new PDO('mysql:host=' . $this->tokenAuth['host'] . ';dbname=' . $this->tokenAuth['dbname'] . ';charset=UTF8', $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo = $pdo; } // ajoute cette ligne return $this->pdo; } catch (PDOException $e) { echo 'Connexion bdd = false <br/>Raison = '; die('Erreur : ' .$e->getMessage()); } } /** * Appel de la BDD */ public function BDD() { // ajoute return comme ceci return $this->getPDO(); }

Merci

Le_Normand, il y a 6 ans

Bonsoir,

Cela fonctionne, maintenant j'ai cette erreur :

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ''users' WHERE 'user_email' = 'contact@ben27.ga'' à la ligne 1 in F:\wamp64\www\ben27\config\includes\bdd\prepare.php on line 21

et

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ''users' WHERE 'user_email' = 'contact@ben27.ga'' à la ligne 1 in F:\wamp64\www\ben27\config\includes\bdd\prepare.php on line 21

mon fichier prepare maintenant donne sa :

<?php require_once('../config/includes/bdd/database.php'); /** * Requête à la base de données. */ function prepare($statement, $values) { $database = new Database(); $bdd = $database->BDD(); $request = $bdd->prepare($statement); $request->execute($values); return $request; } function countDatabaseValue($key, $value) { $database = new Database(); $bdd = $database->BDD(); $request = $bdd->prepare("SELECT * FROM 'users' WHERE '$key' = '$value'"); $request->execute(); return $request->rowCount(); } ?>

Merci par avance, j'ai chercher une solution mais cela n'est pas clair et je ne parvient pas à résoudre cette erreur.

Fortes Armando, il y a 6 ans

Bonjour, tu peux essayer avec cette syntaxe. merci

function countDatabaseValue($key, $value) { $database = new Database(); $bdd = $database->BDD(); $request = $bdd->prepare("SELECT * FROM users WHERE {$key} = {$value}"); $request->execute(); return $request->rowCount(); } ?>
Le_Normand, il y a 6 ans

J'ai essayé est sa me fait toujours la meme erreur.

Fortes Armando, il y a 6 ans

Je viens de constater que tu utlise la methode execute deux fois.
Voila la correction que je te propose

function prepare($statement) { $database = new Database(); $bdd = $database->BDD(); $request = $bdd->prepare($statement); // $request->execute($values); return $request; } function countDatabaseValue($key, $value) { $database = new Database(); $bdd = $database->BDD(); $request = $bdd->prepare("SELECT * FROM users WHERE :key = :value"); $request->execute([ 'key' => $key, 'value' => $value ]); return $request->rowCount(); } ?>

Tu supprime la quatrième ligne dans ta fonction prepare. merci

Le_Normand, il y a 6 ans

J'ai fait ce que tu ma dit mais il me met lerreur au niveau de la ligne 23 qui est :

'value' => $value

et c'est dans

$request->execute([ 'key' => $key, 'value' => $value ]);

le code maintenant:

<?php require_once('../config/includes/bdd/database.php'); /** * Requête à la base de données. */ function prepare($statement, $values) { $database = new Database(); $bdd = $database->BDD(); $request = $bdd->prepare($statement); $request->execute($values); return $request; } function countDatabaseValue($key, $value) { $database = new Database(); $bdd = $database->BDD(); $request = $bdd->prepare("SELECT * FROM 'users' WHERE :key = :value;"); $request->execute([ 'key' => $key, 'value' => $value ]); return $request->rowCount(); } ?>
Fortes Armando, il y a 6 ans

Commente cette ligne

$request->execute($values);

dans ta fonction

Le_Normand, il y a 6 ans

et le nom de la table je suis obliger de la mettre entre des quotes pour éviter une erreur comme quoi il ne la trouve pas

Le_Normand, il y a 6 ans

les erreurs sont toujours:

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ''users' WHERE 'user_email' = 'contact@ben27.ga'' à la ligne 1 in F:\wamp64\www\ben27\config\includes\bdd\prepare.php on line 23

et

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de ''users' WHERE 'user_email' = 'contact@ben27.ga'' à la ligne 1 in F:\wamp64\www\ben27\config\includes\bdd\prepare.php on line 23
Fortes Armando, il y a 6 ans

Tu as ajouté un point virgule à la fin de ta requête et tu appel deux fois la fonction excecute sur le PDOStatement.

La correction

<?php require_once('../config/includes/bdd/database.php'); /** * Requête à la base de données. */ function prepare($statement) { $database = new Database(); $bdd = $database->BDD(); $request = $bdd->prepare($statement); return $request; } function countDatabaseValue($key, $value) { $database = new Database(); $bdd = $database->BDD(); $request = $bdd->prepare("SELECT * FROM 'users' WHERE :key = :value"); $request->execute([ 'key' => $key, 'value' => $value ]); return $request->rowCount(); } ?>
Le_Normand, il y a 6 ans

j'ai toujour l'eurreur au niveau de la récup de $value :/

Carouge10, il y a 6 ans

sauf qu'on ne peut pas mettre le nom d'une table/champs en marqueurs. il faut faire une concaténation.

Le_Normand, il y a 6 ans

Oui je suis d'accord mais cest la valeur qui fait une erreur ($valeur)