2

ソーシャルネットワークにコメントセクションとコメントへの返信セクションがあります。手動スパマーに問題があり、誰かが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']);

前もって感謝します

4

4 に答える 4

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エラーが発生してアクションが停止します。挿入ごとに「防止」することはできませんが、例外を発生させてフォールスルーさせることはできます。

于 2012-04-05T17:32:00.680 に答える
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日1回リセットするcronジョブを使用することですが、これはコストがかかりすぎます。

于 2012-04-05T17:36:53.817 に答える
1

ログインシステムがない場合にのみ、IPアドレスでこれを制限できます。しかし、IPは変更される可能性があり、これが問題です。

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

最後のテクニックは、Recaptchaのようなキャプチャを使用することです。その後、ほとんどの場合、ボットがフォームに入力し、システムにスパムを送信します。

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

于 2012-04-05T17:29:36.847 に答える
1

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

SELECT COUNT(*) FROM CysticAirwaves_replies WHERE FromUserID = the_user_id AND date = CURDATE()
于 2012-04-05T17:31:24.503 に答える