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

PHP实现MySQL查询结果存数组并验证徽章ID是否在律师徽章数组中

解决思路与修正代码

我看你现在的代码主要有几个小问题需要调整,同时我会帮你实现完整的需求——把所有徽章ID存入数组、收集指定律师的徽章,再做存在性检查。咱们一步步来:

现有代码的问题点

  • 获取所有徽章时,mysqli_fetch_array($badgeList)只取了数据表的第一行,漏掉了其他徽章
  • 收集律师徽章时,你把整个$row数组存进了$badge_array,但其实只需要bID这个值
  • 直接把$username拼进SQL语句里有SQL注入风险,建议用预处理语句来规避

修正后的完整代码

$username = $_SESSION['username'];
getPoints();

function getPoints() {
    global $connection;
    global $username;
    
    // 用预处理语句查询用户积分,避免SQL注入
    $pointCount_stmt = $connection->prepare("SELECT points FROM lawyer WHERE username = ?");
    $pointCount_stmt->bind_param("s", $username);
    $pointCount_stmt->execute();
    $pointCount_result = $pointCount_stmt->get_result();
    $pointCount = $pointCount_result->fetch_assoc();
    
    $points = (int)$pointCount['points'];
    addBadges($points);
    
    $pointCount_stmt->close();
}

function addBadges($user_points) {
    global $connection;
    global $username;
    
    // 1. 获取所有徽章ID,存入allBadges数组
    $allBadges = [];
    $badgeList_stmt = $connection->prepare("SELECT bId FROM badge");
    $badgeList_stmt->execute();
    $badgeList_result = $badgeList_stmt->get_result();
    
    while ($row = $badgeList_result->fetch_assoc()) {
        $allBadges[] = $row['bId'];
    }
    $badgeList_stmt->close();
    
    // 2. 获取指定律师的所有徽章ID,存入lawyerBadges数组
    $lawyerBadges = [];
    $lawyers_badges_stmt = $connection->prepare("SELECT bID FROM lawyerbadge WHERE username = ?");
    $lawyers_badges_stmt->bind_param("s", $username);
    $lawyers_badges_stmt->execute();
    $lawyers_badges_result = $lawyers_badges_stmt->get_result();
    
    while ($row = $lawyers_badges_result->fetch_assoc()) {
        // 只存入bID的值,而不是整个数组
        $lawyerBadges[] = $row['bID'];
    }
    $lawyers_badges_stmt->close();
    
    // 3. 检查allBadges中的元素是否存在于lawyerBadges数组中
    echo "<h3>徽章存在性检查结果:</h3>";
    foreach ($allBadges as $badgeId) {
        if (in_array($badgeId, $lawyerBadges)) {
            echo "徽章ID {$badgeId}:该律师已拥有<br>";
        } else {
            echo "徽章ID {$badgeId}:该律师未拥有<br>";
        }
    }
    
    // 如果你需要获取律师未拥有的徽章,也可以用array_diff
    // $missingBadges = array_diff($allBadges, $lawyerBadges);
    // echo "<h3>未拥有的徽章:</h3>" . implode(", ", $missingBadges);
}

代码说明

  1. 预处理语句:所有涉及用户输入的SQL查询都用了prepare+bind_param,彻底避免SQL注入问题
  2. 数组填充:两个数组都通过循环完整读取了数据表中的所有对应记录,确保没有遗漏
  3. 存在性检查:用in_array()函数直接判断单个徽章ID是否在律师的徽章数组里,逻辑清晰直观
  4. 额外扩展:注释里加了array_diff的用法,可以快速获取律师未拥有的徽章列表,按需使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:30:12