1

我有一个带有下拉菜单的表单,其中包含不同类型的电影,这是它的代码:

 <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。更新的内容是服务有我的观看次数,所以我可以知道特定类型的点击次数,但是现在代码的工作方式使它变得毫无用处,因为用户可以在一个类型上点击 5000 万次,它会计算它们。我想要做的是将第一个 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

4

1 回答 1

1

试图通过查看他们的 IP 来跟踪访问者的数量并不是一个好主意:

  • 有太多 IP 无法跟踪它们,例如对于 IP V6,将有 340,282,366,920,938,463,463,374,607,431,768,211,456 个不同的 IP
  • 访问者的 IP 可能会随着时间而改变。例如,我的 IP 会随着每次新连接而改变。具体 IP 由我的 ISP 选择。

我建议执行以下操作:与其计算 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;
}

我希望这能让你对这个问题有一个新的看法。

于 2015-11-11T13:05:26.370 回答