Bonjour bonjour, oui encore moi X.X

Je sais pas si vous avez suivit mon précédent problème, mais c'est lié, c'est la suite en faite haha :P

En gros, ayant suivit la formation POO de Graf, je souhaite récupérer pour le moment le titre d'un article qui dépend de $_GET['id']

(Fonction getTitle() qui se trouve dans ma classe ArticlesEntity, mais qui ne retourne rien, vu que je ne récupère pas les datas dans find())

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

Quand je fais ça, et que je le var_dump, $req renvoit NULL.

$this->query, renvois à cette fonction :

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
                        );

      }

    }

Juste pour information.

Mais là ou c'est étrange, c'est quand je var_dump, les $datas de la fonction prepare de ma class Database :

public function prepare($statement, $attributes, $class_name = null, $one = false) {
      $req = $this->getPDO()->prepare($statement);
      $res = $req->execute($attributes);
      if(
        strpos($statement, 'UPDATE' === 0) ||
        strpos($statement, 'INSERT' === 0) ||
        strpos($statement, 'DELETE' === 0)
      )
        return $res;

      if(is_null($class_name))
        $req->setFetchMode(PDO::FETCH_OBJ);
      else
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
      if($one)
        $datas = $req->fetch();
      else
        $datas = $req->fetchAll();
      var_dump($datas);
    }

Le var_dump me renvoit bien le résultat de la requête, preuve que celle-ci à bien fonctionner.
Donc pourquoi, dans la fonction find, je n'ai rien et que ça renvoit NULL ?

Marchi :)

Si besoin de plus d'informations hésitez pas

4 réponses


Genki
Auteur
Réponse acceptée

Bien vu mais non. C'est pas ça, je pense avoir trouvé le problème.
Dans la fonction find, je demande à return le résultat :

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

Ce return devrait donc contenir les $datas de CE prépare :

public function prepare($statement, $attributes, $class_name = null, $one = false) {
      $req = $this->getPDO()->prepare($statement);
      $res = $req->execute($attributes);
      if(
        strpos($statement, 'UPDATE') === 0 ||
        strpos($statement, 'INSERT') === 0 ||
        strpos($statement, 'DELETE') === 0
      )
        return $res;

      if(is_null($class_name))
        $req->setFetchMode(PDO::FETCH_OBJ);
      else
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
      if($one)
        $datas = $req->fetch();
      else
        $datas = $req->fetchAll();
      return $datas; // Juste ici, ça contient bien les datas, mais ça n'envoit pas à Find.
    }

Donc le problème est entre, c'est à dire, ma fonction Query, qui je vient de me rendre compte, que ELLE, elle ne return rien, elle agit comme un pont entre mon find et la fonction prepare, mais elle return rien.

public function query($statement, $attributes, $one) {
      if($attributes) {
        $this->db->prepare($statement, // Un return ici et les $datas de prepare sont bien renvoyé
                           $attributes,
                           get_class($this).'Entity',
                           $one
                          );
         }

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

      }

    }

Donc voilà c'était tout bête :p

Bonsoir,

Dans votre fonction find vous avez oublié de faire un return et aussi dans la fonction prepare.


public function find($id) {
    return $this->query("SELECT * FROM {$this->table} WHERE id = ?", [$id], true);
}
public function prepare($statement, $attributes, $class_name = null, $one = false) {
      $req = $this->getPDO()->prepare($statement);
      $res = $req->execute($attributes);
      if(
        strpos($statement, 'UPDATE' === 0) ||
        strpos($statement, 'INSERT' === 0) ||
        strpos($statement, 'DELETE' === 0)
      ) return $res;

      if(is_null($class_name))
        $req->setFetchMode(PDO::FETCH_OBJ);
      else
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
      if($one)
        $datas = $req->fetch();
      else
        $datas = $req->fetchAll();

        return $datas;
    }
Genki
Auteur

C'était voulu ici, puisque je var_dump les résultats afin de voir ce qu'ils contiennent pour tenter de situer où est le problème :/

EDIT: Petite précision, quand je modifie la fonction find tel que :

    public function find($id) {
      $req = $this->db->prepare("SELECT * FROM {$this->table} WHERE id = ?", [$id], 'ArticlesEntity', true);
      var_dump($req);
    }

Donc je passe pu par $this->query, mais directement par le prepare de la Database, je récupère bien les datas.
Mais c'est pas ce que je veux faire, c'était juste pour tester

Faire ceci : =>

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

// Erreur niveau de la condition du premier **if ** ***strpos($statement, 'UPDATE')===0*** au lieu de **strpos($statement, 'UPDATE' === 0)** pareil pour les autres.

public function prepare($statement, $attributes, $class_name = null, $one = false) {
      $req = $this->getPDO()->prepare($statement);
      $res = $req->execute($attributes);

      if(
        strpos($statement, 'UPDATE') === 0 ||
        strpos($statement, 'INSERT') === 0 ||
        strpos($statement, 'DELETE')=== 0
      )
        return $res;

      if(is_null($class_name))
        $req->setFetchMode(PDO::FETCH_OBJ);
      else
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
      if($one)
        $datas = $req->fetch();
      else
        $datas = $req->fetchAll();
      var_dump($datas);
    }

Je pense que cela pourra faire l'affaire.