0

提前致谢!

我有一个简单的 mysql 和 php 博客,它是根据我在网上找到的教程构建的。我希望能够做的,但不知道如何去做,是这样的:

我希望在每个帖子的每条评论中都显示一张图片(头像)。选择的图片将基于评论的“发布者:”区域中的名称。例如:假设我,管理员,在线程上发表评论。我的名字是通过“$_SESSION”变量自动输入的,所以我不必担心每次都输入它。当评论显示在博客线程页面上时,它会显示评论者:管理员。此名称存储在 db 中,并通过 php echo 语句拉入。

所以我希望这个头像代码能够做的是 1)查看评论者:文本所在的区域 2)阅读文本 3)看到它说 Admin 并在它旁边显示 admin.png 图像。如果它在评论者:区域中看到管理员以外的任何内容,那么它将显示类似 guest.png 的内容

这是我在 stackoverflow 和 google 搜索中找到的一段代码。它可以工作,但它会拉入 6 次来宾图像,然后是实际的 admin.png 图像,然后再拉入 3 次来宾图像。它以这种方式显示在每个线程的每个评论上!当我向该线程添加新线程和新评论时,它会在每个评论上显示的多个图像的末尾再次添加来宾图像。我设置错了吗?

<?
$sql = "SELECT comment_user FROM comments";
$result = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($result) != 0) {
    $counter = $starting + 1;
    $pathImg = "images/";
    while ($row = mysql_fetch_array($result)) {
        //calculate url image
        $pathFile = $pathImg . $row['comment_user'] . ".png";
        if (!file_exists($pathFile)) {
            $pathFile = $pathImg . "guest.png";
        }
        ?>
<img src="<?=$pathFile?>" alt="<?=$row['comment_user']?>">
</p>
<?
       $counter++;
    }
}
?>

这显示为 (Guest Image)(Guest Image)(Guest Image)(Guest Image)(Guest Image)(Guest Image)(Admin Image)(Guest Image)(Guest Image)(Guest Image)。

将某些东西放在一起的任何帮助都会很棒!尽量保持简单!

编辑:

这就是评论的显示方式,以及 FlyingGuy 答案中的代码。

<?php

foreach ($post['comments'] as $comment){

$commentCount = 0 ;
$sql = "SELECT comment_user FROM comments";
$result = mysql_query($sql) or die(mysql_error());

while ($row = mysql_fetch_array($result)) {
$commentCount++ ;   
$pathImg = "images/";  
$pathFile = $pathImg . $row['comment_user'] . ".png";

if (!file_exists($pathFile)) {
$pathFile = $pathImg . "guest.png";
}

echo "<img src=\"". $pathFile ."\" alt=\"". $row['comment_user'] ."\"\><br>";

}
?>
<h4>By <?php echo $comment['user']; ?> on <?php echo $comment['date']; ?></h4>
<p><?php echo $comment['body']; ?></p>
<hr />

<?php

}

?>

这就是函数显示和添加注释的方式:

function get_comments($pid){

$pid = (int)$pid;

$sql = "SELECT `comment_body` AS `body`, `comment_user` AS `user`, DATE_FORMAT(`comment_date`, '%m/%d/%Y') AS`date` FROM `comments` WHERE `post_id` = {$pid}";

$comments = mysql_query($sql);

$return = array();
while (($row = mysql_fetch_assoc($comments)) !== false){
$return[] = $row;
}

return $return;

}

// adds a comment
function add_comment($pid, $user, $body){

if (valid_pid($pid) === false){
return false;
}

$pid = (int)$pid;

$user = mysql_real_escape_string(htmlentities($user));
$body = mysql_real_escape_string(nl2br(htmlentities($body)));

mysql_query("INSERT INTO `comments` (`post_id`, `comment_user`, `comment_body`, `comment_date`) VALUES ({$pid}, '{$user}', '{$body}', NOW())");
return true;
}

?>
4

1 回答 1

1

看看您正在尝试做的是选择与结果集中当前行中的用户名匹配的图像。因此,您将为每一行设置适当的图像文件变量,并将其发送到浏览器。

对于初学者,可以在此处查看案例问题的可能性。是否所有用户名都强制小写,所有图像名称都强制小写?如果这是在 Windows 上的地雷的 linux 机器上,则不是那么多,但应该考虑到这一点。

它将为查询结果集的每一行设置一个图像名称,如下所示:

[图片] [评论]
[图片] [评论]
[图片] [评论]

如果您的结果集中有三行。

就我个人而言,我避免到处打开和关闭 php。连接一个字符串,然后简单地为每一行回显它。所以我会这样编码:

<?
$commentCount = 0 ;
$sql = "SELECT comment_user FROM comments";
$result = mysql_query($sql) or die(mysql_error());

while ($row = mysql_fetch_assoc($result)) {
   $commentCount++ ;     
   $pathFile = $pathImg . $row['comment_user'] . ".png";

   if (!file_exists($pathFile)) {
    $pathFile = $pathImg . "guest.png";
   }

   echo "<img src=\"". $pathFile ."\" alt=\"". $row['comment_user'] ."\"\><br>";

}

所以我已经从你的代码示例中删除了很多东西,比如计数器等。你真的不需要检查是否有行,因为 while 循环根本不会执行没有行,所以你只会有一个问题没有下级评论的评论,只有有评论才会发送图片链接。

不,如果是我这样做,我会创建一个头像文件,名称是用户表,并将路径存储为系统配置的一部分,这将是始终存在的全局变量集的一部分。然后,您的查询将加入 users 表,并且图像名称或访客图像将出现在您的结果集中。更复杂但简洁,它简化了您的代码。

我不喜欢动态类型的原因之一。$row 被变异为所有行的数组..

于 2011-11-06T17:16:17.690 回答