Голосование PHP, один голос за IP в день: нужна помощь по коду
Я работаю над очень простым сайтом, который позволит людям голосовать один раз в 24 часа за предмет (игру) на IP-адрес. Голоса хранятся в таблице с именем голосования, с колонками, содержащими идентификатор голосования, идентификатор игры, число проголосовавших и IP-адрес.
Пользователи переходят на страницу голосования по этой игре через... voice.php? Id=# (где # - gid). Вот упрощенная версия моего текущего voice.php, который не работает:
<?php
$gid = $_GET["id"];
$ip = $_SERVER['REMOTE_ADDR'];
require_once ('config.php');
$q = "SELECT * FROM votes WHERE (gid=$gid)";
$r = @mysqli_query($dbc, $q);
if ($r) {
while ($row = mysqli_fetch_array($r)) {
if ($row['ip'] != $ip) { // If no IP exists, go ahead and vote.
$q2 = "INSERT INTO votes (gid, votedate, ip) VALUES ('$gid', NOW(), '$ip' )";
$r2 = @mysqli_query($dbc, $q2);
if ($r2) {
echo 'Thank you for voting';
} else {
echo 'There was a problem with your vote'
}
} elseif ($ip == $row['ip']) {
// If IP address exists, check date of last time they voted for this game
// Define the two dates
$votedate = $row['votedate'];
$now = date("Y-m-d H:i:s");
// Calculate hours between the dates
$diff = round((strtotime($now) - strtotime($votedate)) / (60 * 60));
// Create variable for when user can return.
$return = '24' - $diff;
if ($diff > '24') { // Allow to vote once every 24 hours
$q3 = "INSERT INTO votes (gid, votedate, ip) VALUES ('$gid', NOW(), '$ip' )";
$r3 = @mysqli_query($dbc, $q3);
// Display outcome of insert query:
if ($r3) {
echo 'Thank you for voting, please come back in 24 hours to vote again!';
} else {
echo 'There was a problem with your vote:' . mysqli_error($dbc) . ' in reference to query ' . $q3;
}
} else {
echo 'Sorry, you\'ve already voted in past 24 hours, please come back again in ' . $return . ' hours.';
}
}
} // End of while $r loop
} else {
echo 'Sorry, your query did not work.';
} // End of overall if $r ran
mysqli_close($dbc);
exit();
?>
Моя цель - чтобы он работал так:
Возьмите gid из URL и найдите все голоса, связанные с этим gid. Если пользователь никогда раньше не голосовал за этот гид, то разрешите добавлять новый голос. Если пользователь проголосовал за эту дату проверки гидов предыдущего голосования. Если последний голос старше 24 часов, разрешите подать еще один голос. Если последний голос был в течение 24 часов, откажитесь от нового голосования за эту игру.
Мне нравится слышать ваши мысли по этому поводу...
Я смотрел на другие системы голосования, но мне не удалось адаптировать системы jQuery, AJAX и т. Д. К тому, что я хотел, поэтому я решил, что действительно базовая система PHP лучше всего подходит для моего ограниченного понимания. Я также хочу иметь возможность перечислять только те голоса, которые были поданы за последние 30 дней, и в других проектах плагинов для голосования это не учитывалось. Тем не менее, я был бы счастлив, если бы у кого-нибудь была более причудливая альтернатива, поскольку я знаю, что эта неуклюжая.
Ура!
1 ответ
Будьте внимательны, для математических операций используйте один и тот же тип:
Попробуйте с помощью floatval()
$diff = floatval(round((strtotime($now) - strtotime($votedate)) / (60 * 60)));
$return = 24.0 - $diff;
if ($diff > 24.0)
{
/* Your code */
}