MySQLi Prepared语句,用于比较当前时间和存储的日期时间


MySQLi Prepared Statement to compare current time with stored datetime?

我有HTML表单,我不希望用户每天使用一次以上。

到目前为止,我已经想好了我应该做什么,但我真的不确定该怎么做。

当用户提交表单时,我会存储他们的"IP"(列IP)以及当前时间(列submitTime)和当前时间+23小时(列releaseTime):

$submitDate = date("Y-m-d H:i:s");
$currentTime = time();
$releaseTime = date("Y-m-d H:i:s", strtotime('+23 hour', $currentTime));

但我不知道的是我该如何继续?我觉得自己被卡住了。
我知道我应该将$currentTime和从MySQL获得的releaseTime进行比较,但如何比较呢?

到目前为止,我得到了以下代码(见评论行):

$ip = $_SERVER['REMOTE_ADDR'];
$stmt1 = $conn->prepare('SELECT * FROM IPlock WHERE ip=?') or die('Couldn''t check the IP');
$stmt1->bind_param("s", $ip);
$stmt1->execute();
$stmt1->store_result();
$countRows = $stmt1->num_rows;
$stmt1->close();
if ($countRows > 0) {
/*
 Code to check for how long the IP has existed in MySQL
 If it has existed for more then 23 hours, remove it and proceed.
 else abort (since its blacklisted for another x hours) 
*/
}

我知道我不应该使用IP来识别用户,因为有些用户共享他们的IP,但在这种情况下,我真的必须这样做。

您可以使用它来检查是否有人在过去24小时内提交了表单。

SELECT * FROM IPlock WHERE `ip`=? AND `submitTime` > NOW() - INTERVAL 24 HOUR;

如果IP在过去24小时内未提交,则不会返回任何行。

编辑:

除此之外,不需要使用PHP date()函数,您可以像一样进行插入

INSERT INTO IPlock (`ip`, `submitTime`) VALUES ('127.0.0.1', NOW());

请注意,CURRENT_TIMESTAMP也同样有效。

事实上,您的问题与您提出的问题不同。

要比较mysql格式的日期时间值,只需对其进行比较——这没什么大不了的。

真正的问题是如何获得用于比较的值(与您当前的代码无法进行比较),以及如果您发现记录已过时该怎么办。

因此,首先需要获取datetime值:

$stmt1 = $conn->prepare('SELECT releaseTime FROM IPlock WHERE ip=?');//never use die()
$stmt1->bind_param("s", $_SERVER['REMOTE_ADDR']);
$stmt1->execute();
$stmt1->store_result();
$stmt1->bind_result($releaseTime);
$stmt1->fetch();

现在你可以开始检查日期了。请注意,此处不需要num行。

if ($releaseTime > date("Y-m-d H:i:s")) {
/*
 Code to check for how long the IP has existed in MySQL
 If it has existed for more then 23 hours, remove it and proceed.
 else abort (since its blacklisted for another x hours) 
*/
}