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

时间:2011-08-28 03:03:18

标签: php mysql sql

我只是把一个评论系统放在一起。但是,我认为它可能是一种正统的。对于提交的评论,我使用$_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>';
        }
    }

?>

3 个答案:

答案 0 :(得分:4)

当您更多地寻找“方法”而不是代码时,我会尝试用不同的方式来帮助您查看事物,希望使您的编码更有经验,快速处理并且不那么复杂。

我假设您有一个博客,一个图库,一个评论网站或者您希望人们评论的那些“对象”。对于这个小教程,我们只需将它们称为评论(能够)对象,或简单“对象”。

它使逻辑表明您的网站或应用程序上的每个对象都有唯一的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, Child_Of 0也.. ..
  • 如果第三个用户对* John_Doe *的评论发表评论,则会有ID 4,和Child_Of 1 ..

当然,您可以使用时间戳按日期排序,当然也可以根据需要将其他字段添加到数据库中。可以通过IP地址,垃圾邮件防护,CAPTHAS等进行筛选。以上只是以轻松的代码方式做事的另一种方法。

最好的祝福\ Ruslan

答案 1 :(得分:2)

您正在检索每个页面加载的所有评论,然后确定要显示的评论。通过使用相同的$_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']

标识的评论

答案 2 :(得分:1)

它看起来应该可以正常运行,但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查询只会返回相应的注释。