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); }
代码说明
- 预处理语句:所有涉及用户输入的SQL查询都用了
prepare+bind_param,彻底避免SQL注入问题 - 数组填充:两个数组都通过循环完整读取了数据表中的所有对应记录,确保没有遗漏
- 存在性检查:用
in_array()函数直接判断单个徽章ID是否在律师的徽章数组里,逻辑清晰直观 - 额外扩展:注释里加了
array_diff的用法,可以快速获取律师未拥有的徽章列表,按需使用
内容的提问来源于stack exchange,提问作者oshadhi
相关产品推荐
相关产品推荐

