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

如何在PHP7中显示SQLite3查询结果并实现登录验证

解决SQLite3+PHP7登录查询的问题

嘿,作为新手碰到这个问题太正常啦,咱们来一步步拆解你的代码问题:

核心问题1:用错了查询执行方法

你代码里用了$db->exec($sql),但SQLite3的exec()方法只适合执行没有返回结果的SQL语句(比如INSERT、UPDATE、DELETE),执行SELECT查询的话,得用query()(或者更安全的预处理语句)!

exec()返回的是受影响的行数(整数),不是结果集对象,所以你后面调用$result->num_rows肯定会报错——因为整数根本没有num_rows这个属性,这也是你拿不到密码的关键原因。

核心问题2:结果集获取方法不对

SQLite3的结果集对象(SQLite3Result)没有fetch_assoc()方法,你需要用fetchArray(SQLITE3_ASSOC)来获取关联数组形式的查询结果。

额外提醒:务必解决SQL注入风险

你直接把$_POST['inuser']拼接到SQL语句里,这是非常危险的SQL注入漏洞!必须用参数绑定来处理用户输入,避免恶意攻击。

修正后的完整代码

if(isset($_POST['submit'])){
    // 1. 使用参数绑定的预处理语句,彻底避免SQL注入
    $sql = "SELECT * FROM user WHERE username = :username";
    $stmt = $db->prepare($sql);
    $stmt->bindValue(':username', $_POST['inuser'], SQLITE3_TEXT);
    $result = $stmt->execute(); // 执行预处理查询,拿到结果集

    // 2. 获取查询到的用户数据
    $row = $result->fetchArray(SQLITE3_ASSOC);
    if($row){ // 如果查到匹配的用户
        $pwd = $row["password"];
        if(trim($_POST['inpassword']) == trim($pwd)){
            $_SESSION["isLogged"] = true;
            $_SESSION["username"] = $_POST['inuser'];
            // 这里可以添加登录成功后的跳转,比如 header("Location: dashboard.php"); exit;
        } else {
            echo "<div class='alert alert-warning' role='alert'> user/password errati! </div>";
        }
    } else {
        // 没有查到用户的情况
        echo "<div class='alert alert-warning' role='alert'> user/password errati! </div>";
    }
}

调试小技巧

如果还是不确定哪里出问题,可以在关键位置加var_dump()查看数据:

  • 执行查询后,var_dump($result)看看是不是有效的SQLite3Result对象;
  • 获取行数据后,var_dump($row)看看有没有拿到用户的账号密码信息。

内容的提问来源于stack exchange,提问作者user9442771

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:49:44