Количество просмотров с mysql и переполнением стека

У меня есть форма с выпадающим меню, которое имеет разные жанры фильмов, вот код для этого:

 <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

1

Решение

Попытка отслеживать количество посетителей, просматривая их IP, не очень хорошая идея:

  • Слишком много IP-адресов, чтобы отслеживать их, например, для IP V6 будет 340,282,366,920,938,463,463,374,607,431,768,211,456 различных IP-адресов.
  • IP-адрес посетителя может меняться со временем. Например. мой IP меняется с каждым новым подключением. Конкретный 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;
}

Я надеюсь, что это дает вам новый взгляд на проблему.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]