У меня есть форма с выпадающим меню, которое имеет разные жанры фильмов, вот код для этого:
<select name="genero"><?php
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
if (!empty($_POST['genero']) && $row['nombre'] == $_POST['genero']) {
$selected = 'selected="selected"';
} else {
$selected = '';
}
echo '<option '.$selected.' value="'.$row["nombre"].'">'.$row["nombre"].'</option>';}
} else {
echo "0 results";
}
?>
Тогда у меня есть isset, который контролирует, что был выбран определенный жанр
if (isset($_POST['genero'])) {
$genero=$_POST['genero'];
$sql = "UPDATE generos SET visitas=visitas+1 where nombre='$genero'";
if ($conn->query($sql) === TRUE) {
$ip2 = $_SERVER['REMOTE_ADDR']?:($_SERVER['HTTP_X_FORWARDED_FOR']?:$_SERVER['HTTP_CLIENT_IP']);
} else {
echo "Error sumando visita: " . $conn->error;}
Теперь, когда пользователь впервые входит в указанную форму, я сохраняю его ip (способ хранения не должен быть сверхбезопасным, поэтому я делаю это так)
$ip = $_SERVER['REMOTE_ADDR']?:($_SERVER['HTTP_X_FORWARDED_FOR']?:$_SERVER['HTTP_CLIENT_IP']);
поэтому, когда запрос UPDATE успешно выполняется, я сохраняю этот ip снова.
В этом обновлении используется количество просмотров, поэтому я могу знать, сколько кликов имеет определенный жанр, но то, как работает код, теперь делает его бесполезным, так как пользователь может кликнуть 50 миллионов раз на один жанр, и он будет их считать.
То, что я пытаюсь сделать, это сравнить ip кулака со вторым ip и, если ip такой же, сделать запрос, который вычитает 1 к этому жанру, поэтому добавляется только 1
это то, что я пробовал
$contador=$contador+1;
if (isset($_POST['genero'])) {
$genero=$_POST['genero'];
$sql = "UPDATE generos SET visitas=visitas+1 where nombre='$genero'";
if ($conn->query($sql) === TRUE) {
$ip2 = $_SERVER['REMOTE_ADDR']?:($_SERVER['HTTP_X_FORWARDED_FOR']?:$_SERVER['HTTP_CLIENT_IP']);
} else {echo "Error sumando visita: " . $conn->error;}
if ($contador>1) {
if ($ip2==$ip){
$sql = "UPDATE generos SET visitas=visitas-1 where nombre='$genero'";
if ($conn->query($sql) === TRUE) {}
}
}
затем я попробовал что-то подобное с isset, проверив, что первое обновление уже сделано
if (isset($ip2) and ($ip==$ip2)) {
$sql = "UPDATE generos SET visitas=visitas-1 where nombre='$genero'";
if ($conn->query($sql) === TRUE) {}}
но произошло то, что число остается неизменным, так как оно добавляет 1 и вычитает 1
Попытка отслеживать количество посетителей, просматривая их IP, не очень хорошая идея:
Я предлагаю сделать следующее:
Вместо подсчета IP-адресов гораздо лучше пометить каждый вистор как посетителя определенного жанра, использующего сеансы PHP. Сеансы будут зависеть от клиента, а не от IP, что делает их намного более надежными.
Просто фрагмент кода, чтобы проиллюстрировать идею:
session_start();
...
// form has been submitted && session value has not been set
if (isset($_POST['genero']) && !isset($_SESSION[$_POST['genero']]) ) {
// We have a new visitor
// 1. update DB
// 2. Set cookie value
$_SEESION[$_POST['genero']] = true;
}
Я надеюсь, что это дает вам новый взгляд на проблему.
Других решений пока нет …