Bonjour,

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

Ce que je fais

J'ai suivi pas à pas le tuto et j'ai deux messages d'erreur "Undefined index: id " et également "Trying to get property of non-object"

nom de la page: single.php 

<?php

$post = $db->prepare('SELECT * FROM articles WHERE id = ?', [$_GET['id']], 'app\Table\Article', true);
var_dump($post);
?>

<h1><?= $post->titre; ?></h1>

<p><?= $post->contenu; ?></p>

nom de la page: Database.php

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

Ce que je veux

Si vous pouviez me debloquer j'en serais ravi ! Merci à tous

Ce que j'obtiens

Notice: Undefined index: id in /home/pierre/PhpstormProjects/grafikart_blog/pages/single.php

Notice: Trying to get property of non-object in /home/pierre/PhpstormProjects/grafikart_blog/pages/single.php

7 réponses


Salut,

avant le prépare

$id = (isset($_GET['id'])) ? $_GET['id'] : 0;

@plus

Pierre

Salut

Pour le Trying to get property of non-object: Est ce que tu inclus bien le fichier Database.php avant ton script afin de récupérer $db ?

Pour le Undefined index: id: Tu dois visiter ta page avec l'id de ton article dans l'URL: single.php?id=XXX (remplacer XXX par l'identifiant de l'article).

Merci pour ta réponse , malheureusement ça n'a pas corrigé mon problème..

Salut G1.3, j'ai suivi la construction de l'autoload (et de tout le reste d'ailleurs) pour inclure mes pages, jusqu'ici je n'avais aucun probleme .. pour l'url j'ai verifié et j'ai exactement la même quand dans le tuto.. j'ai vu dans les commentaires qu'une personne avait exactement le même problème mais n'a apparemment pas trouvé de reponse..

$id = (isset($_GET['id'])) ? $_GET['id'] : 0;

$post = $db->prepare('SELECT * FROM articles WHERE id = ?', [$id], 'app\Table\Article', true);

Pour le Trying to get property of non-object, il est normal quand la requete ne retourne rien.

@plus.

Pierre

@Pierrot01: Pas con, je m'étais arrêté à la première var ($db) ^^

Bonjour d'pierrelambert41

@Pierrot01
je ne vois pas pourquoi on va sélectionner l'article dont l'id vaut 0, si on a rien dans $_GET['id'].
La requête SQL va juste nous retourner "false", et continuer de buter sur la 2ème erreur qu'a donné pierrelambert41.
Et il me semble que depuis php7 (ou 7.1), les conditions ternaires peuvent être écrite plus simplement :

$id = $_GET['id'] ?? 0;

Alors pour éviter de faire une requête SQL qui n'a pas de sens, plutôt :

$id = $_GET['id'] ?? 0;

if ($id != 0)
{
    $post = $db->prepare('SELECT * FROM articles WHERE id = ?', [$id], 'app\Table\Article', true);

    <h1><?= $post->titre; ?></h1>
    <p><?= $post->contenu; ?></p>
}
else
{
    // Gérer l'erreur comme on le souhaite
}

@pierrelambert41
Mais pour moi, la vraie chose importante ici,
c'est que tu comprenne bien toi-même les messages d'erreurs, pour pouvoir déboguer le code tout seul,
parce-que cette erreur était facile, et c'est important pour toi que tu y arrives tout seul pour les prochaines.

Je vois que tu as mis un var_dump($post) au début.
Pourtant la 1ère erreur dit :
Undefined index: id
Comme l'indice "id", n'est pas définit, la requête SQL ne fonctionne pas,
et du coup,
elle renvoie "false" (récupéré par "$post"),
et c'est pour ça qu'on a la 2ème erreure, qui dit qu'on essaie d'utiliser une méthode, sur quelque chose qui n'est pas un objet.

Donc, tout venait de l'indice "id", qui n'était définit pour le tableau "$_GET[]".