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

如何从polls表提取数据并批量更新users表?

批量更新users表的投票数解决方案

原代码的问题

你当前的代码做了两次冗余查询:第一次取userid,第二次又根据这些userid取votes,其实一次查询就能拿到所有需要的userid和votes数据。另外直接拼接$_GET参数到SQL里存在严重的SQL注入风险,且mysql_*系列函数已被废弃,建议后续改用mysqli或PDO。


方法一:用SQL JOIN直接批量更新(推荐,效率最高)

无需PHP循环,直接通过SQL关联两张表完成批量更新,这是数据库层面的最优方案:

$pollid = (int)$_GET["pollid"]; // 强制转整数规避注入风险
$sql = "UPDATE users u
        JOIN polls p ON u.id = p.userid
        SET u.total_votes = COALESCE(u.total_votes, 0) + p.votes
        WHERE p.pollid = $pollid";
mysql_query($sql);

说明:

  • COALESCE(u.total_votes, 0)用于处理total_votes为NULL的情况,避免计算结果变为NULL
  • 通过JOIN关联两张表,一次性完成所有符合条件用户的投票数更新

方法二:PHP循环处理(适合理解流程)

如果需要通过PHP逻辑控制更新过程,可以先一次性查询所有userid和votes,再逐个执行更新:

$pollid = (int)$_GET["pollid"];
$poll_res = mysql_query("SELECT userid, votes FROM polls WHERE pollid = $pollid");

while($poll_row = mysql_fetch_array($poll_res)) {
    $userid = (int)$poll_row['userid'];
    $votes = (int)$poll_row['votes'];
    mysql_query("UPDATE users SET total_votes = COALESCE(total_votes, 0) + $votes WHERE id = $userid");
}

重要提醒

  1. SQL注入防护:必须对$_GET["pollid"]做过滤,上述代码用(int)强制转整数是最简单的方式;若为字符串参数,需使用mysql_real_escape_string()处理
  2. 废弃函数迁移:mysql_*函数已在PHP 5.5.0废弃、PHP 7.0.0移除,建议尽快迁移到mysqli或PDO,并使用预处理语句
  3. NULL值处理:若users.total_votes字段可能为NULL,必须用COALESCE将其转为0后再相加,否则计算结果会是NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:35:28