You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:40:33