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

Posted

技术标签:

【中文标题】如何显示数据库中的文章?【英文标题】:How can I show articles from my database? 【发布时间】:2021-12-28 05:12:10 【问题描述】:

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

警告:未定义的数组键“article_id”在 C:\xampp\htdocs\php-projekti1\artikkeli-sivu.php 在第 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>

这里是 artikkeli-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>

这里是文章.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');

?>

【问题讨论】:

什么是“这个错误”?您能否以文本形式分享错误消息以及您尝试解决的方法? 这是错误:警告:第 74 行 C:\xampp\htdocs\php-projekti1\artikkeli-sivu.php 中的未定义数组键“article_id”。我试图检查一切是否在 artikkeli-sivu.php 中正确写入,因为我可以让文章显示在 index.php 中 请通过编辑为您的问题添加所有说明。此外,artikkeli-sivu.php 不包含任何可能触发该问题的第 74 行 我现在改了 您是否检查了$data 的值而不是检查$data['article_id']?也许你的查询由于某种原因没有工作,或者$data 是一个对象而不是一个数组。 【参考方案1】:

fetch_data函数中,这一行

return  $query->fetchAll();

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

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

两个可能的修复:

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

    &lt;?php echo $data[0]['article_id'];?&gt;

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

    return $query-&gt;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>

文档参考:

PDOStatement::fetchAll

PDOStatement::fetch

【讨论】:

以上是关于如何显示数据库中的文章?的主要内容,如果未能解决你的问题,请参考以下文章

如何把数据库中的数据显示到页面

PHP - 显示更多文章功能反馈

php中的分页显示

如何在Angularjs中显示文章中的有限字符?

Rails:我的显示视图中的“下一篇文章”和“上一篇文章”链接,如何?

如何访问 django 中的链接表