2012-04-05 153 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作業,每天爲所有用戶重置一次計數器,但這太昂貴了。