PHP+MYSQL环境下如何查询输出指定用户登录日志表的最新一条记录
实现方案
要获取指定用户的最新登录安全记录,只需要对原有SQL增加排序和返回条数限制即可,同时注意修正原有代码里的逻辑错误:
核心修改逻辑
原有SQL没有指定排序规则,数据库默认按主键升序返回数据,因此你拿到的是用户最早的登录记录而非最新的。我们可以通过两种规则排序取最新:
- 按自增主键id降序:id自增的场景下,最高id对应最新插入的记录,该方案查询性能更高(主键自带索引,无需额外计算)
- 按登录时间dateTime降序:适用于id非自增、或者数据插入时间和实际登录时间不一致的场景
优化后代码示例
写法1:按id降序取最新(推荐)
优先使用预处理语句避免SQL注入风险,同时修正原代码中mysqli_num_fields的逻辑错误(该方法用于获取返回字段数,不能用来判断是否存在查询记录,应该用mysqli_num_rows):
// 预处理查询语句 $user = $_SESSION['username']; $stmt = mysqli_prepare($connection, "SELECT * FROM logInAttempts WHERE username = ? ORDER BY id DESC LIMIT 1"); // 绑定参数:s代表字符串类型 mysqli_stmt_bind_param($stmt, "s", $user); // 执行查询 mysqli_stmt_execute($stmt); // 获取结果集 $securityResults = mysqli_stmt_get_result($stmt); // 判断是否查询到匹配记录 if (mysqli_num_rows($securityResults) > 0) { $securityRes = mysqli_fetch_array($securityResults); // 此处可直接使用$securityRes中的最新安全信息 }
写法2:按登录时间降序取最新
如果你的dateTime字段存储的是字符串格式(如示例中的05/09/2021 10:41),需要先转成时间类型再排序,避免字符串排序出错:
$stmt = mysqli_prepare($connection, "SELECT * FROM logInAttempts WHERE username = ? ORDER BY STR_TO_DATE(dateTime, '%d/%m/%Y %H:%i') DESC LIMIT 1");
性能优化建议
- 给
username字段添加普通索引,可大幅提升用户登录记录的查询速度 - 优先使用按id排序的方案,无需额外的时间转换计算,查询效率更高
内容的提问来源于stack exchange,提问作者Hen
相关产品推荐
相关产品推荐

