У меня есть 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));

Но я не знаю, как мне продолжить? Я чувствую, что застрял.
Я знаю, что мне следует сравнить текущее время с временем выпуска, которое я получаю от MySQL, но как?

Пока я получил этот код (см. Строки комментариев):

$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-адресом, но в этом случае мне действительно нужно.

1
user4483652 9 Май 2016 в 07:22

2 ответа

Лучший ответ

Вы можете использовать это, чтобы проверить, отправляли ли вы форму в течение последних 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 также будет работать.

0
9 Май 2016 в 04:53

На самом деле ваша проблема отличается от того, о чем вы спрашивали.

Чтобы сравнить значение даты и времени в формате 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();

И теперь вы можете начать проверять дату. Обратите внимание, что здесь количество строк вам не нужно.

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) 
*/
}
0
Your Common Sense 9 Май 2016 в 04:56