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

Petit nouveau ! | 4 Messages

02 juil. 2020, 23:25

bonjour j'ai ce message d'erreur qui m'empêche de me connecter à ma bdd. Je ne comprend pas.

Code : Tout sélectionner

<?php // class ConnectionBase{ // protected $bdd; // public function __construct(){ // $this->bdd = new PDO('mysql:host=localhost;dbname=pieces_leader;port=3308', 'root', ''); // } // public function getBdd() // { // return $this ->bdd; // } // } /* Connexion à une base MySQL avec l'invocation de pilote */ class ConnectionBase{ protected $bdd; public function __construct() { $dsn = 'mysql:dbname=pieces_leader;host=localhost;port=3308'; $user = 'root'; $password = ''; try { $bdd = new PDO($dsn, $user, $password); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); } catch (PDOException $e) { echo 'Connexion échouée : ' . $e->getMessage(); } finally { $bdd = null; } } public function getBdd() { return $this ->bdd; } } ?> <?php require_once '../App/Services/ConnectionBase.php'; require_once '../App/Model/Product_Model.php'; class ProductServices extends ConnectionBase { public function GetProduct(int $terme) { //recupere la connection venant de ConnectionBase $connect = parent::getBdd(); //dump($connect); $sql="SELECT * FROM `prix`WHERE `Reference` LIKE :ref"; $consult = $connect->prepare($sql); // Prépare la requête SQL en utilisant la BDD $terme = ($terme."%"); // Crée une variable terme qui étend le résultat aux autres concordance $consult -> bindValue(':ref' , $terme, PDO::PARAM_INT); // :ref devient $terme $consult -> execute(); // $consult reçois le résultat de la requête if($sql === false){ echo "\nPDO::errorCode(): ", $connect->errorCode();

Avatar du membre
Mammouth du PHP | 1250 Messages

02 juil. 2020, 23:45

Salut, on ne voit pas si le constructeur est bien appelé mais je suppose que oui, cependant ce dernier définit une variable $bdd mais ne la stocke jamais dans la propriété $bdd de l'objet. Donc $this->bdd est null et donc $connect est null, d'où le message d'erreur.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Petit nouveau ! | 4 Messages

03 juil. 2020, 00:00

Ok, merci de ton aide, oui le constructeur est bien appelé, tu aurais une solution pour résoudre mon problème ? Je galère encore un peu je suis toujours en phase d'apprentissage.

Petit nouveau ! | 4 Messages

03 juil. 2020, 00:27

J'ai mis sa du coup

Code : Tout sélectionner

$this->bdd = new PDO($dsn, $user, $password); $this->bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
mais maintenant j'ai une autre erreur lol
Fatal error: Uncaught Error: Cannot use object of type PDOStatement as array
l'erreur pointe cette ligne :

Code : Tout sélectionner

$product -> setReference($consult['Référence']);

Petit nouveau ! | 4 Messages

03 juil. 2020, 00:29

en gros voici mon code c'est un exercice assez rude mais bon sa me forge lol

Code : Tout sélectionner

//recupere la connection venant de ConnectionBase $connect = parent::getBdd(); //dump($connect); $sql="SELECT * FROM `prix`WHERE `Reference` LIKE :ref"; $consult = $connect->prepare($sql); // Prépare la requête SQL en utilisant la BDD $terme = ($terme."%"); // Crée une variable terme qui étend le résultat aux autres concordance $consult -> bindValue(':ref' , $terme, PDO::PARAM_INT); // :ref devient $terme $consult -> execute(); // $consult reçois le résultat de la requête if($sql === false){ echo "\nPDO::errorCode(): ", $connect->errorCode(); } //création d'un objet Produit appelé $product while ($donnees= $consult-> fetch()) { $product = new Product_Model(); $product -> setDateDuTarif($consult['Date du tarif']); $product -> setReference($consult['Référence']); $product -> setDescription($consult['Description']); $product -> setPrixPublic($consult['Prix public']); $product -> setSousFamille($consult['Sous-famille']); $product -> setCodeSousFamille($consult['Code sous-famille']); $product -> setCodeRemise($consult['Code Remise']); $product -> setEAN($consult['EAN']); $product -> setPoid($consult['Poid']); $tableauproduct[]=$product; } if(!empty($product)){ return $product; } }

Avatar du membre
Mammouth du PHP | 1250 Messages

03 juil. 2020, 01:28

Étonnant que ce ne soit pas sur la ligne du dessus... en tout cas les données de la ligne sont dans $donnees pas dans $consult.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^