记一次分页获取数据的搞笑 bug
12 September 2018

背景:订单表里面有一些数据错误,需要将表里面的 add_time 改为 当前的时间。思路是分页获取订单数据,每页 100 条,于是同事写了如下代码

$page_num = 1;
$page_size = 100;

$cond = "select * from order where add_time = 0";
$count = $order_service->count($cond);
$total_page = ceil($count / $page_size);

$current_time = time();

do {
    $result = $order_service->getByPage($cond, $page_num, $page_size);
    foreach ($result as $data) {
        $order_service->update("update add_time = {$current_time} where id={$data['id']}");
    }

    $page_num += 1;
} while ($total_page >= $page_num);

上面的代码有 bug,每次只改了一半的订单数据 -_-
原因是每次根据 add_time=0 这个条件去数据拿数据,拿完之后又马上更新了 add_time 。随着 page_num 的增加, page_num 之前的订单不会被处理到(这是一个很搞笑的逻辑 bug,也是跑脚本更新数据的时候应该注意的)