[英]how to limit the amount of comments or replies to comments a user can post per day
我的 social.network 上有评论部分和评论部分的回复。 我们在手动垃圾邮件发送者方面遇到了一些麻烦,我打算限制某人一天可以发布的评论数量。
以下是评论和回复评论的插入查询:
//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']);
提前致谢
您可以执行 select 以查看该用户在当前日期的表中已有多少条目:
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 ;
本质上,如果您 go 在表中插入回复并且已超过阈值,则会引发 sql 错误以停止操作。 你不能“阻止”每次插入,但你可以引发一个异常,让它失败。
当您没有登录系统时,您只能通过 ip 地址进行限制。 但是 ip 可以改变,这就是问题所在。
最好的方法是通过登录来保护表单。 只有用户在登录后才能发帖。
最后一种技术是使用像Recaptcha这样的验证码,然后大多数时候机器人会填写您的表格并向您的系统发送垃圾邮件。
当您登录时。 然后制作一个与您的用户表相关的表并计算插入数。 在您插入新评论之前,请检查表格今天是否有插入。
在插入评论之前,您检查用户当天发表的评论是否超过 5 条。 如果是,则不插入评论并显示一条消息。
SELECT COUNT(*) FROM CysticAirwaves_replies WHERE FromUserID = the_user_id AND date = CURDATE()
除了在每次插入之前进行计数外,您还可以直接将用户发表的评论数存储在某个地方,这样您就不必每次都进行计数(*)(如果用户有很多评论和表格,这可能会很昂贵你有点大)。
比如,评论:
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 作业,每天为所有用户重置一次计数器,但这太昂贵了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.