使用php在mysql中创建一个ip访问计数器

时间:2014-01-26 01:46:59

标签: php mysql

我是一个非常新手的程序员,我刚开始使用php。 我使用php来获取用户ip存储它在mysql中。尝试将ip插入mysql db。如果已经存在则更新访问次数。但我的查询都不起作用。它返回我连接到我的数据库 这就是我到目前为止所做的:

 $ipaddress = $_SERVER["REMOTE_ADDR"];
 print "$ipaddress <br>";

 $rv = mysqli_real_query("INSERT INTO visit ( ipaddress, count) VALUES (  '$ipaddress', 1)");
if ($rv === false){
 mysqli_real_query($con,"UPDATE visit SET count=count+1
 WHERE ipaddress = '$ipaddress'");
 mysqli_close($con);
 }
 mysqli_close($rv);
$count = mysqli_real_query("SELECT count from visit where ipaddress = '$ipaddress'");
print "You have visited this site $count time(s)";

3 个答案:

答案 0 :(得分:0)

1。)$con中您的第一个查询的$rv位置在哪里?

2。)您的查询需要对count

等保留字进行反写
$rv = mysqli_real_query($con, "INSERT INTO `visit`(`ipaddress`, `count`) VALUES('$ipaddress', 1)");

3。)只有在第一行中出现错误时,您的内部if statement才会触发。这意味着你永远不会真正更新计数,除非出现问题。

建议1: - 在phpmyadmin中打开你的表并手动插入一行你的IP地址和一些随机计数。然后努力能够显示行You have visited this site x time(s)。一旦工作,然后插入/更新您的表。

建议2:你应该反过来做。也就是说,检查表中是否存在ip地址。如果是的话 - 更新它。如果它不存在,则然后添加新行。

答案 1 :(得分:0)

这对于练习简单的数据库连接很好,但更好的方法是将一个简单的文件写入/tmp/文件夹并附加1个字符。单个ASCII字符是1个字节,因此访问次数只是该ip文件的文件大小(以字节为单位)。附加单个字符并运行文件大小检查应该比运行数据库查询的开销少得多。

示例:

//Logging a Visit
$log_file   = '/tmp/ip_'.$_SERVER['REMOTE_ADDR'];
$log = fopen($log_file, "a");
fwrite($log,'0');
fclose($log);

//Displaying Count
if(file_exists($log_file)){
    $visits = filesize($log_file);
    echo $log_file.' has visited the site '.$visits.' time'.($visits>1 ? 's':'');
}
else{
    echo $log_file.' has not previously visited the site';
}

请点击此处查看我如何向其他用户建议此方法以阻止访问网站的机器人超过x个允许时间的示例:Number of page requests by any Bot in 5 secs

另外,请记住,使用路由器和NAT,IP地址不能保证唯一的访问者,因此在大多数情况下不应依赖IP地址来识别唯一用户。

答案 2 :(得分:0)

一些问题:

  1. 您没有逃避SQL语句。
  2. 关闭连接(两次),然后在执行SELECT语句时再也不打开它。
  3. 您没有逃避查询参数。
  4. 修复这些问题,结果如下:

    <?php
    
      $con = mysqli_connect();
      $ip = mysqli_real_escape_string($_SERVER["REMOTE_ADDR"]);
    
      $q  = 'INSERT INTO `visit` (`ipaddress`, `count`)';
      $q .= 'VALUES ("'.$ip.'",1) ON DUPLICATE KEY UPDATE `count` = `count` + 1';
    
      $result = mysqli_real_query($q);
      if (!$result) {
          echo mysqli_error();
      }
    
      $q = 'SELECT `count` FROM `visit` WHERE `ipaddress` = "'.$ip.'"';
      $result = mysqli_real_query($q);
    
      if (!$result) {
         echo mysqli_error();
      } else {
         print "You have visited this site ".$result[0]."time(s)";
      }
    ?>