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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:12:01