Bonsoir à tous,
Je suis en train de suivre la suite de Tuto sur les objets fais par notre hote, d'ailleurs, merci ils sont super jusqu'au 15, aprés avec le changement de stratégie, j'ai décroché, donc je ne peux pas donnée un avis jsute..
Reprenons,
Donc je suis en train de faire quelque essaie, mais je coince avec la notion de FETCH_CLASS.
Si j'ai bien compris, en faisant un FETCH_CLASS sur une requete PDO, il est censé mettre en "vrac" les infos collecté dans une classe qui donne un objet de la précédente. Mais bien entendu, je me suis certainement endormis lors du chapitre qui parlait des choses à ne pas oublier et à ne pas faire.
Pourriez vous me dire ce que j'ai loupé.
index.php
<?php
define('PROTECTIONINCLUDE', TRUE);
require($_SERVER["DOCUMENT_ROOT"].'/v6/config/preload.php');require '../FFS2V5/v6/app/Autoloader.php';
Autoloader::register();
$db1 = new Database($dbdns5,$dbuser5,$dbpass5);
$moi=new Pilote;
echo "<pre>";var_dump($moi);echo "</pre>";
$moi=$db1->query ("SELECT * FROM enr_cil_pilots WHERE email = '***@****.fr'","Pilote");
echo "<pre>";var_dump($moi);echo "</pre>";
Autoloader.php
<?php
/**
* class Autoloader
*/
class Autoloader
{
/**
* Enregistre l'autoloader
*/
static function register(){spl_autoload_register(array(__CLASS__, 'autoload'));}
/**
* Inclue le fichier correspondand à la classe appellé
* @param $class string, nom de class appellé
*/
static function autoload($class){
//echo __DIR__ .'/'.$class.'.php';
require __DIR__ .'/'.$class.'.php';
}
}
?>
Database.php
<?php
class Database{
private $db_user;
private $db_pass;
private $db_dns;
private $pdo;
public function __construct($db_dns,$db_user,$db_pass){
$this->db_user=$db_user;
$this->db_pass=$db_pass;
$this->db_dns=$db_dns;
}
private function getPDO(){
if ($this->pdo === null) {
$pdo = new PDO($this->db_dns,$this->db_user , $this->db_pass,
array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo = $pdo;
}
return $this->pdo;
}
public function query($request,$class){
$req=$this->getPDO()->query($request);
$data= $req->fetch(PDO::FETCH_CLASS,$class);
echo $request."===".$class;
return $data;
}
public function prepare($request,$para){
$req=$this->getPDO()->prepare($request);
$req->execute($para);
$data= $req->fetch(PDO::FETCH_CLASS,$class);
return $data;
}
}
Pilote.php
<?php
Class Pilote {
public $id;
public $name;
public $password;
public $email;
public $hach;
}
?>
Si j'utilise un fecth obj normal, pas de soucis, la requete est executé, les donnes sont correcte, mais par contre si je veux utilisé le FETCH_CLASS
voici ce que me répond le site
object(Pilote)#5 (5) {
["id"]=>
NULL
["name"]=>
NULL
["password"]=>
NULL
["email"]=>
NULL
["hach"]=>
NULL
}
SELECT * FROM enr_cil_pilots WHERE email = '****@***.fr'===Pilote
bool(false)
Donc si j'instancie une premier objet, pas de soucis, au var_dump je le vois, si je vérifier ma requete et la classe demandé, c'est cohérant, mais par contre si je dump de nouveaux cet objet, il a été effacé, ce qui est normal, mais il n'a pas été remplie.
Aucun message d'erreur, et je ne sais pas trop quoi chercher.
Pourriez vous m'aider.
Merci d'avance.
Flo
Salut, normal tes attributs de
<?php
Class Pilote {
public $id;
public $name;
public $password;
public $email;
public $hach;
}
?>
sont jamais modifiés, si j'ai bien vu. Je ne vois pas où tu veux en venir :/
Bah ta classe pilote ne fait rien ?
Le but c'est justement qu'elle récupère des informations si j'ai bien suivi ta méthode, il faut donc que tu lui crées des méthodes lui permettant de récupérer les informations voulues ;)
je suis d'accord sur le principe, il faudrait des méthodes get et set, des attributs, mais d’après le tuto de Johnathan http://www.grafikart.fr/formations/programmation-objet-php/tp-database à partir de 20 minutes, ça classe vierge se remplis toute seuls, grâce au fetch_class, après les get et set, je m'en fou, cela reste classique sur de l'objet, mais j'aimerai comprendre pourquoi je n'arrive pas à reproduire la chose, je suis certain que c'est une connerie, mais je ne trouve pas laquelle. J'ai l'impression que cela tourne autour de as $post, que je ne reproduis pas car je ne fais pas de foreach.
Maintenant le soucis n'est pas très grave, car grâce aux premiers tutos de cette formation, j'ai compris pas mal de chose, dont l'hydratation, les constructeurs,..., qu'avais essayé de m'expliquer certain d'entre vous (au final ils ont réussi je crois ;) )
Le besoin de réponse et plus une question d’orgueil qu'autre chose.
Avance dans le tuto tu verras que ca va te débloquer :)
comme la venue du
$sql->setFetchMode(PDO::FETCH_CLASS, $this->class);
pour ne pas le placer dans le fetch()