Я начал кодировать простой скрипт, который считывает идентификаторы из CSV, а затем устанавливает тот же адрес электронной почты (в БД) для ВСЕХ пользователей из CSV. Достаточно просто ... (с использованием PDO) Чтение данных из CSV в порядке. Это часть обновления, которая дает мне головные боли.Возвращаемое значение MySQL UPDATE
$sSQL = "UPDATE users SET email = '[email protected]' WHERE CUSTOMER_ID = '%s'";
foreach ($aUsers as $sCustomerId) {
$sQuery = sprintf($sSQL, $sCustomerId);
if (!$db->exec($sQuery)) {
printf("There was an error updating user %s in database.<br>", $sCustomerId);
$aFailed[] = $sCustomerId;
} else {
printf("User %s successfully updated.<br>", $sCustomerId);
$success++;
}
}
сценарий действительно прост. Проблема в том, что mysql не ОБНОВЛЯЕТ пользователя в БД, если он уже имеет этот адрес электронной почты, поэтому он вернет 0 (0 строк затронуты, что хорошо). То же самое, что mysql возвращает, если во время обновления возникает ошибка. И это то, что меня раздражает. Как я различаю «никакие строки не затронуты» и «ошибка возникла». Я пробовал использовать разные PDO :: ATTR_ERRMODE и ожидал, что, по крайней мере, в случае ошибки он выкинет исключение (какой тип PDO :: ERRMODE_EXCEPTION должен сделать), который я могу, чем поймать, но это не так. Затем я пытаюсь использовать
if ($db->exec($sQuery) === FALSE)
также не работает. Теперь скрипт работает, но проблема в том, что я не могу отличить «ошибку» от «не затронутых строк».
Это поведение в mysql new или? Потому что я не помню, чтобы иметь такую проблему в прошлом при написании таких простых скриптов для обновления ...
Руководство говорит: «Если вы установите столбец в значение, которое оно имеет в настоящее время, MySQL замечает это и не обновляет его «.
Вы уже пробовали PDOStatement :: rowCount? Он возвращает затронутые строки по запросу. поэтому проверьте, 0 или больше :) – Refilon
После обновления необходимо проверить «$ db-> errorCode()», чтобы узнать, произошла ли ошибка –