如何限制用户每天发布的评论的评论数量或回复数量

时间:2012-04-05 17:24:41

标签: php limit insert-query

我的社交网络上有评论部分和评论部分的回复。我们在手动垃圾邮件发送者方面遇到了一些问题,我打算限制某人每天发布的评论数量。

以下是对评论的插入查询和对评论的回复:

//COMMENTS

$query = "INSERT INTO `CysticAirwaves` ( 
                                        `FromUserID`,
                                        `ToUserID`,
                                        `comment`,
                                        `status`,
                                        `statusCommentAirwave`,
                                        `date`,
                                        `time`

                                ) VALUES (

                                    '" . $auth->id ."',
                                    '" . $prof->id ."',
                                    '" . mysql_real_escape_string($_POST['ProfileComment']) ."',
                                    'active',
                                    'active',
                                    '" . date("Y-m-d") . "',
                                    '" . date("G:i:s") . "')";
    mysql_query($query,$connection); 

    if($auth->id == $prof->id) {
        $just_inserted = mysql_insert_id();
        $query = "UPDATE `CysticAirwaves` SET `status` = 'dead' WHERE `FromUserID` = '" . $auth->id . "' AND `ToUserID` = '" . $prof->id . "' AND `id` != '" . $just_inserted . "'";
        $request = mysql_query($query,$connection);
}

//REPLIES

$query = "INSERT INTO `CysticAirwaves_replies` (
                                    `AirwaveID`,
                                    `FromUserID`,
                                    `comment`,
                                    `status`,
                                    `date`,
                                    `time`
                                ) VALUES (
                                    '" . mysql_real_escape_string($_POST['comment']) . "',
                                    '" . $auth->id . "',
                                    '" . mysql_real_escape_string($_POST['reply']) . "',
                                    'active',
                                    '" . date("Y-m-d") . "',
                                    '" . date("G:i:s") . "'
                                    )";
    mysql_query($query,$connection);

    $mailto = array();

    /* get the person that wrote the inital comment */
    $query = "SELECT `FromUserID` FROM `CysticAirwaves` WHERE `id` = '" . mysql_real_escape_string($_POST['comment']) . "' LIMIT 1";
    $request = mysql_query($query,$connection);
    $result = mysql_fetch_array($request);
    $comment_author = new User($result['FromUserID']);

提前致谢

4 个答案:

答案 0 :(得分:3)

您可以执行选择以查看该用户当前日期已有多少条目:

SELECT COUNT(*)
FROM   CysticAirwaves
WHERE  userid = $auth->id
  AND  date = CURDATE()

如果数字低于您的阈值,则仅执行INSERT。或者,您可以在每个INSERT执行此检查的INSERT上设置触发器,并同时退回呼叫。 (“最佳做法”是将其放在数据库中,因为这将是一个与数据库相关的限制,但这是你的电话)

已经有一段时间,因为我已经完成了MySQL触发器,但我认为认为你正在追求的是:

delimeter |

CREATE TRIGGER reply_threshold BEFORE INSERT ON CysticAirwaves_replies
  FOR EACH ROW BEGIN
    DECLARE reply_count INT;
    SET reply_count = (SELECT COUNT(*) FROM CysticAirwaves_replies WHERE userid = NEW.userid AND `date` = CURDATE());
    IF reply_count > 5 THEN
      SIGNAL SQLSTATE SET MESSAGE_TEXT = 'Too many replies for today';
    END IF;
  END;

|
delimeter ;

基本上,如果你在表中插入一个回复并超过了阈值,则会引发一个sql错误,停止操作。你无法“防止”插入,但你可以引发一个异常,使其失败。

答案 1 :(得分:1)

您只能在没有登录系统时通过IP地址对此进行限制。但是ip可以改变,这就是问题所在。

最好的方法是通过登录来保护表单。只有用户才能在登录时发帖。

最后一项技巧是使用像Recaptcha这样的验证码,然后机器人会在大多数时间将您的表单和垃圾邮件填写到您的系统中。

登录时。然后创建一个与您的usertable相关的表并计算INSERTS。在插入新注释之前,请检查表是否存在今天的INSERT。

答案 2 :(得分:1)

在插入评论之前,您要检查用户当天是否发布了超过5条评论。 如果是,则不插入注释,并显示消息。

SELECT COUNT(*) FROM CysticAirwaves_replies WHERE FromUserID = the_user_id AND date = CURDATE()

答案 3 :(得分:1)

除了在每次插入之前进行计数外,您还可以直接在某处存储用户所做的注释数量,因此您不必每次都进行计数(*)(如果用户有大量注释,这可能会很昂贵)你所拥有的桌子有点大。)

喜欢评论:

SELECT comment_count FROM comment_count_table WHERE user_id = ?

如果该值足够小,您可以:

UPDATE comment_count_table SET comment_count = comment_count + 1 WHERE user_id = ?

要小心这个,因为你需要以某种方式重置该计数器。 在我的公司,我们将此设置实现为“最后修改的字段”。当我们执行SELECT时,如果“最后修改日期”不是今天,那么我们重置计数器。

另一种选择是让cron作业每天为所有用户重置一次计数器,但这太贵了。