0

好的,所以我需要检查一个 ip_adress 是否已经在我的数据库中,如果我需要更新“访问”行并添加 1。如果它没有退出,那么将 ip_adress 添加到我的数据库中的“ip_adress”行这是我的代码:

<?php include'connect.php';
//Test if it is a shared client
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
//Is it a proxy address
}elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip=$_SERVER['REMOTE_ADDR'];
}

$ip = ip2long($ip);


$result = mysqli_query($con,"SELECT ip_adress FROM ip_visits");

while($row = mysqli_fetch_array($result))
{
  $ip_adress = $row['ip_adress'];
  if($ip_adress === $ip){
        mysqli_query($con,"UPDATE ip_visits SET ip_adress = ip_adress + 1");
  }else{
        mysqli_query($con,"INSERT INTO ip_visits (ip_adress) VALUES ('$ip')");
  }

}

mysqli_close($con);
?>
4

2 回答 2

0

我认为您正在寻找的逻辑正是@Ignacio Vazquez-Abrams 向您展示的。

它是这样的:

1)告诉MySql插入到所需的表中。

2)向它解释你宁愿更喜欢它而不是UPDATE,以防它找到重复的键。

代码:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

这或多或少等于说:

UPDATE table SET c=c+1 WHERE a=1;

做这INSERT部分的好处是,UPDATE如果它没有发现任何需要更新的东西,单独的将什么都不做。

所以,这个INSERT,UPDATE组合就像用一块石头杀死2只鸟。

你可以在这里阅读更多:

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

只是一个旁注,确保您的表至少有一个主键和 auto_increment 字段

于 2013-08-30T03:47:02.410 回答
0

创建一个UNIQUE密钥ip_adress然后

INSERT INTO ip_visits (ip_adress)
  VALUES ('$ip')
  ON DUPLICATE KEY
    UPDATE visits=visits+1

除了使用参数化查询。

于 2013-08-30T03:14:01.027 回答