2017-09-20 1 views
-1

Classes simples utilisant oop php, essayant de passer l'objet db (de la classe db) à une autre classe (catégorie category) pour que je puisse obtenir le contenu de db.Passer l'objet db au style php oop ne fonctionne pas

db class db.php

class db { 

    //put your code here 
    private $hostname = "127.0.0.1"; 
    private $dbname = "php_oop_crud"; 
    private $username = "root"; 
    private $password = ""; 
    public $conn; 
    public $status = 0; 

    public function getConnection() { 
     $this->conn = null; 

     try { 

      $this->conn = new PDO("mysql:host:$this->hostname;dbname=$this->dbname", $this->username, $this->password); 
      // this return null if unsccessfull 
      $this->status = $this->conn->getAttribute(PDO::ATTR_CONNECTION_STATUS); 

      if ($this->status) { 
       echo "connected to db : " . $this->status; 

       return $this->conn; 
      } 
     } catch (PDOException $ex) { 
      echo "Can't connect to db " . $this->status; 
      error_log("Ayman :: {{$ex->getMessage()}} - {{$ex->getFile()}} - {{$ex->getLine()}}"); 
      return $this->conn; 
     } 
    } 

} 

pass db object to category class in index.php

// Create db connection pass it to product and category objects 
$databaseConn = new db(); 
$db = $databaseConn->getConnection(); 


// create object and send database object to class 
// now we need to call the function who crearte tha actual connection getConnection(); 

$category= new category($db); 

$category->read(); 

category class category.php

<?php 

class category { 

    //put your code here 
    private $databaseConn; 
    private $tabel_name = 'categories'; 

    public $id; 
    public $name; 

    public function __construct($db) { 
     $this->databaseConn = $db; 
    } 


    public function read() { 

     $sql = 'SELECT * FROM categories'; 
     $query = $this->databaseConn->prepare($sql); 
     $isok = $query->execute(); 
     $row= $query->rowCount(); 

     echo "row : " . $row; 
     var_dump($row); 

     echo "isok : " . $isok; 
     var_dump($isok); 


     if ($isok) { 
      echo "the red process is done and ok <br/> category table"; 
     } else { 
      echo "Cant get category "; 
      var_dump($isok); 
     } 


    } 

} 

Now the var_dump($row) and var_dump($isok); are always false , mean while I can connect successfully to db enter image description here

+0

false' 'execute()' 'de retour quand il y a une erreur. Ajoutez ceci après l'exécution: 'var_dump ($ isok-> errorInfo());' pour en savoir plus. – ishegg

+0

@ishegg ($ isok) sera toujours booléen, donc si vous avez ce que vous suggérez l'erreur sera "Erreur fatale: Erreur non détectée: Appel à une fonction membre errorInfo() sur booléen" – Mvrk

+0

Vous avez raison, je voulais dire " var_dump ($ query-> errorInfo()); ' – ishegg

Répondre

-1

Crédit pour @ishegg, soyez prudent lorsque vous construisez votre AOP.

// cela ne fonctionnera pas

$this->conn = new PDO("mysql:host:$this->hostname;dbname=$this->dbname", $this->username, $this->password); 

// cela fonctionnera

$this->conn = new PDO("mysql:host=".$this->hostname.";dbname=".$this->dbname, $this->username, $this->password); 

enter image description here

+2

Pour clarifier: le problème n'était pas la façon dont vous concaténiez les variables, mais le ':' mal placé au lieu de '='. Cela aurait aussi bien fonctionné: '$ this-> conn = new PDO (" mysql: host = $ this-> hostname; nombd = $ this-> nombd ", $ this-> nom d'utilisateur, $ this-> mot de passe) ". Je l'ai fait comme ça parce que c'est plus clair. – ishegg