Php 重复密钥更新时的Sql不';行不通

Php 重复密钥更新时的Sql不';行不通,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我试图在新计算机访问页面时插入新行(ip),但如果密钥(ip)已经存在,我只想更新访问计数器 代码:mysqli_查询($con,“在重复密钥更新ip_计数=ip_计数+1)时插入ip_地址(ip,ip_计数)值(INET_ATON(“$ip”),1) 4次刷新后的结果: $ipaddr=<YOUR IP ADDRESS>; $sql="update ip_address set ip_count=ip_count+1 where ip_address='".$ipadd

我试图在新计算机访问页面时插入新行(ip),但如果密钥(ip)已经存在,我只想更新访问计数器

代码:mysqli_查询($con,“在重复密钥更新ip_计数=ip_计数+1)时插入ip_地址(ip,ip_计数)值(INET_ATON(“$ip”),1)

4次刷新后的结果:

   $ipaddr=<YOUR IP ADDRESS>;
   $sql="update ip_address set ip_count=ip_count+1 where ip_address='".$ipaddr."'";
   mysqli_query($con,$sql);
$ipaddr=;
$sql=“更新ip_地址集ip_计数=ip_计数+1,其中ip_地址=”””“$ipaddr。””;
mysqli_查询($con,$sql);

希望它能工作。

您也许应该使用PHP来验证它是否已经存在

这只是一个例子,请使用注入安全方法,并为语法错误道歉,只是试图在这里显示“逻辑”

基本上,它通过提供的IP选择数据。如果找不到,它将插入一条新记录。如果是,它将获取最大ip_计数值并用+1更新它


同样,这很可能不适用于复制和粘贴,您必须将其调整到您的脚本。

ip
是主键吗?我怀疑
ip
是主键。查询是正确的,但
ip
不是唯一的键。要实现您想要的功能,您需要将
ip
设置为主键或唯一索引。-1这不是原子性的,在执行并发更新时会导致数据损坏,可能是重复的行或错误的计数
$ip = '' // the way you save the IP address can be put here

$exists = "SELECT * FROM ip_address WHERE`ip` = '" . $ip . "'";
if(mysql_num_rows($exists) == 0) 
    {
      $insert = "INSERT INTO ip_address(ip, ip_count) VALUES (INET_ATON('".$ip."'),1)";
      $mysql_query($insert);
    } 
else 
    {
     while($result = mysql_fetch_assoc($exists))
      {
        $newCount = max($result['ip_count']) + 1;
        $update = "UPDATE ip_address SET ip_count = " . $newCount . " WHERE ip = '" . $ip . "'";
      }
}