如何从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"); }
重要提醒
- SQL注入防护:必须对
$_GET["pollid"]做过滤,上述代码用(int)强制转整数是最简单的方式;若为字符串参数,需使用mysql_real_escape_string()处理 - 废弃函数迁移:
mysql_*函数已在PHP 5.5.0废弃、PHP 7.0.0移除,建议尽快迁移到mysqli或PDO,并使用预处理语句 - NULL值处理:若
users.total_votes字段可能为NULL,必须用COALESCE将其转为0后再相加,否则计算结果会是NULL
内容的提问来源于stack exchange,提问作者Cecil_FF
相关产品推荐
相关产品推荐

