Hello !

Je suis actuellement la formation de Grafikart sur la POO. Et je suis confronté à un mini problème, je suis sûr rien de grave, mais je trouve pas la solution.

Donc j'ai à peu près tout comme lui, voici ma fonction query de mon instance Database :

public function query($statement, $attributes = null, $one = false) {
      if($attributes) {
        $this->db->prepare($statement,
                           $attributes,
                           get_class($this).'Entity',
                           $one
                          );
      }

      else {
        $this->db->query($statement,
                         get_class($this).'Entity',
                         $one
                        );

      }

Et quand je prépare une requête, tel que le find($id) :

public function find($id) {
      return $this->query("SELECT * FROM {$this->table} WHERE id = ?", [$id], true);
    }

Celui- ci me sort ça :

Warning: PDO::prepare() expects at most 2 parameters, 4 given.

Donc je comprends rien
(Et si au passage, vous pouviez m'expliquer, parce que j'ai pas compris, l'intérêt de préciser la classe comme paramètres tel que get_class($this).'Entity';

Parce que pour le coup, je vois pas ce que ça vient faire là)

J'essaye de progresser, je pense être sur la bonne voie, mais certains bout de code reste un mystère pour moi

Merci beaucoup !

Edit : D'ailleurs, j'ai l'impression qu'il me manque un sacré bout de code, car dans sa requête prepare(), jamais on voit le exec. Je sais pas où il se trouve dans sa vidéo, donc je sais vraiment pas comment il fait :/

10 réponses


Grafikart
Réponse acceptée

Re regarde bien la vidéo tu as effectivement un pb là car tu n'éxécute jamais la requête.

Bonsoir,

La warning vous dit que la fonction prépare à besoin de 2 paramètres et vous lui en donner 4.

Genki
Auteur

C'est ce que j'ai écrit dans l'édit de mon premier post. Je m'en suis rendu compte, le problème est que dans tes vidéos, j'arrive pas à remettre la main sur ce code d'execution. Excepté dans le TP "Connexion à la base de données", mais y a tellement de vidéos entre celle là et le backend, que arrivé au backend, je trouve pu ce code dans la vidéo. Quand tu vas sur ta classe de base de données, il est pu là le code.

Bon je vais continuer de reregarder encore, si tu passes par là Graf, si t'arrive à te souvenir dans quel fichier tu as mis ce bout de code qu'il me manque (l'execution de prepare). Ca pourra m'aider, sinon je vais devoir farfouiller toutes les vidéos pour espérer tomber dessus.

Merci en tout cas !

Slt, je ne suis pas cette formation. mais en regardant le code , il ya quelque chose que je touver bizarre(enfin j'espère). la façon dont tu passe la variable id à ta fonction query. pourquoi le mets tu dans des crochets

// je parle de cette ligne
return $this->query("SELECT * FROM {$this->table} WHERE id = ?", [$id], true);

Et si tu veux mettre une variable dans une chaine de caractère, on procède de cette façon:

return $this->query("SELECT * FROM ".$this->table." WHERE id = ?", $id, true);

Au lieu de :

return $this->query("SELECT * FROM {$this->table} WHERE id = ?", $id, true);

En partant du principe que ton atribut $table soit protected ou public, ce qui est un peu discutable(L'encapsulation, tes attributs doivent être private, crée donc les methodes public getTable() et public setTable($table))

pour finir tu pouras peut-être appéler ta methode de cette façon:

return $this->query("SELECT * FROM ".$this->getTable()." WHERE id = ?", $id, true);


Et concernant ce bout de code, 
```get_class($this).'Entity';

ça doit être une convention de nommage. Bonne continuation !

Genki
Auteur

En effet, si tu ne suis pas la formation, tu comprends surement pas :P
Quoi que la première question est basique.

la fonction query comme tu l'as cité, ne pointe pas vers la fonction query de PDO, mais vers une fonction à part qui va se charger de "trier", à savoir si c'est une requête préparée ou non.

$this->query renvoit à :

public function query($statement, $attributes = null, $one = false) {
      if($attributes) { // comme j'indique qu'il y a un paramètre [$id], la fonction sait que je veux préparer et non pas requêter (?) 
        return $this->db->prepare($statement,
                           $attributes, // [$id] est appelé ici
                           get_class($this).'Entity',
                           $one
                          );
         }

      else {
        return $this->db->query($statement,
                         get_class($this).'Entity',
                         $one
                        );        
      }
    }

Et donc le [$id], est l'attribut nécessaire pour prépare la requête, l'attribut doit être un array (un tableau), et les tableaux en php s'écrivent entre [..].

Quand au get_class($this).'Entity'
C'est juste que dans la fonction, j'indique qu'il doit renvoyer le résultat dans une classe, qui s'appelle ici "ArticlesEntity".
Comme get_class($this) = Articles, j'ai juste à concaténer le Entity.

Mais si je voulais transmettre à la classe "patate", j'aurai fait get_class($this).'patate'
Tu vois ? :)

Slt, relis mon message j'ai très bien compris ta question , je sais que les tableaux en PHP se declarent aussi dans des crochets. Et je connais très bien le principe des methodes du type

get_class($this).'Quelquechose'

et si tu veux passer un tableau à une fonction, je te conseilles de le créer de cette façon:

$tableau[0] = $id;
ou $tableau = array('id'=>$id);

//Ensuite tu fais
maFonction($tableau);

Bonne continuation

Genki
Auteur

Arf, t'as édité, c'est pas cool :P

Alors, si je met pas $id entre crochets, il me ressort une erreur que c'est pas un tableau. Donc oui la solution que je créer le tableau avant pourrai régler le problème, mais ça marche comme ça donc..

Ensuite, pour le {$this->table}, là, faut voir avec le chef grafikart, c'est lui qui m'a apprit comme ça à travers ses vidéos. Moi même de base, j'aurai fait comme toi avec les '. $this->table .'

Pour le getTable, c'est plus facile comme ça, vu que j'instancie la variable $table, à la construction de celle-ci:

  class Tables {

    protected $table;
    protected $db;

    public function __construct(Database $db) {
      $this->db = $db;
      if (is_null($this->table))
        $this->table = strtolower(get_class($this));
    }

Encore une fois, je ne fais que reprendre le code de Grafikart pour les 3/4 :p
Donc je peux pas te dire pourquoi lui à fait ces choix ^^

Encore une fois je te renvois sur mon premier message, j'ai bien dis qu'on pouvait écrire $this->table si l'attribut $table est protected ou public dans la classe. Et concernant

{$this->table}

mélangé à une chaine de caractère, sans l'operateur de concatenation, c'est vraiment du nouveau pour moi.
Bonne continuation

Genki
Auteur

Bah c'est pas nouveau ça

<?php

$var = "Rémi";
echo ("Bonjour, je suis $var"); // Les doubles quotes permettent de lire les variables sans avoir besoin de la concaténation

?>

'Fin, jsais pas, pour moi, je l'ai toujours su depuis que j'ai appris PHP ^^'

ce n'est pas une bonne pratique, c'est pourqoui je ne l'utilise pas. Je me souviens l'avoir rencontré une fois en 2011., depuis lors je ne l'utilise plus. Si mes solutions, surtout celle sur la création de tableau intermediaire ne t'aident pas, je crois que je vais me déconnecter