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

Résolu
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 - Modifié le 23 janv. 2019 à 12:09
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 - 24 janv. 2019 à 11:05
Bonjour à tous,

J'ai besoin de votre aide pour resoudre une erreur qui ne rend vraiment fou.

Mon API se connecter à une db SQL Server comme suit (fichier config/db.php):
<?php 
 class sql { 
  private $connexion_sql;
  function __construct() { 
   $this->connexion_bdd = new PDO('sqlsrv:Server=servername;Database=db_name', 'username', 'password');
   // Fixe les options d'erreur (ici nous utiliserons les exceptions)
   $this->connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  }
   
  public function requete($requete) { 
   $prepare = $this->connexion_bdd->prepare($requete); $prepare->execute();
   return $prepare;
  }
 }
 
 
?>


J'ai ensuite créé une classe de ma table fruit(objects/fruits.php):
<?php
 class Fruit{
 
  // database connection and table name
  private $conn;
  private $table_name = "tFruits";
  
  // object properties
  public $id;
  public $name;
  
  // constructor with $db as database connection
  public function __construct($db){
   $this->conn = $db;
  }
  
  // read products
  function read(){
   
   // select all query
   $query = "SELECT * FROM " . $this->table_name . " ORDER BY name ASC";
   
   // prepare query statement
   $stmt = $this->conn->prepare($query);
   
   // execute query
   $stmt->execute();
   
   return $stmt;
  }
 }
?>


Pour lire les fruits j'ai fait ceci (fruit/read.php) :
<?php
 // include database and object files
 include_once '../config/db.php';
 include_once '../objects/fruits.php';
 
 $sql = new sql();
 $db = $sql->__construct();
 
 //$req = $sql->requete('SELECT * FROM tFruits'); 
 //while ($r = $req->fetch()) { 
 /// print_r($r); 
 //}
 
 
 
 //$statement = 'SELECT * FROM tFruits';
 //$sth = $sql->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
 //$num = $sth->rowCount();
 //$sth->execute();
 
 $fruit = new Fruit($db);
 // query fruits
 $stmt = $fruit->read();
 $num = $stmt->rowCount();
 
 if($num>0){
  
  // fruits array
  $fruits_arr=array();
  $fruits_arr["records"]=array();
  
  while ($row = $stmt->fetchAll(PDO::FETCH_ASSOC)){ 
   
   extract($row);
   
   $fruit_item=array(
    "id" => $id,
    "name" => $name
   );
  
   array_push($fruits_arr["records"], $fruit_item);
  }
  
  // set response code - 200 OK
  http_response_code(200);
  
  // show fruits data in json format
  echo json_encode($fruits_arr);
 }
 
 else{
 
  // set response code - 404 Not found
  http_response_code(404);
  
  // tell the user no products found
  echo json_encode(
   array("message" => "No fruits found.")
  );
 }
?>


lorsque je lance le fichier read.php dans u interpretur de json, j'obtiens l'erreur suivante:
Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\....\objects\fruits.php on line 24


Cette ligne 24 du fichier fruits.php correspondau code suivant:
$stmt = $this->conn->prepare($query);


Fraichement je n'y comprends rien...

Alors, SVP j'ai besoin d'un coup de pousse.

Merci d'avance

EDIT : Correction des balises de code (ajout du langage )
A voir également:

5 réponses

lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 1
24 janv. 2019 à 01:23
Wahou, merci de me montrer cette autre facette du php. ça montre tout son charme.. lol

On a l'erreur suivante :
 Error: Cannot use object of type PDOStatement as array in ...\config\dbase.php on line 34


Cette ligne correspond a :
return  empty($prep['ERROR']) ? $prep->fetchAll() : $prep['ERROR'];
1
jordane45 Messages postés 38124 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 avril 2024 344
24 janv. 2019 à 09:12
Ouppsssss.. en effet.

Change le ficher comme ceci :
class Database { 
  
  protected $connexion_bdd;
    
  function __construct() { 
      try{
        $this->connexion_bdd = new PDO('sqlsrv:Server=DATA-SERVER\CHATBOTSERVER;Database=chatbotdb', 'sa', 'Germain09');
        //  Fixe les options d'erreur (ici nous utiliserons les exceptions)
        $this->connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      } catch(PDOException $e) {
          die('Erreur : ' . $e->getMessage());
      }
  }
  
    
  private function requete($requete,$datas=NULL) { 
      try{
        $prepare = $this->connexion_bdd->prepare($requete); 
        $prepare->execute($datas);
        return $prepare;
      }catch(Exception $e){
        // en cas d'erreur :
         print_r (array('ERROR'=>" Erreur ! ".$e->getMessage(),'SQL'=>$requete, 'datas'=>$datas);
         exit();
      }
  }
    
    /**
    * Retourne tous les enregistrements d'une requête SELECT
    */
    public function db_All($sql,$datas=NULL){
      $prep = $this->requete($sql,$datas);
      return  $prep->fetchAll() ;
    }
    
    /**
    * Retourne le premier enregistrements d'une requête SELECT
    */
    public function db_One($sql,$datas=NULL){
      $prep = $this->requete($sql,$datas);
      return  $prep->fetch();
    }
    
    /**
    * Permet d'exécuter n'importe quel type de requête
    * A utiliser pour autre chose que les selects...
    */
    public function db_exec($sql,$datas=NULL){
      return $this->requete($sql,$datas);
    }

 }
 
?>
0
Rejoignez-nous