PHP条件判断异常:查询结果始终判定为0导致错误重定向求助
问题分析与修复方案
哥们,你的代码里有几个关键问题导致判断逻辑一直出错,我给你拆解并修正一下:
1. SQL查询语句的语法与安全问题
你写的SELECT currentlevel FROM users WHERE users={$_SESSION[user_id]}存在两处明显问题:
- 字段名写错了:应该是
user_id而非users,这会导致数据库找不到匹配字段,查询结果为空; - 数组索引未加引号:
$_SESSION[user_id]要改成$_SESSION['user_id'],PHP中字符串类型的数组索引必须用引号包裹; - 直接拼接变量到SQL里有SQL注入风险,这是非常不安全的写法。
2. 错误判断了mysqli_query的返回值
mysqli_query()执行成功时返回的是结果集对象,不是你要的currentlevel数值。只有当查询完全失败(比如语法错误、数据库连接异常)时才会返回false。你现在判断$r == 0,结果集对象和0比较永远为真,所以不管怎样都会触发跳转。
修复后的代码示例
我给你改了安全且逻辑正确的版本,用预处理语句避免注入,同时正确获取和判断字段值:
// 先检查用户是否登录,避免未定义索引错误 if (!isset($_SESSION['user_id'])) { header("Location: login.php"); exit; } // 使用预处理语句安全查询 $q = "SELECT currentlevel FROM users WHERE user_id = ?"; $stmt = mysqli_prepare($link, $q); // 假设user_id是整数类型,用"i";如果是字符串类型则用"s" mysqli_stmt_bind_param($stmt, "i", $_SESSION['user_id']); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 获取查询到的用户数据 $user = mysqli_fetch_assoc($result); // 处理判断逻辑 if (!$user || $user['currentlevel'] == 0) { header("Location: EXAMPLE-WEBSITE.co.uk"); exit; // 跳转后必须终止代码执行,避免后续逻辑跑起来 } else { // currentlevel为1时执行的后续代码 // ... 你的业务逻辑 }
额外提醒
- 跳转后一定要加
exit或die(),否则PHP会继续执行后续代码,可能引发意外问题; - 养成用预处理语句的习惯,这是防止SQL注入的标准做法;
- 每次操作SESSION前最好先检查变量是否存在,避免出现警告信息。
内容的提问来源于stack exchange,提问作者Luxry
相关产品推荐
相关产品推荐

