Bonjour,

Voila je rencontre un petit problème avec mon code php.

suis en cours de developpmen d'un petit projet php mais je rencontré une erreur au niveau de mes class DB et topic1

**class DB**   script pour les objets

public function single(){
                      $this->execute();
                      return $this->stmt->fetch(PDO::FETCH_OBJ);
                  }

**class topic1 **
public function gettopic($id){
   $this->db->query("SELECT  topics.*, users.username, users.avatar   FROM topics

        INNER JOIN users

           ON topics.user_id = users.id

           WHERE topics.id = :id
           ");
       $this->db->bind(':id', $id);

     $row = $this->db->single();

       return  $row;
 }

je voudrais les recuperer comme objet les elements des tables topics et users

Notice: Trying to get property of non-object in C:\xampp\htdocs\talkingespace\template\topic.php on line 23

je vous prie de m'aider svp merci a tous!!!

4 réponses


Lartak
Réponse acceptée

Bonsoir.
Tu devrais débuguer ta variable $row, ça te permettra de comprendre d'où vient ton problème.
Et puis tu devrais vraiment revoir la PDO.

quand je debogue

$row

elle me return

bool(false)

ca ce la class database

<?php 

/**
* database
*/
class DB {

              private $host = DB_HOST;
              private $user = DB_USER;
              private $pass = DB_PASS;
              private $dbname = DB_NAME;

              private $dbh;
              private $error;
              private $stmt;

public  function __construct(){
        // set DSN
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
    //set options 
    $options = array(
                   PDO::ATTR_PERSISTENT => true,
                   PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );
    //create a new PDO instance 

    try{
        $this->dbh = new PDO ($dsn, $this->user, $this->pass, $options);
    }  //catch any errors
    catch (PDOException $e) {
        $this->error = $e->getMessage();
    }

    }
    public function query($query){
        $this->stmt = $this->dbh->prepare($query);
    }

    public function bind($param, $value, $type = null){
        if (is_null($type)) {
            switch (true) {
                case  is_int ($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                $type = PDO::PARAM_NULL;
                default :
                $type = PDO::PARAM_STR;
            }
        }
        $this->stmt->bindValue ($param, $value, $type);
    }

    public function execute(){

                      return $this->stmt->execute();

    }

    public function resultset(){
                      $this->execute();
                      return $this->stmt->fetchAll(PDO::FETCH_OBJ);

    }

    public function single(){
                      $this->execute();
                      return $this->stmt->fetch(PDO::FETCH_OBJ);
                  }

     public function rowCount(){

                      return $this->stmt->rowCount();
     }
     public function lastInsertId(){
                      return $this->dbh->lastInsertId();
     }     

     public function beginTransaction(){
        return $this->dbh->beginTransaction();
     }  
      public function endTransaction(){
         return $this->dbh->commit();
      }
      public function cancelTransaction(){
         return $this->dbh->rollBack();
      }
    }

Houlla je comprend pas trop le soucis

mais je peut te filler un bout de ma class database

<?php

class Database{

    private $dbname;
    private $dbuser;
    private $dbhost;
    private $dbpass;
    private $pdo;

    public function __construct(){

        require_once($_SERVER['DOCUMENT_ROOT']. DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR .'config.php');

        $this->dbhost = DBHOST;
        $this->dbname = DBNAME; 
        $this->dbuser = DBUSER; 
        $this->dbpass = DBPSWD; 

    }

    private function Getpdo(){
        if($this->pdo === null){    
            try{
                $pdo = new PDO("mysql:dbname={$this->dbname};host={$this->dbhost}",$this->dbuser,$this->dbpass,array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); 
                $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);//ou FETCH_ASSOC
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //exception or WARNING
                $this->pdo = $pdo;
            }catch(Exception $e){
                /* echo $e->getMessage(); */
                die('Imopsible de ce connecter a la BDD');    
            }
        }
        return $this->pdo;

    }

    //si besoin on a notre objet pdo
    public function thisPDO(){
        return $this->Getpdo();
    }

    public function Request($statement,$attrs=null,$one = null){

        if($attrs != null){

            $req = $this->getPDO()->prepare($statement);

            $req->execute($attrs);

            if($one === 1){

                return $req->fetch();

            }else{

                return $req->fetchAll();

            }

        }else{

            //si attrs = null return query
            return $this->getPDO()->query($statement); 

        }
        return null;

    }
    }

qui s'utilise comme ça : dans le premier paramette c'est le statement si tu n'a pas d'attribut ça fera un query, si tu un attribut un get id par exemple ça te fera un prepare et le dernier paramete si tu veut tout retourner tu laisse vide, sinon tu met 1 pour un seul résulta.

Les case when break etc... comprend pas trop et pourquoi faire 50 fonction pour une requette ?

ma fonction request te fait tout en un teste avec cette class.