0

我不知道如何使它工作,所以我目前只是在寻找想法,让我解释一下我想做什么;假设我有一个名为“click”的按钮。每次我按下此按钮时,它都会向数据库添加 1,因此当我按下 10 次时,它会在名为“clicks”的数据库列中保存值“10”。不过这已经做好了。我只需要一些可以检查我按下按钮 10 次的速度来制作防僵尸系统。所以我认为在数据库中创建一个名为“时间”的列,这个“时间”列每 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.
}
 }
}

到 Algomorph:顺便说一下,你为什么将 NOW() ) > 10 更改为 NOW() ) > 1000?另外:我现在遇到的问题是,当我按下按钮“djahff”时,它会更新时间戳“mark”而不是整数“cps”。

谢谢:-) - 我们越来越近了!

4

2 回答 2

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'"); // 更新 cps 和 mark 因为与 mark 和 now 相差 10 秒。} }

这是我从 Algomorph 告诉我的内容中理解的代码。问题只是用户在这 10 秒后多次单击“djahff”按钮。每次按下按钮时,“标记”列都会更新回现在的时间。

除此之外每次都可以正常工作:)有什么建议吗?
@Algomorph

  • 彼得
于 2012-11-05T15:54:48.747 回答
1

我不确定您使用的是哪个 DBMS,但您可以完全按照以下方式进行描述。制作两列:

  • 整数 [点击次数]
  • 时间戳[标记]

当用户单击时,选中 [mark] 并将其与当前日期和时间进行比较。如果相差超过 10 秒,将 [clicks] 设置为 1 并标记为当前日期和时间(mysql 中的 NOW() 函数,PostgreSQL 中的 current_timestamp() 函数)。

否则,请检查 [clicks]。如果超过 200,则将用户踢出。否则,将其加一。

于 2012-11-03T17:32:22.807 回答