2

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

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

//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

4 回答 4

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 错误以停止操作。您不能“阻止”每次插入,但您可以引发异常,使其失败。

于 2012-04-05T17:32:00.680 回答
1

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

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

最后一种技术是使用像Recaptcha这样的验证码,然后在大多数情况下,机器人会填写您的表单并向您的系统发送垃圾邮件。

当你有一个登录。然后制作一个与您的用户表相关的表并计算 INSERTS。在您插入新评论之前,请检查表格是否今天有插入。

于 2012-04-05T17:29:36.847 回答
1

在插入评论之前,您检查用户在一天内发表的评论是否超过 5 条。如果是,则不插入评论并显示一条消息。

SELECT COUNT(*) FROM CysticAirwaves_replies WHERE FromUserID = the_user_id AND date = CURDATE()
于 2012-04-05T17:31:24.503 回答
1

除了在每次插入之前进行计数之外,您还可以直接将用户发表的评论数量存储在某处,因此您不必每次都进行 count(*) (如果用户有很多评论和表格,这可能会很昂贵你有有点大)。

喜欢,评论:

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 作业每天为所有用户重置一次计数器,但这太昂贵了。

于 2012-04-05T17:36:53.817 回答