Viewcount与mysql和PHP

时间:2015-11-11 12:32:03

标签: php mysql hitcounter

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

 <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

1 个答案:

答案 0 :(得分: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会话将每个vistor标记为特定类型的访问者更好。会话将是客户特定的,而不是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;
}

我希望这会为你提供一个关于这个问题的新视角。