Bonjour,

Voila je rencontre un petit problème avec mon code.

En gros, le code est le même que celui de la création des table dans le tutoriel pour apprendre la POO en PHP, le voici :

    public static function find($id)
    {
        return App::getDb()->prepare('SELECT * FROM ' . static::getTable() . 'WHERE id = ?', [$id], get_called_class(), true);
    }

J'ai uniquement mis la fonction affectée.
Voici le code qui appelle cette fonction :

$categorie = \App\Table\Categorie::find($_GET['id']);

Voici finalement le code de la fonction prepare :

    public function prepare($statement, $attributes, $class_name, $one = false )
    {
        $req = $this->getPDO()->prepare($statement);
        $req->execute($attributes);
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
        if($one)
        {
            $datas = $req->fetch();
        }
        else
        {
            $datas = $req->fetchAll();
        }

        return $datas;
    }

J'aimerais trouver un moyen de ne plus recevoir ces erreurs :
Imgur

Avez-vous une idée de ce qui faudrait que je fasse pour régler ce malheureux problème ?

Merci d'avance à tous et à toutes qui m'aideront !

3 réponses


SLK
Réponse acceptée

Salut,

1)
l'erreur nous dit de regarder à la ligne 43.
1.1) Quelle est la ligne 43 ?
Il me semble que c'est celle-là :

$req->execute($attributes);

Mais je voudrai en être sûr.

En même temps,
places un try/catch à cette ligne 43,
1.2) et donne nous le message d'erreur qui s'affiche.

try
{
    // ligne 43
}
catch (\PDOException $e)
{
    $e->getMessage(); // qu'est-ce qui s'affiche ici ?
}

2)
Je ne sais pas vraiment si ça va changer quelque chose mais,
j'aurai mis un espace avant le WHERE dans la requête SQL :

'SELECT * FROM ' . static::getTable() . ' WHERE id = ?'

3)

  • Dans quel fichier (indique aussi le namespace) se trouve la fonction "find()" ?
  • Dans quel fichier (indique aussi le namespace) se trouve la fonction "getTable()" ?

4)
Tu as mis le "$req->setFetchMode" APRES le "$req->execute".
Je ne me souviens plus du tout s'il FAUT le mettre AVANT,
ou si ça n'a aucune importance (qu'on peut le mettre avant ou après c'est pareil).
Si toi ou quelqu'un, peut répondre à ça ^^

Salut !

J'ai fais la première et la deuxième technique et tout est rentré dans l'ordre.
Bizarrement, ça marchait (pour la première technique) quand je mettre le try/catch et arrêtait de fonctionner.
Bref, je crois que c'est la solution 2 qui a fonctionnée !

Merci d'avoir pris le temps de me répondre ! :)

Ah ben, super ^^