Bonsoir,
Je suis un novice avec la POO, elle la j'avoue que j'ai un peu de mal. Je m'explique j'aimerai créer des class pour appeler des champs dans ma base de donnée.
J'ai ma première class php de connexion à la base de donnée avec PDO :
<?php
class DB extends Site{
private $host = 'localhost';
private $username = 'root';
private $password = 'root';
private $database = 'guillaumevallon';
private $db;
public function __construct($host = null, $username = null, $password = null, $database = null){
if($host != null){
$this->host = $host;
$this->username = $username;
$this->password = $password;
$this->database = $database;
}
try{
$this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database, $this->username, $this->password, array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
));
}catch(PDOException $e){
Site::WriteHtmlMessage('danger','Connexion impossible au serveur de base de donnée');
}
}
public function query($sql, $data = array()){
$req = $this->db->prepare($sql);
$req->execute($data);
return $req->fetchAll(PDO::FETCH_OBJ);
return true;
}
}
Ensuite je souhaiterai utiliser ma fonction DB::quai dans une autre class afin de lancer une requête SQL pour récupèrer les champs comme le nom, l'id etc...
ma class :
<?php
class Photos extends DB {
function __construct($Id) {
$photos = $this->DB->query('SELECT * FROM images WHERE OnLIne = 1 AND IdGallery=:id', array('id' => $Id));
}
public function getName() {
echo $images->Name;
}
}
et mon fichier gallery.php :
require 'class/images.class.php';
$Photo = new Photos($_GET'id']);
sauf que évidement, je ne sais absolument pas le faire...
php me donne en info que $this->DB n'est pas un objet...
J'ai cherché pas mal sur internet, mais je ne sais pas comment récupérer les infos de connexion dans mon autre class, et je ne sais pas comment je pourrai récupérer les retour de PDO pour juste faire un
<?= $photos->getName ?>
Merci pour votre éclaircissement ;-)
Salut,
Je sais pas si c'est la meilleur solution mais tu peux toujours passé ton objet DB dans la construction de ta class Photos
$DB = new DB();
$photos = new Photos($DB);
avec une class Photos{
private $db;
function __construct($DB) {
$this->db = $DB;
}
}
Apres tu pourras utiliser ta fonction query dans ta class photos en faisant $DB->query
Peut etre que quelqu'un d'autre te donnera une autre solution.
mais tu peux toujours essayer pour voir :)
En esperant t'avoir aidé :)
Bonne continuation.
Bonsoir et merci pour ta réactivité, j'avais fais quelque chose comme çà, cependant je trouve que c'est pas très propre non ?
Surtout que ça m'oblige à passer $DB et $Id pour récupérer les champs dans la BDD.
edit :
voici les erreurs que j'ai :
Notice: Undefined property: Photos::$DB in /Applications/MAMP/htdocs/WebSite/class/images.class.php on line 8
Fatal error: Call to a member function query() on null in /Applications/MAMP/htdocs/WebSite/class/images.class.php on line 8
Finalement j'ai fais comme tu as dis, cependant comment je récupérer le retour de PDO dans ma fonction getName ?
$this->photo->Name ?
salut,
Je viens de faire sa vite fais je sais pas si sa marche je n'ai pas essayé,
$DB = new DB();
$photos = new Photos($DB);
$galery = $photos->getGalery(1);
$photos->getNames($galery);
class Photos{
private $db;
public function __construct($DB) {
$this->db = $DB;
}
public function getGalery($id){
//ici ta requete en utilisant la fonction query de ton objet DB;
$photos = $this->DB->query('SELECT * FROM images WHERE OnLIne = 1 AND IdGallery=:id', array('id' => $Id));
return $photos;
}
public function getNames($galery){
//ici tu peux parcourir le tableau de resultats que tu as passé, et retourné ce que tu veux.
foreach($galery as $key => $value){
}
}
}
function __construct($Id) {
$photos = $this->DB->query('SELECT * FROM images WHERE OnLIne = 1 AND IdGallery=:id', array('id' => $Id));
}
$this->DB n'existe pas, c'est $this->db ton attribut de la classe DB (et non $this->DB)
function __construct($Id) {
$photos = $this->db->query('SELECT * FROM images WHERE OnLIne = 1 AND IdGallery=:id', array('id' => $Id));
}
Sinon tu dois évidemment appeler le contructeur parent dans ta classe Photo, si tu veux que ton attribut $this->db soit correctement initialisé :
function __construct($Id) {
parent::__construct(); // ici injecter les information de connection, ou alors tu définis par défaut dans la classe parent, du style ...($host = "localhost", ...) à la place de ...($host = null, ...)
$photos = $this->DB->query('SELECT * FROM images WHERE OnLIne = 1 AND IdGallery=:id', array('id' => $Id));
}
Regarde l'exemple ici : http://php.net/manual/fr/language.oop5.decon.php
Vu que ta class hérite de DB, tu peux passer directement par la function query
function __construct($Id) {
parent::__construct();(
$photos = $this->query('SELECT * FROM images WHERE OnLIne = 1 AND IdGallery=:id', array('id' => $Id));
}
;)