PHP特定用户ID显示指定地址功能异常求助
问题:PHP条件判断用户ID显示对应地址失效,所有用户均显示id=3的地址
我正在尝试实现一个PHP功能:admin表中有两条地址记录(id分别为3和4),需要让特定用户ID(11303、27)显示id=3的地址,其余用户显示id=4的地址。我通过Session获取用户ID,用条件判断来查询对应地址,但目前所有用户都显示id=3的地址,求帮忙排查问题。
我的代码:
<?php $servername = "localhost"; $username = "user"; $password = "password"; $dbname = "user"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $id = "SELECT * FROM users WHERE id = '" . $_SESSION['user'] . "'"; if ( ($id != 11303) && ($id != 27)) { $sql = "SELECT address FROM admin WHERE id='3'"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "" . $row["address"] . ""; } } else { echo "0 results"; } } else { $sql = "SELECT address FROM admin WHERE id='4'"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "" . $row["address"] . ""; } } else { echo "0 results"; } } $conn->close(); ?>
问题分析
你的代码核心问题出在用户ID的获取逻辑上:
- 你把SQL查询语句直接赋值给了
$id变量,而不是执行这个查询并获取到实际的用户ID值。所以后续的$id != 11303判断永远为真(因为$id是字符串"SELECT * FROM users WHERE id = 'xxx'",根本不是数字ID),导致所有请求都会走显示id=3地址的分支。 - 另外还有两个潜在问题:
- 没有调用
session_start():要使用$_SESSION变量,必须在脚本最开头开启Session,否则无法获取到用户ID。 - 存在SQL注入风险:直接把
$_SESSION['user']拼接到SQL语句中,容易被恶意利用,应该使用预处理语句。
- 没有调用
修正后的代码
<?php // 必须先开启Session,才能访问$_SESSION变量 session_start(); $servername = "localhost"; $username = "user"; $password = "password"; $dbname = "user"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 先获取当前用户ID(假设$_SESSION['user']存储的就是用户ID,如果是用户名则需要调整查询逻辑) $currentUserId = $_SESSION['user'] ?? null; // 处理用户ID不存在的情况 if (!$currentUserId) { echo "请先登录"; $conn->close(); exit; } // 确定要查询的地址ID $targetAddressId = (in_array((int)$currentUserId, [11303, 27])) ? 3 : 4; // 使用预处理语句查询地址,避免SQL注入 $sql = "SELECT address FROM admin WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $targetAddressId); // "i"表示参数是整数类型 $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); echo $row["address"]; } else { echo "未找到地址"; } // 关闭连接和语句 $stmt->close(); $conn->close(); ?>
额外说明
- 如果
$_SESSION['user']存储的不是用户ID而是用户名,那么你需要先查询users表获取对应的ID,这时候也要用预处理语句:
// 示例:如果session存的是用户名,获取用户ID $username = $_SESSION['user'] ?? null; if (!$username) { echo "请先登录"; exit; } $sql = "SELECT id FROM users WHERE username = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("s", $username); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $currentUserId = $result->fetch_assoc()['id']; } else { echo "用户不存在"; $stmt->close(); $conn->close(); exit; } $stmt->close();
- 代码中使用了
in_array来简化条件判断,比多个&&更简洁易读。 - 因为
admin表中id=3和4的记录是固定的,所以查询后只需要取一条结果,不需要用while循环。
内容的提问来源于stack exchange,提问作者fishflow
相关产品推荐
相关产品推荐

