评论打印不止一次

时间:2013-11-22 18:50:22

标签: php mysql pdo

我在Youtube上按照phpacademy的教程制作了CMS,现在我通过添加评论来扩展它。

我让它用数据打印数据库中的数据。

然而,它不止一次打印。

代码:

Article.php (我在哪里打印文章)

<?php

include_once('includes/connection.php');
include_once('includes/article.php');
include_once('includes/comments.php');

$article = new Article;
$comment = new Comment;

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

<html>
    <head>
        <title>CMS</title>
        <link rel="stylesheet" type="text/css" href="assets/style.css">
    </head>
    <body>
        <div class="container">
            <a href="index.php" id="logo">CMS</a>

            <h4><?php echo $data['article_title']; ?> - <small>posted <?php echo date('l jS', $data['article_timestamp']); ?></small></h4>
            <div id="content">
                <p><?php echo $data['article_content'] ?></p>
            </div>
            <a href="index.php">&larr; Back</a><br>
            <div id="comments">
                <?php 

                foreach($comments as $comment){
                    ?>
                    <div class="comment">
                        <span class="poster">Posted <?php echo date('l jS', $comments['comment_timestamp'])." by ".$comments['poster_name']; ?></span>
                    <?php echo $comments['comment_content']; ?>

                    </div>
                <?php   
                }

                ?>
            </div>
        </div>
    </body>
</head>

<?php

}else{
    header('Location: index.php');
    exit();
}

?>

包括/的comments.php

<?php

class Comment{
    public function fetch_all(){
        global $pdo;

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

        return $query->fetchAll();
    }

    public function fetch_data($post_id){
        global $pdo;
        $query = $pdo->prepare("SELECT * FROM comments WHERE post_id = ?");
        $query->bindValue(1, $post_id);
        $query->execute();

        return $query->fetch();
    }
}

?>

如果您需要更多代码,或者我更详细地解释我的问题,请发表评论。

2 个答案:

答案 0 :(得分:1)

我认为您的$comments数组不包含您认为包含的内容。

现在它包含一个数据库行的数组,可能是一行包含5列数据。

这是因为$comment->fetch_data($id)只会从数据库中获取单行数据。这是一种设计糟糕的方法。

因此$comments数组看起来像这样:

[
  0 => 'field 1 value',
  1 => 'field 2 value',
  ...
  4 => 'field 4 value',
 'field 1 name' => 'field 1 value',
  ...
  'field 5 name' => 'field 5 value'
]

请注意,它将包含数字和关联索引,因为您使用的是默认的PDO获取模式(通常配置为获取数字和关联索引)。

当你循环$comments时,你实际上正在循环遍历这些值,因为你试图从$comments输出数据而不是本地为你的循环定义的l $comment。因此,您实际上是在访问此$comments数组中的关联键。

您要做的是更改您的获取方法以获取数据库结果集中的所有行。这可能是这样的:

public function fetch_data($post_id){
    global $pdo;
    $query = $pdo->prepare("SELECT * FROM comments WHERE post_id = ?");
    $query->bindValue(1, $post_id);
    $query->execute();

    $rows = array();
    while($row = $query->fetch(PDO::FETCH_ASSOC)) {
        $rows[] = $row;
    }
    return $rows;    
}

然后你需要更改循环中的echo语句,以实际从$comment(为循环定义的局部变量名)而不是$comments回显。

答案 1 :(得分:0)

您需要使用以下功能编辑检索评论的方式:

public function fetch_data($post_id){
    global $pdo;
    $query = $pdo->prepare("SELECT * FROM comments WHERE post_id = ?");
    $query->bindValue(1, $post_id);
    $query->execute();

    return $query->fetch();
}

应该类似于:

public function fetch_data($post_id){
    global $pdo;
    $query = $pdo->prepare("SELECT * FROM comments WHERE post_id = ?");
    $query->bindValue(1, $post_id);
    $query->execute();
    $results = array();
    while($row = $query->fetch()){
        $results[] = $row;
    }
    return $query->fetch();
}

然后它应该正常工作,因为你应该

您之前的阵列是:

$comments = array(
    'comment_id' => '1',
    0 => '1',
    'poster_name' => 'Mackan90096',
    1 => 'Mackan90096',
    'comment_content' => 'Hi! This is a test comment!',
    2 => 'Hi! This is a test comment!',
    'comment_timestamp' => '1385144211',
    3 => '1385144211',
    'post_id' => '4',
    4 => '4'
);

现在它将是:

$comments = array(
    0 => array(
        'comment_id' => '1',
        0 => '1',
        'poster_name' => 'Mackan90096',
        1 => 'Mackan90096',
        'comment_content' => 'Hi! This is a test comment!',
        2 => 'Hi! This is a test comment!',
        'comment_timestamp' => '1385144211',
        3 => '1385144211',
        'post_id' => '4',
        4 => '4'
    )
);

注意:使用$comments as $comment作为您的foreach参数并不好,因为$ comment会覆盖您的Comment类变量以供日后使用。