While цикл для обновления дат в БД обновляет только первую строку?

102
10

Я понятия не имею, почему это не сработает.   


function query($sql) {

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

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

}


function convert() {       $ This-> db-> Open();       $ 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;
}

код>


Если я запустил его с указанной строкой, он вернет все результаты, которые я хочу. Но когда я раскомментирую строку, в которой он фактически запускает обновление, он обновляет первую запись и останавливает цикл. Почему?

спросил(а) 2021-01-19T14:53:01+03:00 9 месяцев назад
1
Решение
79

При запуске обновления он отменяет скрытый оператор инструкции в db и связанных с ним результатах.


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:


Попробуйте выполнить этот запрос:


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

ответил(а) 2021-01-19T14:53:01+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема