如何统计MySQL特定行执行次数及Python脚本用户登录次数
问题解决与优化方案
1. 核心错误:全表更新导致计数字段异常
你的UPDATE语句缺少WHERE子句,执行时会修改所有用户的use_num字段,这就是所有行计数字段被批量更新的根本原因。必须通过username或用户ID定位到当前选中的用户,仅更新该行的use_num值。
2. 修复login调用次数统计问题
当前全局变量counter在递归调用user_pass()时会重复累加,导致login调用次数统计失真。正确的做法是将登录次数统计逻辑直接放在login()方法内部,和用户选择逻辑分离。
3. 统计MySQL特定行的执行次数(用户登录次数)
你设计的use_num字段本身就是用来统计单个用户的登录次数,只要正确更新对应行的该字段,就能直接通过SELECT username, use_num FROM users查询每个用户的登录次数。
修复后的代码示例
# 单独统计login方法的总调用次数 login_total_count = 0 def login(username, password): global login_total_count login_total_count += 1 # 这里编写实际的登录验证逻辑 print(f"用户 {username} 发起登录请求") # 登录成功/失败的后续处理... def user_pass(): cursor.execute("SELECT username,password,use_num FROM users ORDER BY RAND()") user_data = cursor.fetchone() if not user_data: print("无可用用户账号") return None, None _user, _pass, _usenum = user_data print(_user, _pass, _usenum) if int(_usenum) < 3: # 仅更新当前选中用户的use_num,添加WHERE子句定位 update_sql = "UPDATE users SET use_num = %s WHERE username = %s" cursor.execute(update_sql, [int(_usenum)+1, _user]) myConnection.commit() return _user, _pass else: # 递归查找下一个可用用户 return user_pass() # 使用示例 username, password = user_pass() if username and password: login(username, password) # 查询所有用户的登录次数 cursor.execute("SELECT username, use_num FROM users") for row in cursor.fetchall(): print(f"用户 {row[0]} 累计登录次数: {row[1]}") # 打印login方法总调用次数 print(f"login方法总调用次数: {login_total_count}")
关键优化点
- 添加WHERE子句:确保UPDATE操作仅作用于当前选中的用户记录,避免全表更新。
- 分离计数逻辑:将login调用次数统计放在
login()函数内部,避免与用户选择逻辑混淆。 - 移除冗余全局变量:递归查找可用用户时无需额外counter,直接递归返回即可,避免计数混乱。
- 空值判断:处理数据库无可用用户的边界情况,防止程序报错。
内容的提问来源于stack exchange,提问作者JANI-COBIN
相关产品推荐
相关产品推荐

