如何在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
相关产品推荐
相关产品推荐

