Se connecter

Informatique

Création de sites web

Sujet : Avis sur ma classe php
1
PillsDispenser
Niveau 51
18 novembre 2019 à 20:35:37

Bonjour

Est ce la bonne méthode ?

<?php

class Manager
{
  // Database login
  const DB_HOST = 'localhost';
  const DB_NAME = 'python';
  const DB_USER = 'root';
  const DB_PWD = '';

  // Login to database
  protected function dbConnect()
  {
    try
    {
      $db = new PDO('mysql:host='.self::DB_HOST.';dbname='.self::DB_NAME.';charset=utf8', self::DB_USER, self::DB_PWD);
      $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e)
    {
      die('Connection error: ' . $e->getMessage() );
    }

    return $db;
  }
}
<?php

require_once('model/Manager.php');

class UserManager extends Manager
{
  // Getter
  public function getUser($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT * FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserUsername($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_username FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserEmail($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_email FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserPassword($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_password FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserFirstName($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_first_name FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserLastName($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_last_name FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserLanguage($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_language FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserCountry($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_country FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserBirthDate($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_birth_date FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserGender($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_gender FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserCreationDate($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_creation_date FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserPresentation($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_presentation FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserFacebook($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_facebook FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserTwitter($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_twitter FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserTwitch($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_twitch FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserYoutube($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_youtube FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserIsActive($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_is_active FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  public function getUserIsBanned($user_id)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('SELECT user_is_banned FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user_id);
    $query->execute();
    $user = $query->fetch();

    return $user;
  }

  // Setter
  public function setUserEmail($user_id, $user_email)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_email=:user_email WHERE user_id=:user_id');
    $query->bindParam(':user_email', $user_email);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserPassword($user_id, $user_password)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_password=:user_password WHERE user_id=:user_id');
    $query->bindParam(':user_password', $user_password);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserFirstName($user_id, $user_first_name)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_first_name=:user_first_name WHERE user_id=:user_id');
    $query->bindParam(':user_first_name', $user_first_name);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserLastName($user_id, $user_last_name)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_last_name=:user_last_name WHERE user_id=:user_id');
    $query->bindParam(':user_last_name', $user_last_name);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserLanguage($user_id, $user_language)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_language=:user_language WHERE user_id=:user_id');
    $query->bindParam(':user_language', $user_language);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserCountry($user_id, $user_country)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_country=:user_country WHERE user_id=:user_id');
    $query->bindParam(':user_country', $user_country);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserBirthDate($user_id, $user_birth_date)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_birth_date=:user_birth_date WHERE user_id=:user_id');
    $query->bindParam(':user_birth_date', $user_birth_date);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserGender($user_id, $user_gender)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_gender=:user_gender WHERE user_id=:user_id');
    $query->bindParam(':user_gender', $user_gender);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserPresentation($user_id, $user_presentation)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_presentation=:user_presentation WHERE user_id=:user_id');
    $query->bindParam(':user_presentation', $user_presentation);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserFacebook($user_id, $user_facebook)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_facebook=:user_facebook WHERE user_id=:user_id');
    $query->bindParam(':user_facebook', $user_facebook);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserTwitter($user_id, $user_twitter)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_twitter=:user_twitter WHERE user_id=:user_id');
    $query->bindParam(':user_twitter', $user_twitter);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserTwitch($user_id, $user_twitch)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_twitch=:user_twitch WHERE user_id=:user_id');
    $query->bindParam(':user_twitch', $user_twitch);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }

  public function setUserYoutube($user_id, $user_youtube)
  {
    $db = $this->dbConnect();

    $query = $db->prepare('UPDATE user SET user_youtube=:user_youtube WHERE user_id=:user_id');
    $query->bindParam(':user_youtube', $user_youtube);
    $query->bindParam(':user_id', $user_id);
    $query->execute();
  }
}
Marav
Niveau 28
19 novembre 2019 à 07:53:58

Je t'avoue que j'ai pas tout lu mais quelques trucs qui me sautent aux yeux.
Pourquoi tu fais une requête pour chaque informations d'un user ? J'imagine que c'est pour le login, dans ce cas pourquoi ne pas faire une requête complète, voire 2 selon tes besoins pour qui regroupe toutes ces informations ?

T'es en MVC ?
Fait une classe pour gérer ta connexion à la base de données que tu appellera ensuite depuis ta classe Manager, dans l'idéal il faut séparer les logiques de ton code au maximum. Dans ce cas selon le pattern MVC c'est le Modèle ici.

En me relisant je me suis dit que c'était sans doute un exercice pour apprendre à faire des classes, en pratique je pense qu'il est mieux de faire ce que je t'ai dit sur mon message.

deepblue
Niveau 13
19 novembre 2019 à 10:44:47

Cette méthode fonctionne mais elle n'est pas pas ouf en terme de conception.
Un truc dans le genre me parait plus judicieux : https://gist.deblan.org/en/view/5dd3b96a7997f (c'est fait à l'arrache, qu'on soit bien clair)

PillsDispenser
Niveau 51
19 novembre 2019 à 12:49:54

Bonjour,

J'ai modifié que pensez vous ? J'avais fait plusieurs get pour éviter de recuperer des infos sur l'utilisateur que je n'aurais pas besoin.
Je ne sais pas faire une requete commune dans le manager car je ne comprends pas comment marche criteria.

abstract class DatabaseManager
{
  private $db;

  public function __construct(string $host, string $name, string $user, string $password)
  {
    try
    {
      $this->$db = new PDO('mysql:host='.$host.';dbname='.$name.';charset=utf8', $user, $password);
      $this->$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e)
    {
      die('Connection error: ' . $e->getMessage() );
    }
  }

  public function getDb(): PDO
  {
    return $this->db;
  }
}
class UserManager extends DatabaseManager
{

  public function getUser(int $userId): ?User
  {
    $query = $this->getDb()->prepare('SELECT * FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $userId);
    $query->execute();
    $user = $query->fetch();
    if (!$user) {
      return null;
    }

    return new User($user['user_id'], $user['user_username'], $user['user_email'], $user['user_first_name'],
    $user['user_last_name'], $user['user_language'], $user['user_country'], $user['user_birth_date'],
    $user['user_gender'], $user['user_creation_date'], $user['user_presentation'], $user['user_facebook'],
    $user['user_twitter'], $user['user_twitch'], $user['user_youtube'], $user['user_is_active'], $user['user_is_banned']);
  }

  public function deleteUser(int $userId): void
  {
    $query = $this->getDb()->prepare('DELETE FROM user WHERE user_id=:user_id');
    $query->bindParam(':user_id', $userId);
    $query->execute();
  }

  public function saveUser(User $user): void
  {
    $query = $this->getDb()->prepare('UPDATE user SET user_password=:user_password, user_email=:user_email, WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user->getId());
    $query->bindParam(':user_email', $user->getEmail());
    $query->bindParam(':user_password', $user->getPassword());
    $query->execute();
  }

  public function savePassword(User $user, string $password): void {
    // Hash password
    $password = password_hash($password, PASSWORD_DEFAULT);
    // Store it
    $query = $this->getDb()->prepare('UPDATE user SET user_password=:user_password WHERE user_id=:user_id');
    $query->bindParam(':user_id', $user->getId());
    $query->bindParam(':user_password', $password);
    $query->execute();
  }

  public function verifyPassword(User $user, string $password): bool {
    // hash pw, compare hash with database, return true if ok, false if not ok
    if (password_verify($password, $user['password'])) {
      return true;
    }
    else {
      return false;
    }
  }
class User
{
  private $id;
  private $username;
  private $email;
  private $firstName;
  private $lastName;
  private $language;
  private $country;
  private $birthDate;
  private $gender;
  private $creationDate;
  private $presentation;
  private $facebook;
  private $twitter;
  private $twitch;
  private $youtube;
  private $isActive;
  private $isBanned;

  public function __construct(
    int $id, string $username, string $email, string $firstName,
    string $lastName, string $language, string $country, DateTime $birthDate,
    string $gender, DateTime $creationDate, string $presentation, string $facebook,
    string $twitter, string $twitch, string $youtube, int $isActive, int $isBanned
  )
  {
    $this->id = $id;
    $this->username = $username;
    $this->email = $email;
    $this->firstName = $firstName;
    $this->lastName = $lastName;
    $this->language = $language;
    $this->country = $country;
    $this->birthDate = $birthDate;
    $this->gender = $gender;
    $this->creationDate = $creationDate;
    $this->presentation = $presentation;
    $this->facebook = $facebook;
    $this->twitter = $twitter;
    $this->twitch = $twitch;
    $this->youtube = $youtube;
    $this->isActive = $isActive;
    $this->isBanned = $isBanned;
  }

  public function getId(){
		return $this->id;
	}

	public function setId($id){
		$this->id = $id;
	}

	public function getUsername(){
		return $this->username;
	}

	public function setUsername($username){
		$this->username = $username;
	}

	public function getEmail(){
		return $this->email;
	}

	public function setEmail($email){
		$this->email = $email;
	}

	public function getFirstName(){
		return $this->firstName;
	}

	public function setFirstName($firstName){
		$this->firstName = $firstName;
	}

	public function getLastName(){
		return $this->lastName;
	}

	public function setLastName($lastName){
		$this->lastName = $lastName;
	}

	public function getLanguage(){
		return $this->language;
	}

	public function setLanguage($language){
		$this->language = $language;
	}

	public function getCountry(){
		return $this->country;
	}

	public function setCountry($country){
		$this->country = $country;
	}

	public function getBirthDate(){
		return $this->birthDate;
	}

	public function setBirthDate($birthDate){
		$this->birthDate = $birthDate;
	}

	public function getGender(){
		return $this->gender;
	}

	public function setGender($gender){
		$this->gender = $gender;
	}

	public function getCreationDate(){
		return $this->creationDate;
	}

	public function setCreationDate($creationDate){
		$this->creationDate = $creationDate;
	}

	public function getPresentation(){
		return $this->presentation;
	}

	public function setPresentation($presentation){
		$this->presentation = $presentation;
	}

	public function getFacebook(){
		return $this->facebook;
	}

	public function setFacebook($facebook){
		$this->facebook = $facebook;
	}

	public function getTwitter(){
		return $this->twitter;
	}

	public function setTwitter($twitter){
		$this->twitter = $twitter;
	}

	public function getTwitch(){
		return $this->twitch;
	}

	public function setTwitch($twitch){
		$this->twitch = $twitch;
	}

	public function getYoutube(){
		return $this->youtube;
	}

	public function setYoutube($youtube){
		$this->youtube = $youtube;
	}

	public function getIsActive(){
		return $this->isActive;
	}

	public function setIsActive($isActive){
		$this->isActive = $isActive;
	}

	public function getIsBanned(){
		return $this->isBanned;
	}

	public function setIsBanned($isBanned){
		$this->isBanned = $isBanned;
	}
}
[Myster]
Niveau 7
20 novembre 2019 à 18:33:42

Ta fonction getUser est immonde, sachant que tu as une classe User, tu devrais donc hydrater, et retourner l'objet user, plutôt que

 return new User($user['user_id'], $user['user_username'], $user['user_email'], $user['user_first_name'],
    $user['user_last_name'], $user['user_language'], $user['user_country'], $user['user_birth_date'],
    $user['user_gender'], $user['user_creation_date'], $user['user_presentation'], $user['user_facebook'],
    $user['user_twitter'], $user['user_twitch'], $user['user_youtube'], $user['user_is_active'], $user['user_is_banned']);

De plus n'oublie pas de faire des vérifications dans tes fonctions comme set_username du genre si y'a trop de caractères, si y'a pas assez de caractères, si y'a des caractères spéciaux etc, et tu peux aussi également faire par exemple

 public function setUsername(string $username){ 
        $this->username = $username;
    }

En mettant string ça signifie que la méthode attends un argument username mais avec le type string, donc si quelqu'un met un chiffre ça fonctionnera pas par exemple.

PillsDispenser
Niveau 51
20 novembre 2019 à 21:44:45

Comment ca hydrater ?

[Myster]
Niveau 7
20 novembre 2019 à 23:05:34

Bonsoir,

Pardon, hydrater c'est le fait de fournir des valeurs à tes attributs (donc pour que tu comprennes mieux à tes "variables"), mais apparemment tu le fait déjà j'ai lu en vitesse ton code, mes excuses.

PillsDispenser
Niveau 51
20 novembre 2019 à 23:25:32

ah

20_cent_2017
Niveau 10
23 novembre 2019 à 12:10:44

C'est juste dégueulasse ...

Il faut que ce soit simple .... et réutilisable ...

Imagine que tu es 2db par exemple ...

PillsDispenser
Niveau 51
23 novembre 2019 à 13:35:39

et comment ?

20_cent_2017
Niveau 10
23 novembre 2019 à 20:45:59

Regarde les framework et les orms
genre symfony et Doctrine

1
Sujet : Avis sur ma classe php
   Retour haut de page
Consulter la version web de cette page