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

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地址的分支。
  • 另外还有两个潜在问题:
    1. 没有调用session_start():要使用$_SESSION变量,必须在脚本最开头开启Session,否则无法获取到用户ID。
    2. 存在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();
?>

额外说明

  1. 如果$_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();
  1. 代码中使用了in_array来简化条件判断,比多个&&更简洁易读。
  2. 因为admin表中id=3和4的记录是固定的,所以查询后只需要取一条结果,不需要用while循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:02:48