MySQL UPDATE影响行数异常:PHP用mysqli_affected_rows判断重复注册失效
解决mysqli_affected_rows在重复UPDATE时返回0的问题
这个问题我之前也踩过坑!根源在于MySQL默认情况下,UPDATE语句返回的是实际被修改的行数,而不是匹配到的行数。所以当用户重复注册时,虽然你的WHERE条件匹配到了已存在的行,但因为数据没有任何变更,MySQL就会返回0,直接导致你的注册判断逻辑失效。
这里有两种简单有效的解决方法:
方法一:强制更新一个一定会变化的字段
在你的UPDATE语句中添加一个每次都会被修改的字段,比如时间戳,这样即使其他数据没有变化,这个字段的更新也会让MySQL返回1作为影响行数。
首先确保你的schedule表有一个用于记录更新时间的字段(如果没有就先添加):
ALTER TABLE schedule ADD COLUMN last_updated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
然后修改你的UPDATE语句:
UPDATE schedule SET last_updated = NOW() -- 每次执行都会更新这个字段,确保有行被标记为修改 WHERE userid = '$user' AND date='2018-05-05'
这样不管用户是不是重复注册,只要WHERE条件匹配到行,mysqli_affected_rows()就会返回1,未匹配到则返回0,完美契合你的判断逻辑。
方法二:修改mysqli连接参数,返回匹配行数而非修改行数
在建立mysqli连接时,传入MYSQLI_CLIENT_FOUND_ROWS选项,这样mysqli_affected_rows()会返回WHERE条件匹配到的行数,而不是实际被修改的行数。
示例连接代码:
// 直接连接的方式 $conn = mysqli_connect('localhost', 'your_username', 'your_password', 'your_db', null, null, MYSQLI_CLIENT_FOUND_ROWS); // 或者用init+real_connect的方式 $conn = mysqli_init(); mysqli_real_connect($conn, 'localhost', 'your_username', 'your_password', 'your_db', null, null, MYSQLI_CLIENT_FOUND_ROWS);
这个方法不需要修改表结构或者UPDATE语句,直接改变连接的行为。不过要注意:这个选项会影响所有后续的UPDATE操作,如果你其他业务场景需要获取实际修改的行数,就得额外处理了。
另外提一句:你示例里的UPDATE语句少了SET子句,实际使用时可别忘了加上哦,不然会触发SQL语法错误~
内容的提问来源于stack exchange,提问作者Curtis Upshall
相关产品推荐
相关产品推荐

