我的php,jquery注释系统无法按正确的顺序显示注释


my php, jquery comment system cannot display comments in right order

我试图创建一个使用facebook的评论系统。我使用php和jquery。我的代码运行得很好。用户在文本区写了一些东西,comment_1并发布。comment_1成功出现在文本区的正下方。如果我刷新页面,我可以看到开始时发布的comment_1。如果我试图发布一个新的评论(comment_2),那么comment_2会出现在comment_1下,comment_1会再次出现在comment _2下。例如:

开始时:comment_1

刷新并发布新评论后:comment_1/注释_2评论_1正如您所看到的,刷新页面后,它会将comment_2和comment_1放在页面下方,但也会将comment _1放在它们上方(就像将comment_1保存在"内存"中一样)。如果我刷新页面,我会得到comment_2 comment_1,这是我最终想要的,但如果不刷新,我怎么能做到这一点?这是我的代码:

wall.php

<?php
<script> 
$(document).ready(function(){                           
$("#comment_process").click(function(){
    if($("#comment_text").val() != ""){ 
        $.post("comments.php?action=post", { comment: $("#comment_text").val() }, function(data) {
            $(".comments").html(data);
            $("#comment_text").val("");
        });
    } 
});   
});   
</script>

<div class="comment_container">
<div class="comment_form">
<textarea id="comment_text" ></textarea>
<input type="button" id="comment_process" value="Post"/>
</div>
</div>
<?php include_once("comments.php");?>
<div class="comments">   </div>
?>

这是评论.php

<?php
function getComments(){
$comments = "";
        // use desc order by date in order to display comments by date
        $sql = mysql_query("SELECT * FROM comments ORDER BY comment_date DESC ") or die (mysql_error());
        if(mysql_num_rows($sql) == 0){
                $comments = " <div class='each_comment'> There are no comments ...</div> ";
        }else{
            while ($row= mysql_fetch_assoc($sql)){          
                $comments .= "<fieldset> Stefanos Says : <div class='each_comment'>  <small><em> ".$row['comment_date']." </em></small><br />".$row['comment']."</div></fieldset>  </br>"; 
            }
        }
        return $comments;  
    }

function postComments($comment){
        $comment = mysql_real_escape_string(strip_tags($comment));
        $sql = mysql_query(" INSERT INTO `comments` (comment, comment_date) VALUES ('".$comment."', now()) ");
        return true;
    }

    if((isset($_GET['action'])) && ($_GET['action'] == "post")) {
        postComments($_POST['comment']);
    }
echo getComments();
?>

注释显示错误的问题

这里的问题是你没有清除原始评论。

<?php include_once("comments.php");?>移动到此分区:

<div class="comments"> </div>

这样,当您使用javascript向该块写入注释时,加载页面时加载的原始注释将被替换。

MySQL注入和mysql扩展存在明显问题

正确做法

应该如何为SELECT语句清理字符串:

$data = mysql_real_escape_string($_POST['some_data']);
$query = mysql_query("SELECT * FROM some_table WHERE some_value = '$data'");

应该如何为SELECT语句清除整数:

$data = (int) $_POST['some_data'];
$query = mysql_query("SELECT * FROM some_table WHERE some_value = $data");

请注意,整数周围没有引号。

明显的漏洞

Mathew在评论中正确地指出,这种select语句(由ircmaxell演示)不会正确地防止SQL注入攻击:

$data = mysql_real_escape_string($_POST['some_data']);
$query = mysql_query("SELECT * FROM some_table WHERE some_value = $data");

然而,这与其说是一个漏洞,不如说是对函数的滥用,因为我们没有在$data周围加引号,这表明我们正在搜索一个整数,但我们已经将输入当作字符串进行了净化。

如果它是一个整数字段,我们应该将输入值强制转换为整数。如果它是一个字符串字段,那么查询中应该在它周围加引号。这里显示的只是一个函数可能被错误地使用。

由于SELECT语句不接受任何用户输入,只选择ALL注释,因此无论如何都没有进行这种注入的机会。