在PHP中构建一个注释系统,决定采用哪种方法


Building a comment system in PHP, deciding which approach to take

我只是拼凑了一个小小的评论系统。但是,我认为这可能有点另类。对于提交的评论,我使用$_SERVER['SCRIPT_NAME']并将其存储为varchar。然后,如果记录的评论位置/varchar与当前活动页面匹配,则显示评论。这是一个好方法吗?还有其他的方法来解决这个问题吗?谢谢你。

<?php
require('inc/connect.inc.php');
require('inc/core.inc.php');
?>
<form action="<?php echo $current_file; ?>" method="post">
<input type="hidden" name="page" />
Name:<br /><input type="text" name="name" /><p>
Comment:<br /><textarea rows="8" cols="45" name="comment"></textarea><p>
<input type="submit" value="submit" />
</form>
<?php
$page_on = $_SERVER['SCRIPT_NAME'];
if(isset($_POST['page'])&&isset($_POST['name'])&&isset($_POST['comment'])) {
    $page = $_POST['page'];
    $name = $_POST['name'];
    $comment = $_POST['comment'];
    $page = $_SERVER['SCRIPT_NAME'];
    if(!empty($page)&&!empty($name)&&!empty($comment)) {
        $query = mysql_query("INSERT INTO comments VALUES ('','".mysql_real_escape_string($name)."','".mysql_real_escape_string($comment)."','".mysql_real_escape_string($page)."')");
        }
    }

echo '<br /><br />';

$result = mysql_query("SELECT * FROM comments ORDER BY id DESC");
while($row = mysql_fetch_assoc($result)) {
    $name = $row['name'];
    $comment = $row['comment'];
    $currentfile = $row['currentfile'];
        if($page_on==$currentfile) {
        echo $name.'''s comment:<br />'.$comment.'<p>';
        }
    }
?>

当你更多地寻找"一种方法"而不是代码时,我将尝试帮助你用不同的方式来看待事物,希望使你的编码更有经验,快速处理,不那么复杂。

我假设你有一个博客,一个画廊,一个评论网站或任何你想让人们评论的"对象"。在这个小教程中,让我们称它们为注释(able)对象,或者简单的"对象"。

它使逻辑上的每个对象在你的网站或应用程序将有一个唯一的ID,或URL或任何其他标识符,你建立你的查询,正确吗?在这个小教程中,我们将其称为对象的ID。

现在,创建一个非常小的SQL表,命名为'user_comments',结构如下:

ID: the comment's ID
Object_ID: The object being commented
Authod_ID: username, email, or a user's id
TimeStamp: some date or timestamp
Child_OF: INT(11)

这里的技巧/花招存在于*Child_Of*属性中,它将负责对注释的层次结构进行分类。让我们看看:

——每个带有Child_OF=0的注释都是对象的主注释线程

例子:

  • 如果用户*John_Doe*发表评论,它的ID将为1
  • 如果另一个用户做了一个独立的评论,它将有一个ID 2,
  • 如果第三个用户评论*John_Doe的*评论,那将有ID

当然,您可以使用时间戳来按日期排序,当然还可以在您认为合适的情况下向数据库添加其他字段。这可以通过IP地址、垃圾邮件保护、CAPTHAS等进行筛选。以上只是另一种以轻松的代码方式做事的方法。

祝福' Ruslan

您正在检索每次页面加载时的所有评论,然后确定要显示哪些评论。通过使用相同的$_SERVER['SCRIPT_NAME']:

,只检索实际需要的内容要好得多(代码也更简单)。
$result = mysql_query("SELECT * FROM comments WHERE currentfile='" . mysql_real_escape_string($_SERVER['SCRIPT_NAME']) . "' ORDER BY id DESC");

这消除了在获取while循环中检查是否显示注释的需要,因为您只提取了需要的注释。随着数据库大小的增加,它的可扩展性也会大大提高——在每次页面加载时检索所有行是非常低效的。

然而,使用$_SERVER['SCRIPT_NAME']作为唯一标识符有点奇怪。但是,如果页面名称是唯一的,并且将保持唯一,也就是说,您永远不会打算在每个页面上显示多个文章/主题,并且始终保持相同的URL结构,它应该工作得很好。更正统的方法是维护某种标识符作为URL的一部分:

yourarticle.php?id=12345

…并存储/检索$_GET['id']

标识的注释

它看起来应该工作正常,只是你的SQL效率低下。你应该改成这样:

$result = mysql_query("SELECT * FROM comments WHERE currentfile = '".mysql_real_escape_string($page_on)."' ORDER BY id DESC");
while($row = mysql_fetch_assoc($result)) {
    $name = $row['name'];
    $comment = $row['comment'];
    echo $name.'''s comment:<br />'.$comment.'<p>';
}

在sql查询中使用WHERE子句可以只选择属于当前页面的注释。这样就不需要使用if检查来查看评论是否属于该页,因为sql查询将只返回适当的评论。