Bonjour!
Je m'exerce sur l'architecture MVC en PHP et j'ai un petit soucis de variables...
Cela fait plusieurs jours que je bute sur ce problème sans trouver de solution...
J'ai beau arpenter les forums et autres articles, je ne trouve rien.
En gros, je ne comprends pas pourquoi les variables $post et $comments ne sont pas reconnues dans postView.php.

Voici mes codes:

index.php:

<?php
    require('model.php');

    $posts = getPosts();

    require('indexView.php');


post.php:

<?php
require('model.php');

if (isset($_GET['id']) && $_GET['id'] > 0)
{
    $post = getPost($_GET['id']);
    $comments = getComments($_GET['id']);
    require('postView.php');
}
else
{
    echo 'Error : no post id sent';
}


model.php:

<?php
function getPosts()
{
    $db = dbConnect();
    $req = $db->query('SELECT id, title, content, DATE_FORMAT(creation_date, \'%d/%m/%Y à %Hh%imin%ss\')
    AS creation_date_fr FROM posts ORDER BY creation_date DESC LIMIT 0, 5');

    return $req;
}

function getPost($postId)
{
    $db = dbConnect();
    $req = $db->prepare('SELECT id, title, content, DATE_FORMAT(creation_date, \'%d/%m/%Y à %Hh%imin%ss\')
    AS creation_date_fr FROM posts WHERE id = ?');
    $req->execute(array($postId));
    $post = $req->fetch();

    return $post;
}

function getComments($postId)
{
    $db = dbConnect();
    $comments = $db->prepare('SELECT id, author, comment, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\')
    AS comment_date_fr FROM comments WHERE post_id = ? ORDER BY comment_date DESC');
    $comments->execute(array($postId));
    
    return $comments;
}

function dbConnect()
{
    try
    {
        $db = new PDO('mysql:host=localhost;port=3308;dbname=blog;charset=utf8', 'root', '#');
        return $db;
    }
    catch(Exception $e)
    {
        die('Error : ' .$e->getMessage());
    }
}


indexView.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mon super blog</title>
</head>
<body>
    <h1>Mon super blog</h1>
    <p>Derniers billets du blog</p>

    <?php
        while ($data = $posts->fetch())
        {
        ?>
        <div class="news">
            <h3>
                <?= htmlspecialchars($data['title']); ?>
                <em>le <?= $data['creation_date_fr']; ?></em>
            </h3>
    
            <p>
            <?= nl2br(htmlspecialchars($data['content']));
            ?>
            <br>
            <em><a href="postView.php?posts=<?= $data['id']; ?>">Commentaires</a></em>
            </p>
        </div>
        <?php
        }
        $posts->closeCursor();
        ?>
</body>
</html>


postView.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mon super blog</title>
</head>
<body>
    <h1>Mon super blog!</h1>
    <p><a href="index.php">Retour à la liste des billets</a></p>

    <div class="news"> 
        <h3>
            <?= htmlspecialchars($post['title']) ?>
            <em>le <?= $post['creation_date_fr'] ?></em>
        </h3>
        <p>
            <?= nl2br(htmlspecialchars($post['content'])) ?>
        </p>
    </div>

    <h2>Commentaires</h2>

    <?php
    while ($comment = $comments->fetch())
    {
    ?>
        <p><strong><?= htmlspecialchars($comment['author']) ?></strong>
        le <?= $comment['comment_date_fr'] ?>
        </p>
        <p><?= nl2br(htmlspecialchars($comment['comment'])) ?></p>
    <?php
    }
    ?>
</body>
</html>



J'ai vérifié plusieurs fois les fautes que j'aurais pu faire dans les tables de ma BDD mais tout semble bon.
Et sur ma page j'ai ces erreurs qui s'affichent:

Notice: Undefined variable: post in C:\wamp64\www\blog\postView.php on line 14
Idem pour line 15 et 18.

Notice: Undefined variable: comments in C:\wamp64\www\blog\postView.php on line 25

Et ensuite une fatal error pour le fetch() de la ligne 25, liée à $comments.

Si vous avez une idée, je vous en remercie d'avance Smiley smile
Modifié par Stoneteckel (19 Jun 2020 - 10:39)
Je ne vois aucun "require" ou "include" dans postView.php comment ces variables pourraient être connues ?
J'ai bien peur de ne pas comprendre.
Il n'y ni "require" ni "include" dans indexView.php non plus et ça fonctionne.
J'ai l'impression de passer à coté de quelque chose, je ne suis pas au point haha
le message d'erreur c'est

Notice: Undefined variable: post in C:\wamp64\www\blog\postView.php on line 14
Idem pour line 15 et 18.

Notice: Undefined variable: comments in C:\wamp64\www\blog\postView.php on line 25

On en déduit qu'au moment de l'exécution de postView ces variables ne sont pas connues.

J'ai donc cherché comment il pouvait les connaitre et ma première réflexion c'est "postView" ne connait que lui même" puisqu'il ne fait pas de require ou équivalent pour que les données $post et $comments soient connues.

En fait ce n'est pas vrai: postView est "appelé" par require('postView.php'); dans post.php
Il doit donc connaître toutes les variables connues de post.php au moment de

if (isset($_GET['id']) && $_GET['id'] > 0)
{
    $post = getPost($_GET['id']);
    $comments = getComments($_GET['id']);
    require('postView.php');
}

donc il devrait connaître ces variables, j'ai tout faux!
Désolé!
Modifié par PapyJP (19 Jun 2020 - 13:07)
Modérateur
Et l'eau,

Stoneteckel a écrit :
J'ai bien peur de ne pas comprendre.
Il n'y ni "require" ni "include" dans indexView.php non plus et ça fonctionne.
J'ai l'impression de passer à coté de quelque chose, je ne suis pas au point haha

Stoneteckel a écrit :

index.php:

<?php
    require('model.php');
    $posts = getPosts();
    require('indexView.php');



Voilà pourquoi indexView.php fonctionne et non postView.php Smiley cligne
Modifié par niuxe (19 Jun 2020 - 18:47)
Finalement j'ai trouvé la solution par le biais d'un autre forum.
En fait c'est mon "a href" sur indexView.php qui pose problème.
Je le fais renvoyer postView.php alors qu'il faut l'envoyer sur post.php.

a href="post.php?id=<?= $data['id']; ?>

Voilà! Merci en tout cas!
Modifié par Stoneteckel (20 Jun 2020 - 17:26)