2012-04-05 12 views
2

私のソーシャルネットワークにはコメントセクションとコメントに対するコメントセクションがあります。私たちは手作業のスパマーにいくつかの問題を抱えています。私は誰かが1日に投稿できるコメントの量を制限しようとしていました。ここでユーザーが1日に投稿できるコメントへのコメントや返信の数を制限する方法

コメントの挿入クエリがあるとコメントに返信:あなたはログインシステムを持っていないときは、IPアドレスのみで、これを制限することができ、事前

答えて

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は変わることがあり、これがここに問題です。

最も良い方法は、ログインしてフォームを保護することです。そのユーザーだけがログインしたときに投稿することができます。

最後に、Recaptchaのようなキャプチャを使用して、ほとんどの場合ボットが自分のフォームと迷惑メールをシステムに記入します。

ログインしているとき。次に、あなたのユーザーテーブルに関連するテーブルを作成し、INSERTを数えます。新しいコメントを挿入する前に、今日INSERTがあったかどうかを確認してください。

1

コメントを挿入する前に、ユーザーがその日に5つ以上のコメントを投稿しているかどうかを確認します。 「はい」の場合は、コメントを挿入せずにメッセージを表示します。

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

だから、私は挿入クエリの前に置いて、 "if(COUNT(*))<5 {}のような何かの後に挿入クエリをラップした? – LightningWrist

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を実行すると、「最終修正日」が今日ではない場合、カウンタをリセットします。

もう1つの方法は、すべてのユーザーのカウンタを毎日1回ずつリセットするcronジョブを作成することですが、それはあまりにも高価です。

関連する問題