發佈量我有一個註釋部分,並回復了我的社交網絡上的評論部分。我們在手動垃圾郵件發送者方面遇到了一些麻煩,並且我將限制某人每天可能發佈的評論數量。如何限制的評論或回覆評論的用戶可以爲每個
以下是評論的插入查詢和回覆意見:提前
發佈量我有一個註釋部分,並回復了我的社交網絡上的評論部分。我們在手動垃圾郵件發送者方面遇到了一些麻煩,並且我將限制某人每天可能發佈的評論數量。如何限制的評論或回覆評論的用戶可以爲每個
以下是評論的插入查詢和回覆意見:提前
您已經可以通過用戶當前日期進行選擇,看看有多少項是表:
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錯誤將引發停止動作。您不能「防止」每插入一次插入,但是您可以引發一個異常,使其突破。
//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。
之前插入註釋,你檢查,如果用戶已張貼在每天超過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作業,每天爲所有用戶重置一次計數器,但這太昂貴了。
所以我會把它放在插入查詢之前,而不是像它後面插入查詢一樣的「if(COUNT(*))<5 {}」。 – LightningWrist 2012-04-05 17:40:23