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!!!
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.
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.