[RESOLU] POO : Afficher le profil d'un membre

Eléphant du PHP | 386 Messages

25 janv. 2017, 18:06

Salut à tous !

J'utilise ce code ci-dessous pour afficher le profil du membre et les infos du membre connecté :

Le haut de ma page profil.php :

Code : Tout sélectionner

<?php require '../../inc/bootstrap.inc.php'; // Autoloader. App::getAuth()->restrict(); // Page restreinte. $db = App::getDatabase(); // Base de donnée. $member = new Member($_SESSION['auth']); // Instance de la classe Member pour le membre en cours de session. Ma classe Member utilise juste des getters et setters, et ne pose pas de problème, elle caractérise juste mon membre. $profil = new MemberLoad($db); // Instance de la classe MemberLoad (ci-dessous) qui va appeler la fonction getUser pour récupérer les infos du membre qu'on veut visiter. $data = $profil->getUser($_GET['username']); // La fonction en question. $donnees = new MemberLoad($db); // Instance de la classe MemberLoad pour récupérer l'avatar du membre en cours. if(empty($data->username)){ // Si le membre n'existe pas on redirige vers 404. App::redirect('/404.php'); } ?> <html> <?php echo ucfirst($data->surname).' '.ucfirst($data->name); ?> // Affiche le prénom et le nom du membre passé en GET </html>
Ça me paraît trop brouillon, et pas de la bonne façon.
Voila la classe MemberLoad, classe qui me permet de faire les requêtes SQL. (Récupérer, ajouter ou modifier les infos)

Code : Tout sélectionner

<?php class MemberLoad{ protected $db; public function __construct($db){ $this->db = $db; } public function getUser(string $username){ // Fonction qui récupère les infos du membre selon le pseudo du membre passé en $_GET. $user = $this->db->query('SELECT * FROM users WHERE username = :username', ['username' => $username])->fetch(); // On récupère toujours sous forme d'objets (Paramètre dans la classe App). return $user; } public function getAvatar($id){ // Fonction qui récupère l'avatar du membre selon l'id du membre en cours. $req = $this->db->query('SELECT * FROM users_avatars WHERE avatar_userid = :avatar_userid', ['avatar_userid' => $id])->fetch(); return $req->avatar_url; } }
Comment faire pour simplifier le haut de ma page profil.php ?
Je suis débutant, vous pouvez m'expliquer ? ;)
Merci

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8747 Messages

26 janv. 2017, 13:53

salut,

tu crée deux instances de MemberLoad pourquoi ?
utilise la même deux fois, surtout que $donnees n'est pas utilisée.
$membre non plus.

en fait tu devrais avoir un getById sur ton service membre (MemberLoad) et ce getById retourne un objet Member
et si le membre existe pas tu as une erreur sur le $data->username qui au mieux vaut false
dans ce cas il ets préférable de lever une exception que tu catch et t'en fait ce que tu veux ;)

en gros, a partir de ton code, je ferai un truc dans le genre
<?php
// voir exceptino perso dans la doc
class UserUnknowException extends \Exception{
    
}
// la classe qui contient les infos d'un membre, y a moyen d'y mettre l'avatar :)
class Member {
    private $userid;
    private $surname;
    private $name;
    private $avatar;

    public function getName():string{
        return $this->name;
    }
    public function setName(string $name){
        $this->name = $name;
    }
    // idem pour les autres, en respectant le lower camel case
}

// MemberDAO : parce que c'est la classe qui accède aux donnes (Data Access Object).Load ça veux pas dire grand chose :)
class MemberDAO{
    
    private $db;
    public function __construct($db){
        $this->db = $db;
    }
    
    public function getUserByName(string $username) : Member{
        $sql = <<<sql
        SELECT les,champs,qui,vont,bien,parce que,le, select, *, c est, le ,mal FROM users
        left join users_avatars on user_id = avatar_userid
        WHERE username = :username
sql;
        $stmt = $this->db->query($sql,['username' => $username]);
        if($stmt->rowCount() != 1){
            throw new UserUnknowException('Utilisateur inconnue');
        }else {
            $stmt->setFetchMode(PDO::FETCH_CLASS,'Member');
            return $stmt->fetch();
        }
    }
    
    public function getUser(string $username){ // Fonction qui récupère les infos du membre selon le pseudo du membre passé en $_GET.
        $user = $this->db->query('SELECT * FROM users WHERE username = :username',
        ['username' => $username])->fetch(); // On récupère toujours sous forme d'objets (Paramètre dans la classe App).
        return $user;
    }

    public function deleteById(int $id):void{

    }
    public function deleteByName(string $name):void{

    }
    public function update(Member $m):void{

    }
}

// le fichier d'appel
require '../../inc/bootstrap.inc.php'; // Autoloader.
App::getAuth()->restrict(); // Page restreinte.
$db = App::getDatabase(); // Base de donnée.
$profil = new MemberDAO($db); // Instance de la classe MemberLoad
$data = null;
try {
    $data = $profil->getUserByName($_GET['username']); // La fonction en question.
}catch(UserUnknowException $e){
    // y a des chose dans l'exception tu peux passer un message plus sexy qu'une 404
    App::redirect('/404.php');
}

?>
<html>

<body>
<?php 
echo ucfirst($data->getSurname()).' '.ucfirst($data->getName());
echo '<br /><img src="/avatar/', $data->getAvatar(), '" />';
 ?>
</body>
</html>
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 386 Messages

27 janv. 2017, 14:04

Salut,

J'ai un message d'erreur en haut de ma page profil.php :

Warning: Missing argument 1 for Member::__construct() in /home/public/class/Member.class.php on line 18

Qui correspond à la ligne du constructeur de la classe Member :

Code : Tout sélectionner

class UserUnknowException extends \Exception{} class Member{ protected $id; protected $username; protected $email; protected $surname; protected $name; protected $sex; protected $avatar; protected $birthdate; protected $userstart; protected $userdate; public function __construct($values){ if(!empty($values)){ $this->hydrate($values); } } public function hydrate($donnees){ foreach($donnees as $key => $value){ $method = 'set'.ucfirst($key); if(method_exists($this,$method)){ $this->$method($value); } } } public function getId():int{ return $this->id; } public function setId(int $id){ $this->id = $id; } public function getUsername():string{ return $this->username; } public function setUsername(string $username){ $this->username = $username; } etc...
Et le haut de la page profil modifiée :

Code : Tout sélectionner

require '../../inc/bootstrap.inc.php'; App::getAuth()->restrict(); $db = App::getDatabase(); $member = new Member($_SESSION['auth']); $profil = new MemberDAO($db); $data = null; try { $data = $profil->getUser($_GET['username']); } catch(UserUnknowException $e){ App::redirect('/404.php'); }
Je garde Member, car j'inclue dans la page profil.php, des infos du membre en session avec par ex $member->getName();
Mais j'ai cette erreur.


J'ai pas trop compris le getById, j'ai déjà un getter sur l'id dans ma classe member ainsi que la classe UserUnknowException qui contiendrai quoi ?
Ainsi que les fonctions deleteById, deleteByName, update ?

L'utilité de chaque fonctions, j'ai pas compris ?

Merci

Eléphant du PHP | 386 Messages

28 janv. 2017, 02:14

J'ai résolu mon problème en modifiant cette ligne et en précisant les arguments passé dans le constructeur :

$user->setFetchMode(PDO::FETCH_CLASS, 'Member',[$user]);

Et plus de message d'erreur, ça fonctionne ;)