我在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">← 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();
}
}
?>
如果您需要更多代码,或者我更详细地解释我的问题,请发表评论。
答案 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
类变量以供日后使用。