Используя PHP PDO, есть ли способ различить разницу между сбоем UPDATE и успешно запущенным UPDATE, но установившим для поля его существующее значение?
$sql = 'UPDATE table SET column = :column WHERE id = :id';
$statement = $db->prepare($sql);
$statement->bindParam(':column', $column, PDO::PARAM_STR);
$statement->bindParam(':id', $id, PDO::PARAM_INT);
$statement->execute();
$RowsUpdated = $statement->rowCount();
echo '$RowsUpdated = '.$RowsUpdated.'<br />';
Приведенный выше код устанавливает $RowsUpdated в 1, если значение $column является новым значением, и устанавливает его в 0, если оно совпадает с существующим значением. Я попытался вызвать ошибку, изменив оператор SQL, но он никогда не возвращает нечисловое значение (например, NULL или False) и никогда не меньше 0.
Когда SELECT'ирует строки с помощью COUNT(*), fetchColumn() возвращает количество строк, если они есть, или 0, если их нет, или что-то еще, если есть ошибка. Таким образом, я могу использовать ($countRowsSelected > 0) для обнаружения строк, ($countRowsSelected === "0") для обнаружения отсутствия строк и ELSE для обнаружения ошибки.
Можно ли это сделать с помощью ОБНОВЛЕНИЯ? В дополнение к ОБНОВЛЕНИЮ я хочу инициировать вторичные действия, но только если сохраненное значение ИЗМЕНЕНО, поэтому я хочу этого:
if ($RowsUpdated > 0) {
// We go a NEW value, let's do a little dance
} else if ($RowsUpdated === "0") {
// It saved, but the value was unchanged
} else {
// Error!
}
Я попытался добавить PDO::MYSQL_ATTR_FOUND_ROWS => true к моему PDO, но это заставило rowCount() возвращать 1 независимо от того, изменилось ли значение, поэтому это не помогло.