【问题标题】:Why can't I found the page of the post ine a blog?为什么我在博客中找不到帖子的页面?
【发布时间】:2021-07-15 14:00:24
【问题描述】:

我的代码有问题。我正在尝试实现一个简单的博客。显示所有帖子的列表有效。但是当我点击特定帖子时,该帖子的页面不起作用。

这是我的文件夹的结构

这是我的 index.php

<?php
require_once('controleurs/Controleur.php');
require_once('modeles/Modele.php');
require_once('modeles/Photo.php');
require_once('modeles/Photos.php');
$controleur = new Controleur();
if (isset($_GET['page']) && 'photo' === $_GET['page']) {
    $controleur->afficherPhoto();
} else {
    $controleur->listerPhotos();
}

这是我的 Controleur.php :


class Controleur
{
    public function listerPhotos()
    {
        $photos = new Photos();
        $photos = $photos->listerPhotos();
        require_once('vues/liste-photos.php');
    }

    public function afficherPhoto()
    {
        $photo = new Photo();
        if (isset($_GET['id']) && is_numeric($_GET['id'])) {
            $photo = $photo->afficherPhoto($_GET['id']);
        }
        require_once('vues/affiche-photo.php');
    }
}

这是 Photo.php 类


class Photo
{
    use Modele;

    private $id;

    private $fichier;

    private $titre;

    public function afficherPhoto($id)
    {
        if (!is_null($this->pdo)) {
            $stmt = $this->pdo->prepare('SELECT * FROM photo WHERE id = ?');
        }
        $photo = null;
        if ($stmt->execute([$id])) {
            $photo = $stmt->fetchObject('Photo');
            if(!is_object($photo)) {
                $photo = null;
            }
        }

        return $photo;
    }

    public function getId()
    {
        return $this->id;
    }

    public function getFichier()
    {
        return $this->fichier;
    }

    public function getTitre()
    {
        return $this->titre;
    }
}

这是我的 liste-photos.php(它有效!)

<?php
$titre = 'Mon book';
ob_start();
?>
  <article>
    <?php foreach ($photos as $photo): ?>
      <a href="photo.php?id=<?= $photo->getId() ?>">
      <img src="photos/<?= $photo->getFichier() ?>" width="250"/>
      </a>
      <h2><?= $photo->getTitre() ?></h2>
    <?php endforeach; ?>
  </article>
  <?php
$contenu = ob_get_clean();
require_once('layout.php');

这是我的 affiche-photo.php(它不起作用!):

$titre = 'Une photo de mon book';
if (is_null($photo)):
    $contenu = "Cette photo n'existe pas.";
else:
    ob_start();
?>
        <article>
            <img src="photos/<?php $photo->getFichier(); ?>" width="500" />
            <h2><?php $photo->getTitre(); ?></h2>
        </article>
<?php
    $contenu = ob_get_clean();
endif;
require_once('layout.php');

如果你能帮忙,谢谢!!!

【问题讨论】:

  • 什么确切不起作用?您尝试过什么来解决问题?
  • 我有我的 index.php 以及所有帖子的列表。当我单击其中一个时,我想查看帖子的页面(使用 url 中的 id)。但是我有一个错误,找不到 URL BookPhoto/photo.php?id=1
  • 您在照片页面上收到 500 错误代码还是 200?你在那里看到任何信息吗?那里不存在哪些信息?
  • 它告诉我:未找到 在此服务器上未找到请求的 URL。 Apache/2.4.46 (Win64) OpenSSL/1.1.1h PHP/8.0.1 服务器在 localhost 端口 80
  • Ì 认为我的代码没有写出好的 url 但我不明白为什么

标签: php model-view-controller


【解决方案1】:

您没有看到结果的主要原因是您没有打印值。您使用了&lt;?php $value ?&gt; 而不是&lt;?php echo $value; ?&gt;。 另外,根据fetchObject中的官方文档

class Photo
{
    use Modele;

    private $id, $fichier, $titre; 
  
    private function __construct () {}

    public function afficherPhoto($id)
    {
        if (!is_null($this->pdo)) {

            $stmt = $this->pdo->prepare('SELECT * FROM photo WHERE id = ?');

            if ($stmt->execute([$id])) {
                return $stmt->fetchObject(__CLASS__);
            }
        }

        return null;
    } 
}

在控制器方法中:

    public function afficherPhoto()
    {
        $photo_cl = new Photo();
        $photo = null;
        if (isset($_GET['id']) && is_numeric($_GET['id'])) {
            $photo = $photo_cl->afficherPhoto((int)$_GET['id']);
        }
        require_once('vues/affiche-photo.php');
    }

在视图文件affiche-photo.phpfichiertitre必须对应DB表字段名):

        <article>
            <img src="photos/<?= $photo->fichier; ?>" width="500" />
            <h2><?= $photo->titre; ?></h2>
        </article>

【讨论】:

  • 我使用了你的代码,但我仍然有同样的问题
  • 好的,使用print_r($photo) / var_dump($photo) 调试它并显示返回您的数据库请求的内容。将其放入else {} 部分。然后验证你的 URL 链接src="photos/object_property_value_fichier",它应该返回一个图像。
  • 它告诉我变量 $photo 没有在第 3 行的 C:\xampp\htdocs\BookPhoto\vues\affiche-photo.php 中定义
  • 那是因为afficherPhoto方法从DB返回了一个对象,它不是class Photo的类实例。我会更新我的答案。
【解决方案2】:

谢谢 问题确实出在回声上。我终于改变了我的 affiche-photo.php :

<?php
$titre = 'Une photo de mon book';
if (is_null($photo)):
    $contenu = "Cette photo n'existe pas.";
else:
    ob_start();
?>
        <article>
            <img src="photos/<?php echo $photo->getFichier(); ?>" width="500" />
            <h2><?php echo $photo->getTitre(); ?></h2>
        </article>
<?php
    $contenu = ob_get_clean();
endif;
require_once('layout.php');

还有我的 liste-photos.php,我在其中更改了 href 中的路径:

<?php
$titre = 'Mon book';
ob_start();
?>
  <article>
    <?php foreach ($photos as $photo): ?>
      <a href="?id=<?= $photo->getId() ?>">
      <img src="photos/<?= $photo->getFichier() ?>" width="250"/>
      </a>
      <h2><?= $photo->getTitre() ?></h2> 
    <?php endforeach; ?>
  </article>
  <?php
$contenu = ob_get_clean();
require_once('layout.php');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多