【问题标题】:delete a certain comment in comment-reply system in php在php的评论回复系统中删除某个评论
【发布时间】:2013-12-18 18:54:05
【问题描述】:

我在 php 中创建了一个评论回复系统。它类似于 facebook 中的墙。用户撰写评论,然后将其发布在“墙”中。我在我的数据库中使用以下表来保存 cmets:cmets(cmets_id, comment, comment_date, user, comment_hash, flash) 和保存用户详细信息的表 users:users(user_id, name,姓)。一切都很完美,唯一的问题是我无法删除某个评论。删除评论意味着在我的数据库中为此评论设置 flag=1。

每条评论都有一个名为“删除”的链接。当用户按下delete时,一个灯箱在javascript中启动,用户按下delete,函数“deletepost”被执行。我唯一的问题是此函数将 flag=1 设置为我的数据库中的所有 cmets,而不是为我按下删除的某些评论。知道如何改进我的代码吗?

我使用以下函数来显示 cmets:

<?php
function getComments(){    
  $session_user_id = $_SESSION['user_id'];
  $comments = "";
  $sql = mysql_query("SELECT * FROM comments WHERE (`flag`=0) ORDER BY comment_date DESC LIMIT 40") or die (mysql_error());

  if(mysql_num_rows($sql) == 0){
    $comments = "<div class='each_comment'>  Write your first posts ...</div> ";
  }
  else{

    while ($row= mysql_fetch_assoc($sql)) {
  $comment_id = $row['comments_id'];
      $hash = $row['comment_hash'];

      $personal_1 = mysql_query("SELECT `user_id`, `name`, `surname`, `email`, `profile` FROM `users` WHERE `user_id`='{$row['user']}' ");

        while ($run_personal_1= mysql_fetch_assoc($personal_1)) {
          $comment_user_id = $run_personal_1['user_id'];
          $comment_user_name = $run_personal_1['name'];
          $comment_user_surname = $run_personal_1['surname'];
        }

    // displays comment that includes user's name and surname and hash
    $comments .= " $comment_user_surname   $comment_user_name   $hash";
    $comments .= ".$row['comment'].";


//---- at this point I insert a delete link , that when user presses it a javascript light box ask user if wants to delete the comment. If user press the delete button it is called the function named "deletepost".

//---- first checks if the comment is from the user that is logged in ($session_user_id) in order to have the right to delete post

  if($comment_user_id == $session_user_id){
      if(isset($_POST['submit_2'])) {
        deletepost($session_user_id, $comment_id);
        header('Location: wall.php');
      } 

  $comments .= <<<EOD
  <a href="javascript:void(0)" onclick="document.getElementById('light').style.display='block';document.getElementById('fade').style.display='block'"> <font color='grey' >Delete</font> </a>
<div id="light" class="white_content">
    <form action="$_SERVER[PHP_SELF]" method="post">
    <input type="submit" name="submit_2" value="Delete Post ">
    </form>
    <a href="javascript:void(0)" onclick="document.getElementById('light').style.display='none';document.getElementById('fade').style.display='none'"><button>Cancel</button></a>
</div>
<div id="fade" class="black_overlay"></div>             
  EOD;
  }

  }
    return $comments;   
} 
?>

我使用以下函数来发布 cmets:

<?php
function postComments($comment){
    $comment = mysql_real_escape_string(strip_tags($comment));
        $session_user_id = $_SESSION['user_id'];
        $random_num = rand(0, 99999999999);
        $sql = mysql_query(" INSERT INTO `comments` (comment, comment_date, user, comment_hash) VALUES ('".$comment."', now(), '$session_user_id', '$random_num') ");
    return getComments();
}
?>

我使用以下函数来删除 cmets。删除 cmets 意味着我设置了 flag=1,并且在显示 cmets 的函数(函数 getComments)中,如果 flag 等于 1,我不显示此注释:

<?php
function deletepost($comment_user_id, $comment_id){
$get_hash = mysql_query("SELECT `comment_hash` from `comments` WHERE (`user`='$comment_user_id' AND `comments_id` = '$comment_id')  ");
        while ($run_hash= mysql_fetch_assoc($get_hash)) {
            $hash = $run_hash['comment_hash'];
        }
    $sql="UPDATE `comments` SET `flag`=1 WHERE (`user`='$comment_user_id' AND `comment_hash`='$hash')";
$result=mysql_query($sql) or die("Error when trying to delete...");
}
?>

【问题讨论】:

标签: javascript php


【解决方案1】:

我的第一直觉是猜测comment_hash 工作不正常,无论出于何种原因。尝试简化您的删除功能:

function deletepost($comment_user_id, $comment_id){
    $sql="UPDATE `comments` SET `flag`=1 WHERE (`user`='$comment_user_id' AND `comments_id`='$comment_id')";
    $result=mysql_query($sql) or die("Error when trying to delete...");
}

我不确定为什么您当前的删除函数会查询您的数据库以从表中获取散列,然后使用散列从同一个表中查找同一行。这似乎毫无意义且效率低下,并且引入了更多可能破坏的东西。

顺便说一句,Vascowhite 是正确的,你不应该使用旧的 mysql 库,但我认为改变它不会解决你的问题。

【讨论】:

  • 我已经尝试过了,但仍然将 flag=1 设置为我表中的所有 cmets。我看不出错误在哪里,这使它适用于所有人而不是某些评论
  • 嗯...您确定comment_id 正在正确初始化吗?如果您忘记将其设置为 AUTO_INCREMENT,则可能会发生这种情况。
  • 是的,我有它 AUTO_INCREMENT。我在我的数据库中看到我的表,并且我看到 cmets_id 为每个帖子获取不同的值。
  • 这个问题有没有可能来自javascript内部?
  • Javascript?仅当它以某种方式为每个评论发送单独的删除请求时,我认为这并非不可想象。查看您的页面发送的网络请求。
【解决方案2】:

在 deletepost 中,如果您一次删除一条评论,为什么要运行 while 循环来获取哈希。另一件事是 flag=1 发生在您的所有评论中,因为散列对于所有评论的用户来说可能很常见。您需要为特定用户的每条评论设置唯一的哈希值。

【讨论】:

  • 知道要写什么来改进吗?
  • 每当您插入针对特定用户的评论时,请在数据库中插入具有唯一哈希码的评论(例如将哈希码设为随机数),并在删除特定用户的评论时通过用户 id 和函数参数中的随机数以及相对于用户 id 和数字的更新标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2011-12-18
  • 2011-12-05
  • 1970-01-01
相关资源
最近更新 更多