2012-04-05 156 views

回答

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

//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']); 

感谢您只能通过IP地址限制这个,当你没有登录系统。但IP可以改变,这就是问题所在。

的最佳方式是通过登录到固定的形式。只有用户登录后才能发布。

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

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

1

之前插入注释,你检查,如果用户已张贴在每天超过5个评论。 如果是的话,你不插入注释和你显示一个消息。

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

所以我会把它放在插入查询之前,而不是像它后面插入查询一样的“if(COUNT(*))<5 {}”。 – LightningWrist 2012-04-05 17:40:23

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