如何显示数据库中的文章?

How can I show articles from my database?

我正在尝试制作一个在 index.php 中显示新帖子的文章发布系统,当您单击其中一个时,它会将您带到显示整篇文章的 artikkeli-sivu.php。出于某种原因,我无法让文章在 artikkeli-sivu.php 上显示,但我可以在 index.php 上显示。 artikkeli-sivu.php 给我这个错误:

Warning: Undefined array key "article_id" in C:\xampp\htdocs\php-projekti1\artikkeli-sivu.php on line 74.

下面是 index.php,connection.php 这里是 table

<?php

include_once('connection.php');
include_once('article.php');


$article = new Article;
$artikkelit = $article->fetchAll();

?>
<!DOCTYPE html>
<html>
    <head>
        <title>CMS projekti</title>
        <link rel="stylesheet" type="text/css" href="style.css"> 
        <meta charset="UTF-8">
    </head>
    <body>
    <div class="container">
        <a id="otsikko" href="index.php">CMS</a>
        <ol>
            <?php foreach ($artikkelit as $artikkelii) { ?>
            <li>
                <a href="artikkeli-sivu.php?id=<?php echo $artikkelii['article_id']; ?>">
                <?php echo $artikkelii['article_title']; ?> 
                </a><br>
                postattu: <?php echo date('l jS', $artikkelii['article_timestamp']); ?>
            </li>
            <?php } ?>
        </ol>
    </div>      
        
    </body>
</html>

这是艺术作品-sivu.php

<!DOCTYPE html>
<?php

include_once 'connection.php';
include_once 'article.php';

$article = new Article;


if(isset($_GET['id'])) {
    $id = $_GET['id'];
    $data = $article->fetch_data($id);
}

    


?>
<html>
<head>
<meta charset="UTF-8">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet">
<style>
    body, html {
        margin: 0;
        padding: 0;
        text-align: center;
    }
    .back-button {
        position: relative;
        top: 500px;
        width: 140px;
        height: 45px;
        border-radius: 25px;
        font-size: 18px;
        font-family: 'Roboto', arial;
        font-weight: 500;
        
        letter-spacing: 2px;
        background-color: white;
        box-shadow: 0px 8px 15px rgba(0, 0, 0, 0.1);
        border: none;
        transition: 0.3s ease 0s;
        cursor: pointer;
        outline: none;
    }
    .back-button:hover {
        background-color: #24a0ed;
        box-shadow: 0px 5px 20px #6bbff2;
        color: #fff;
        transform: translateY(-3px);
    }

    .article-container {
        background-color: white;
        width: 500px;
        height: 400px;
        margin: 0 auto;
        box-shadow: 0px 0px 1px 1px lightgrey;

    }
    h1 {
        text-align: center;
        font-family: 'Roboto', sans-serif;
        font-weight: 500;
    }
</style>
</head>
<body>
<h1> Artikkelit </h1>
<div class="article-container">
    <?php echo $data['article_id'];?>
    
</div>

<a class="back-link" href="index.php"><button class="back-button">Back</button></a>
</body>
</html>

这里是article.php

<?php


class Article {
    public function fetchAll(){
global $pdo;

$query = $pdo->prepare("SELECT * FROM artikkelit");
$query->execute();

return  $query->fetchAll();
     
    }
    public function fetch_data($article_id){
        global $pdo;
            $query = $pdo->prepare("SELECT * FROM artikkelit WHERE article_id= ?");
            $query->bindValue(1, $article_id);
            $query->execute();
    
            return  $query->fetchAll();
         
    }
}

?>

这是connection.php

<?php
$servername = "localhost";
$username = "root";
$password = "";
$database = "cms";

try {
    $pdo = new PDO('mysql:host=localhost;dbname=cms', 'root', '');
    echo "<h3>Yhteys luotu!</h3>";
} catch(PDOException $e) {
    exit('Epäonnistui');
}
?>

fetch_data函数中,这一行

return  $query->fetchAll();

returns 查询选择的所有行。因为它不知道是否会有 0、1 或更多行,所以它 returns 一个行数组。因此,即使在您的情况下您只期望 1 行,您也会得到一组行。

因此,$data['article_id'] 将不起作用,因为 $data 不是具有命名属性的单个行,它是一个行数组。您可以使用 var_dump($data); 调试并查看结构。

两个可能的修正:

  1. 快速而肮脏 - 只需从数组中获取第一行并从中回显文章 ID:

    <?php echo $data[0]['article_id'];?>

  1. 更整洁一些 - 让您的 fetch_data 函数只从数据库中检索一行:

    return $query->fetch(PDO::FETCH_ASSOC);

此外,您应该在尝试访问之前检查 $data 是否已填充 - 否则,如果 URL 不包含 ID,或者 ID 不包含,您将收到错误或警告数据库中不存在。

例如(假设您使用了上面的选项 2)

<div class="article-container">
    <?php 
    if (isset($data) {
      echo $data['article_id'];
    }
    else
    {
      echo "No data found";
    }
    ?>
</div>

文档参考: