Bonjour,
Je suis le tutoriel https://www.grafikart.fr/formations/programmation-objet-php et je suis rendu au chapitre 18.
Mais voila, je rencontre un petit problème avec mon code.
Voici mon fichier users.php
<?php
$users = App::getInstance()->getTable('users')->getAll();
?>
<div id="contenu">
<table>
<thead>
<tr>
<th>
<a>Nom</a>
</th>
<th>
<a>Nom d'utilisateur</a>
</th>
<th>
<a>Groupe</a>
</th>
<th>
<a>Désactivé</a>
</th>
</tr>
</thead>
<tbody>
<?php
foreach ($users as $user):
?>
<tr id="user_<?= $user->id_user ?>" onclick="window.location.href='<?= $user->url ?>'">
<td> <?= $user->name_user ?> </td>
<td> <?= $user->username_user ?> </td>
<td> <?= $user->name_group ?> </td>
<td class="boolean">
<input type="checkbox" <?= ($user->active_user) ? 'checked' : '' ?> disabled="">
</td>
</tr>
<? endforeach; ?>
</tbody>
<tfoot></tfoot>
</table>
</div>
Ce qui ne fonctionne pas c'est lorsque je fais cette ligne, je me retrouve avec une page blanche.
<?= $user->url ?>
Voici mes autres fichiers:
App.php:
<?php
use Core\Config;
use Core\Database;
class App{
private static $_instance;
private $db_instance;
public static function getInstance(){
if(is_null(self::$_instance)){
self::$_instance = new App();
}
return self::$_instance;
}
public static function load(){
session_start();
require ROOT . '/app/Autoloader.php';
\App\Autoloader::register();
require ROOT . '/core/Autoloader.php';
\Core\Autoloader::register();
}
public function getTable($name){
$class_name = '\\App\\Model\\Model' . ucfirst($name);
return new $class_name($this->getDb());
}
public function getDb(){
$config = Config::getInstance(ROOT . '/config/config.php');
if(is_null($this->db_instance)){
$this->db_instance = new Database($config->get('db_name'), $config->get('db_user'), $config->get('db_pass'), $config->get('db_host'));
}
return $this->db_instance;
}
}
ModelUsers.php
<?php
namespace App\Model;
use Core\Model\Model;
class ModelUsers extends Model{
public function __get($name)
{
$method = 'get' . ucfirst($name);
$this->$name = $this->$method();
return $this->$name;
}
public function getUrl(){
return 'index.php?p=users.edit&id='. $this->id_user;
}
}
Model.php
<?php
namespace Core\Model;
use Core\Database;
class Model{
protected $table;
protected $db;
public function __get($name)
{
$method = 'get' . ucfirst($name);
$this->$name = $this->$method();
return $this->$name;
}
public function __construct(Database $db)
{
$this->db = $db;
if(is_null($this->table)){
$class_parts = explode('\\', get_class($this));
$class_name = end($class_parts);
$this->table = strtoupper(str_replace('Model', '', $class_name));
}
}
public function query($statement, $attributes = null, $one = false){
if($attributes){
return $this->db->prepare($statement, $attributes, get_called_class(), $one);
}else{
return $this->db->query($statement, get_called_class(), $one);
}
}
public function getAll(){
return $this->query("SELECT * FROM " . $this->table);
}
}
Database.php:
<?php
namespace Core;
use \PDO;
class Database
{
private $db_name;
private $db_user;
private $db_pass;
private $db_host;
private $pdo;
public function __construct($db_name, $db_user, $db_pass, $db_host)
{
$this->db_name = $db_name;
$this->db_user = $db_user;
$this->db_pass = $db_pass;
$this->db_host = $db_host;
}
private function getPDO()
{
if ($this->pdo === null) {
$pdo = new PDO('mysql:dbname=' . $this->db_name . ';host=' . $this->db_host, $this->db_user, $this->db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo = $pdo;
}
return $this->pdo;
}
public function query($statement, $class_name = null, $one = false)
{
$req = $this->getPDO()->query($statement);
if($class_name === null){
$req->setFetchMode(PDO::FETCH_OBJ);
}else{
$req->setFetchMode(PDO::FETCH_CLASS, $class_name);
}
if ($one) {
$data = $req->fetch();
} else {
$data = $req->fetchAll();
}
return $data;
}
public function prepare($statement, $attributes, $class_name = null, $one = false)
{
$req = $this->getPDO()->prepare($statement);
if($class_name === null){
$req->setFetchMode(PDO::FETCH_OBJ);
}else{
$req->setFetchMode(PDO::FETCH_CLASS, $class_name);
}
$req->execute($attributes);
if ($one){
return $req->fetch();
}
else{
return $req->fetchAll();
}
}
}
Je ne sais pas si vous avez tout ce que vous avez besoin pour m'aider, mais faites le moi savoir.
J'ai transférer mon getURL() dans une autre classe et maintenant ça fonctionne. Merci de votre aide!
Bonjour.
Est-ce que tu as bien les messages d'erreurs activés sur ton serveur web ?
Tu devrais regarder dans les logs de ton serveur web pour voir si tu n'y as pas l'explication du problème.
Je les ai mais il ne me parle pas bien bien...
Catchable fatal error: Argument 1 passed to Core\Model\Model::__construct() must be an instance of Core\Database, none given in /core/Model/Model.php on line 19
chaque fois que j'instancie un Model je passe bel et bien une instance de Core\Database. J'ai vérifié :(
Tous mes enfants sont instanciés de cette façon. :S Il n'y a aucune autre place que j'instancie le parent ou bien les enfants.
public function getTable($name){
$class_name = '\\App\\Model\\Model' . ucfirst($name);
return new $class_name($this->getDb());
}
Par contre, cela pourrait peut-être vous aider à m'aider!!
Dans mon fichier users.php lorsque je fais:
var_dump(App::getInstance()->getTable('users')->getAll());
Je me retrouve avec mon objet tel que je le veux.
Dans ma database, si je fais un
$req->setFetchMode(PDO::FETCH_OBJ);
ça fonctionne. Par contre, mon lien:
<tr id="ui-datagrid-1_<?= $user->id_user ?>" onclick="window.location.href='<?= $user->url ?>'">
n'est pas valide car mon objet $user n'est pas du type ModelUsers, donc il ne connait pas url.
Alors lorsque je fais
$req->setFetchMode(PDO::FETCH_CLASS, $class_name);
l'application plante au complet ...