Некорректная отработка мапперов движка, граничащая с ошибкой

Когда-то давно уже писал об этом, но хочу еще раз обратить внимание ort и всех разработчиков. Есть банальная вещь в отработке SQL-запросов, о которую спотыкаются новички, но про которую негоже забывать профи.

SQL-конструкция «UPDATE ...» возвращает либо число обновленных строк, либо FALSE, если произошла ошибка. В UPDATE-запросах возвращается число строк, задействованных в обновлении. Оно вполне может быть нулевым, что не является признаком ошибки. И самое интересное — если дать команду «UPDATE ...», а движок базы видит, что значения в команде те же самые, что и в оригинальной записи, то он не выполняет обновление и возвращает число обновленных строк, равным нулю.

Но в движке (и часто в сторонних плагинах) часто встречается такая конструкция:
$sql = "UPDATE ...";
if ($this->oDb->query($sql, ...)) {
  return true;
}
return false;

Внимание, задачка для начинающих программеров: что вернет этот код, если в SQL-коде будут заданы старые значения записи, и команда UPDATE вернет ноль?

2 комментария

avatar
— Так, сходу. Условие в if выполняется только при TRUE. Но, если возвратится 0, будет печаль.
Код вернёт FALSE.
Предлагаю жёсткое сравнение по типам.
avatar
Ну хоть кого-то заинтересовала проблема!

Да, там однозначно надо ставить либо
return $this->oDb->query($sql, ...)===FALSE;

либо (если нужно в маппере как-то еще отработать условие)
if ($this->oDb->query($sql, ...)!==FALSE) {
  // something code
  return true;
}
return false;

Т.е. совершенно верно — нужно делать жесткое сравнение по типу
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.