MySQLi 准备语句将当前时间与存储的日期时间进行比较?
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 格式的日期时间值,您只需比较它 - 没什么大不了的。
真正的问题是如何获取比较值(用你当前的代码你做不到)以及如果你发现记录已经过时了怎么办。
因此,首先您需要获取日期时间值:
$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();
现在您可以开始检查日期了。请注意,您不需要此处的行数。
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)
*/
}
我有 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 格式的日期时间值,您只需比较它 - 没什么大不了的。
真正的问题是如何获取比较值(用你当前的代码你做不到)以及如果你发现记录已经过时了怎么办。
因此,首先您需要获取日期时间值:
$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();
现在您可以开始检查日期了。请注意,您不需要此处的行数。
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)
*/
}