[RESOLU] Utilisation d'un trait

Petit nouveau ! | 8 Messages

23 sept. 2022, 13:20

Bonjour,
Je me permet de poster car je suis en train de tester les traits.

Malgré mes multiples essais je ne vois pas d'ou vient mon erreur.
pouvez vous m'aider a me connecter à ma base de données svp ?
Voici mon code.

Code : Tout sélectionner

<?php trait Connect { public PDO $connc; public function __construct() { try { $this->connc = new PDO(DATABASE,USER,PASS); } catch (PDOException $e){ echo 'Le trait fonctionne'.$e; } } }

et la class qui l'utilise:

Code : Tout sélectionner

<?php class Calendar { use Connect; private string $dte; private string $hour; /** * @param string $dte * represente la date selectionner par la balise select */ public function __construct(string $dte, string $hour) { $this->dte = $dte; $this->hour = $hour; } public function getCalendar():string { return $this->dte .' '.$this->hour; }
Merci pour vos explications.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9435 Messages

23 sept. 2022, 13:43

On est d'accord que tu fais un echo "Le trait fonctionne" quand justement, tu as une exception et donc une erreur ?

Tu es sûr que DATABASE,USER,PASS sont bien définis ?

Mon conseil pour faciliter le debugage (quand tu n'es pas en prod mais bien en debug), c'est d'utiliser PDO::ERRMODE_WARNING comme ça tu vois le problème tout de suite :
https://www.php.net/manual/en/pdo.error-handling.php
Si tu veux garder la gestion d'erreur via les exceptions, il faut probablement que tu fasses un echo de $e->getMessage(); cf la doc
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 8 Messages

23 sept. 2022, 13:56

Bonjour,
Oui je fais bien un echo

Code : Tout sélectionner

<?php echo $nCalendar->exist();?>
apres quelques modifications le message a changer:
Fatal error
: Uncaught Error: Typed property Calendar::$connc must not be accessed before initialization in /srv/web/restaurant/class/Calendar.php:24 Stack trace: #0 /srv/web/restaurant/reserver.php(38): Calendar->exist() #1 {main} thrown in
/srv/web/restaurant/class/Calendar.php
on line
24

Code : Tout sélectionner

<?php class Calendar { use Connect; private string $dte; private string $hour; public function __construct(string $dte, string $hour) { $this->dte = $dte; $this->hour = $hour; } public function getCalendar():string { return $this->dte .' '.$this->hour; } public function exist() { $rs_exist = $this->connc->prepare('SELECT * FROM book'); $rs_exist->execute(); } }
Cdlt

Petit nouveau ! | 8 Messages

23 sept. 2022, 17:30

Effectivement le Use fonctionne bien.
Ma difficulté est que ma connexion je pense n'est pas créer.
Je ne vois pas comment l'instancier.
Voici mon message d'erreur:
Uncaught Error: Typed property Calendar::$connc must not be accessed before initialization in /srv/web/restaurant/class/Calendar.php:24 Stack trace: #0 /srv/web/restaurant/reserver.php(37): Calendar->exist()
et mon code:

Code : Tout sélectionner

<?php require_once 'config/config.php'; trait Connect { private PDO $connc; public function __construct() { try { $this->connc = new PDO(DATABASE,USER,PASS,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); } catch (PDOException $e){ echo $e; } } }

Code : Tout sélectionner

<?php require_once 'class/Connect.php'; class Calendar { use Connect; private string $dte; private string $hour; public function __construct(string $dte, string $hour) { $this->dte = $dte; $this->hour = $hour; } public function getCalendar():string { return $this->dte .' '.$this->hour; } public function exist() { $rs_exist = $this->connc->prepare('SELECT * FROM book'); $rs_exist->execute(); } }
Pouvez vous m'aider svp ?

ynx
Eléphant du PHP | 473 Messages

23 sept. 2022, 19:23

Bonjour,

Il me semble que l'utilisation d'un constructeur dans un trait est plutôt rare car un trait ne peux pas être instancié.
Le constructeur de la classe Connect va écraser le constructeur du trait Connect (ordre de précédence), on pourrait utiliser un alias pour résoudre ce conflit mais il semble plus simple de créer une nouvelle méthode.

Le constructeur ou la méthode de ton trait n'est pas appelé lors qu'il est utilisé par ta classe.
Tu peux appeler cette méthode dans le constructeur de ta classe, via son alias si tu conserves ton constructeur ou via le nom de la nouvelle méthode.

Exemple avec un alias pour éviter le conflit entre les méthodes __construct :
trait Connect
{
    private PDO $connc;

    public function __construct()
    {
        try {
            $this->connc = new PDO(DATABASE, USER, PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }
}

class Calendar
{
    use Connect {
        Connect::__construct as __connectConstruct;
    }

    private string $dte;

    private string $hour;

    public function __construct(string $dte, string $hour)
    {
        $this->__connectConstruct();
        $this->dte = $dte;
        $this->hour = $hour;
    }

    public function getCalendar(): string
    {
        return $this->dte .' '.$this->hour;
    }

    public function exist()
    {
        $rs_exist = $this->connc->prepare('SELECT * FROM book');
        $rs_exist->execute();
    }
}


Exemple plus simple avec un autre nom de méthode :
trait Connect
{
    private PDO $connc;

    public function connexion()
    {
        try {
            $this->connc = new PDO(DATABASE, USER, PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }
}

class Calendar
{
    use Connect;

    private string $dte;

    private string $hour;

    public function __construct(string $dte, string $hour)
    {
        $this->connexion();
        $this->dte = $dte;
        $this->hour = $hour;
    }

    public function getCalendar(): string
    {
        return $this->dte .' '.$this->hour;
    }

    public function exist()
    {
        $rs_exist = $this->connc->prepare('SELECT * FROM book');
        $rs_exist->execute();
    }
}

Petit nouveau ! | 8 Messages

23 sept. 2022, 20:03

Bonjour,
Mon problème est résolu
Merci pour ces explications qui m'ont beaucoup aider !