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

如何使用bind_result存储SQL查询返回的多候选人票数求和数组?

问题原因与解决办法

核心问题

你的代码存在两个关键逻辑错误,导致只能拿到第一位候选人的票数:

  1. $votes = array(); 放在循环内部,每次循环都会清空之前收集的票数
  2. 第一次循环结束后就执行了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:35:50