Некорректная отработка мапперов движка, граничащая с ошибкой
Когда-то давно уже писал об этом, но хочу еще раз обратить внимание ort и всех разработчиков. Есть банальная вещь в отработке SQL-запросов, о которую спотыкаются новички, но про которую негоже забывать профи.
SQL-конструкция «UPDATE ...» возвращает либо число обновленных строк, либо FALSE, если произошла ошибка. В UPDATE-запросах возвращается число строк, задействованных в обновлении. Оно вполне может быть нулевым, что не является признаком ошибки. И самое интересное — если дать команду «UPDATE ...», а движок базы видит, что значения в команде те же самые, что и в оригинальной записи, то он не выполняет обновление и возвращает число обновленных строк, равным нулю.
Но в движке (и часто в сторонних плагинах) часто встречается такая конструкция:
Внимание, задачка для начинающих программеров: что вернет этот код, если в SQL-коде будут заданы старые значения записи, и команда UPDATE вернет ноль?
SQL-конструкция «UPDATE ...» возвращает либо число обновленных строк, либо FALSE, если произошла ошибка. В UPDATE-запросах возвращается число строк, задействованных в обновлении. Оно вполне может быть нулевым, что не является признаком ошибки. И самое интересное — если дать команду «UPDATE ...», а движок базы видит, что значения в команде те же самые, что и в оригинальной записи, то он не выполняет обновление и возвращает число обновленных строк, равным нулю.
Но в движке (и часто в сторонних плагинах) часто встречается такая конструкция:
$sql = "UPDATE ...";
if ($this->oDb->query($sql, ...)) {
return true;
}
return false;
Внимание, задачка для начинающих программеров: что вернет этот код, если в SQL-коде будут заданы старые значения записи, и команда UPDATE вернет ноль?
2 комментария
Код вернёт FALSE.
Предлагаю жёсткое сравнение по типам.
Да, там однозначно надо ставить либо
либо (если нужно в маппере как-то еще отработать условие)
Т.е. совершенно верно — нужно делать жесткое сравнение по типу