0

これを機能させる方法がわからないので、現在アイデアを探しています。作りたいものを説明しましょう。「クリック」という名前のボタンがあるとしましょう。このボタンを押すたびにデータベースに1が追加されるため、10回押すと、「clicks」という名前のデータベース列に値「10」が保持されます。これはすでに行われています。アンチボッティングシステムを作るために、ボタンを10回押した速さを確認できるものが必要です。したがって、データベースに「time」という名前の列を作成すると、この「time」列は10秒ごとにリセットされ、「クリック」ボタンが押されるたびに列に1が追加されると思いました。次に、PHPスクリプトで次のようなものを作成できます。時間が200を超える場合はユーザーを削除します。

したがって、誰かが自分自身をリセットする前に200の「時間」列を取得できる必要がある場合、わずか10秒間に何度も押すのは人間のようではないため、ボットを押す必要があります。

TIMESTAMPとINTERVALについて何か読んだことがありますが、思ったとおりに理解できません。必要なのは、特定の時間が経過すると、その中のすべてのデータを削除する列だけです。

どんな提案でも大歓迎です!前もって感謝します。

私はここまでコードを持ってきました:

if (isset($_POST['djahff'])) { // The button
require_once('connectvars.php'); // The DB connection
    $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    $idsession = $_SESSION['id'];
    $result = mysqli_query($dbc, "INSERT INTO pbclickslogin SET cps=1, id='$idsession' ON DUPLICATE KEY UPDATE cps=cps+1"); // Adding 1 to the column "cps" where username=$username

    $data = mysql_query("SELECT TIMESTAMPDIFF(SECOND, NOW(), mark) > 10 FROM pbclickslogin WHERE username='$username'") // Checking if the difference from mark and now is 10 seconds I assume?
    or die(mysql_error());
while($info = mysql_fetch_array( $data )) {
$result = mysqli_query($dbc, "UPDATE pbclickslogin SET cps='0', mark=NOW() WHERE username='$username'"); // Updating cps and mark because the difference from mark and now was 10 seconds.
 }
}

ボタンを押すたびにサイトが更新され、入力タイプが「送信」のボタンになります。

うーん、私はあなたがアルゴモルフを完全に理解していませんでしたが、それは私のコード投稿の間違いが原因だったと思います。申し訳ありませんが、このフォーラムはまだ新しいです。とにかく、私はここに更新ステートメントがあると思いますか?あなたが前に述べたのと同じ問題がまだありますか?

追伸 フォーラムの形式について教えてくれてありがとう

もう少しコードを追加しました:

if ($info[0] == 1) {
    $result = mysqli_query($dbc, "UPDATE pbclickslogin SET cps='0', mark=NOW() WHERE username='$username'"); // Updating cps and mark because the difference from mark and now was 10 seconds.
}

ただし、コードは今すぐ更新されることはありません。($ info ['0'] == 1)も試してみましたが、残念ながら運がありませんでした。それに加えて、私は今これを本当に理解していません、$ info [0]とは何ですか?データベース内で0か何かを見つけていますか?私は通常、列を呼び出すときにのみ$infoを使用します。もう一度ありがとう:)

さらにいくつかの変更が追加されました。現在取得しているコードは次のとおりです。

if (isset($_POST['djahff'])) { // The button

require_once('connectvars.php'); // The DB connection
    $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    $idsession = $_SESSION['id'];
    $result = mysqli_query($dbc, "INSERT INTO pbclickslogin SET cps=1, id='$idsession' ON DUPLICATE KEY UPDATE cps=cps+1"); // Adding 1 to the column "cps" where username=$username

    $data = mysql_query("SELECT TIMESTAMPDIFF(SECOND, mark, NOW() ) > 10 FROM pbclickslogin WHERE id='$idsession';") // Checking if the difference from mark and now is 10 seconds I assume?
    or die(mysql_error());
while($info = mysql_fetch_array( $data )) {
if ($info[0] == 1) {
    $result = mysqli_query($dbc, "UPDATE pbclickslogin SET cps='0', mark=NOW() WHERE id='$idsession'"); // Updating cps and mark because the difference from mark and now was 10 seconds.
}
 }
}

アルゴモルフへ:ところで、なぜNOW())> 10をNOW())> 1000に変更したのですか?プラス:私が現在抱えている問題は、ボタン「djahff」を押すと、タイムスタンプ「mark」は更新されますが、整数「cps」は更新されないことです。

ありがとう:-)-近づいています!

4

2 に答える 2

1

使用しているDBMSはわかりませんが、次の方法で説明したとおりに実行できます。2つの列を作成します。

  • 整数[クリック数]
  • タイムスタンプ[マーク]

ユーザーがクリックしたら、[マーク]をチェックして、現在の日時と比較します。10秒を超える差がある場合は、[クリック]を1に設定し、現在の日付と時刻をマークします(mysqlのNOW()関数、PostgreSQLのcurrent_timestamp()関数)。

それ以外の場合は、[クリック]をチェックしてください。200を超える場合は、ユーザーを追い出します。それ以外の場合は、1ずつ増やします。

于 2012-11-03T17:32:22.807 に答える
1

if(isset($ _ POST ['djahff'])){//ボタン

require_once('connectvars.php'); // The DB connection
    $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    $idsession = $_SESSION['id'];
    $result = mysqli_query($dbc, "INSERT INTO pbclickslogin SET cps=1,       id='$idsession' ON DUPLICATE KEY UPDATE cps=cps+1"); // Adding 1 to the column "cps" where username=$username

    $data = mysql_query("SELECT TIMESTAMPDIFF(SECOND, NOW(), mark) > 10 FROM pbclickslogin WHERE username='$username'") // Checking if the difference from mark and now is 10 seconds I assume?
    or die(mysql_error());

while($ info = mysql_fetch_array($ data)){$ result = mysqli_query($ dbc、 "UPDATE pbclickslogin SET cps = '1'、mark = NOW()WHERE username ='$ username'"); //マークとの差が10秒になったため、cpsとマークを更新します。}}

これが、Algomorphが教えてくれたことから理解したコードです。問題は、ユーザーがこの10秒を過ぎて「djahff」ボタンを何度もクリックすることです。そして、ボタンが押されるたびに、「マーク」列が現在の時刻に更新されます。

それに加えて、毎回うまくいきます:)何か提案はありますか?
@Algomorph

  • ピーター
于 2012-11-05T15:54:48.747 に答える