php – while循环更新DB中的日期只更新第一行?

我不知道为什么这不起作用.

    


function query($sql) {

     $this->result = @mysql_query($sql, $this->conn);

     return($this->result != false);

}

function convert(){
        $这 - > DB->打开();
        $sql_update =“”;
        $this-> db-> query(“SELECT * FROM ACCOUNTS”);
        $str ='';
        while($row = $this-> db-> fetchassoc()){
            $jobNum = $row ['JOBNUMBER'];
            $old_date = $row ['INSTALLDATE'];
            $new_date = date(“Y-m-d”,strtotime($old_date));
            $sql_update =“UPDATE ACCOUNTS SET INSTALLDATE ='$new_date'WHERE JOBNUMBER ='$jobNum'”;
            // $this-> db-> query($sql_update)或die($this-> response-> throwResponseError(MSG_DATABASE_ERROR.mysql_error()));
            $str.= $jobNum. “ - ”. $new_date. “”;
        }

    return $str;
}

如果我用注释掉的那一行运行它,它会返回我想要的所有结果.但是当我取消注释它实际运行更新的行时,它会更新第一条记录并停止循环.为什么?


最佳答案 当您运行update时,它会使db中的隐藏语句hander以及与之关联的结果无效.

db->query("SELECT …") -- creates the handler

-- 1st iteration
db->fetchassoc() -- fetches the first row
db->query("UPDATE …") -- creates another handler and destroys the old one

-- 2nd iteration
db->fetchassoc() -- no rows returned by `UPDATE`, nothing to fetch

您尝试做的事情可以使用单个语句更轻松地完成:

UPDATE  accounts
SET     installed = DATE_FORMAT(STR_TO_DATE(installed, @current_format_string), '%Y-%d-%m')

,其中@current_format_string是你的日期格式化的方式.

更新:

尝试运行此查询:

UPDATE  accounts
SET     installdate = DATE_FORMAT(STR_TO_DATE(installdate , '%m/%d/%Y'), '%Y-%d-%m')

在运行UPDATE查询之前,您可能希望使用SELECT检查结果:

SELECT  DATE_FORMAT(STR_TO_DATE(installdate, '%m/%d/%Y'), '%Y-%d-%m')
FROM    accounts

点赞