如何使用bind_result存储SQL查询返回的多候选人票数求和数组?
问题原因与解决办法
核心问题
你的代码存在两个关键逻辑错误,导致只能拿到第一位候选人的票数:
$votes = array();放在循环内部,每次循环都会清空之前收集的票数- 第一次循环结束后就执行了
return $votes,直接退出函数,后面的候选人根本没机会处理
另外,bind_result本身支持将结果存储到变量,你这里的用法没问题,问题出在循环和return的逻辑上。
修正方案1:修复原有循环逻辑
把数组初始化移到循环外,去掉循环内的return,等所有候选人处理完再统一返回结果:
// Display Presidential Candidates Results public function displayPresdentialCandidatesResults($Id){ print_r($Id); $votes = array(); // 移到循环外面,避免每次清空 if(!empty($Id)){ // 复用预处理语句,提升执行效率 $stmt = $this->con->prepare("SELECT SUM(noOfVotes) AS totalVotes FROM resultstbl WHERE id = ?"); $stmt->bind_param("s", $pId); foreach($Id as $cand_id){ // 用foreach遍历比for循环更简洁 echo "<br>" . $cand_id; $pId = $cand_id; $stmt->execute(); $stmt->bind_result($totalVotes); $stmt->fetch(); // SUM聚合查询只会返回一行结果,无需while循环 $votes[] = $totalVotes; $stmt->free_result(); // 释放当前结果集,避免干扰下一次查询 } $stmt->close(); // 关闭预处理语句 } return $votes; // 所有候选人处理完成后再返回结果 }
修正方案2:优化为单次SQL查询(更高效)
没必要循环查询多次,用IN子句一次获取所有候选人的总票数,能大幅减少数据库交互次数:
// Display Presidential Candidates Results public function displayPresdentialCandidatesResults($Id){ print_r($Id); $votes = array(); if(!empty($Id)){ // 生成对应数量的SQL占位符 $placeholders = implode(',', array_fill(0, count($Id), '?')); // 按id分组查询,确保每个候选人的票数对应正确 $stmt = $this->con->prepare("SELECT id, SUM(noOfVotes) AS totalVotes FROM resultstbl WHERE id IN ($placeholders) GROUP BY id"); // 批量绑定参数:生成对应长度的类型字符串,再传递所有id $types = str_repeat('s', count($Id)); $stmt->bind_param($types, ...$Id); $stmt->execute(); $result = $stmt->get_result(); // 获取结果集对象,比bind_result更灵活 while($row = $result->fetch_assoc()){ $votes[$row['id']] = $row['totalVotes']; // 用id作为数组键,方便后续对应候选人 } $stmt->close(); } // 如果需要保持和输入$Id一致的顺序,可做如下处理 $orderedVotes = array(); foreach($Id as $id){ $orderedVotes[] = $votes[$id] ?? 0; // 无票数时默认返回0 } return $orderedVotes; }
内容的提问来源于stack exchange,提问作者Ndongesit Edet
相关产品推荐
相关产品推荐

