我只是把一个评论系统放在一起。但是,我认为它可能是一种正统的。对于提交的评论,我使用$_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>';
}
}
?>
答案 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的注释意味着你的对象的主要注释线程
示例:
当然,您可以使用时间戳按日期排序,当然也可以根据需要将其他字段添加到数据库中。可以通过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查询只会返回相应的注释。