Comments 13
Я аж календарь проверил... Не, ну мало ли? Вдруг мои молитвы исполнились и мы снова в 2007? Текстовые RPG, CodeIgniter, MySQL...
А баги-то какие! (bool)$value, и заморочики с мультибайтом. Там же еще и данные, наверняка, с фронта как form-data приходят, а не по вебскоетам json летает. Автор, а ты с тем, что поля чек-бокса просто нет, когда он снят не мучался?
Блин, надо бы старым друзьям позвонить, что ли...
Ха, календарь можешь не перепроверять - стек и правда чисто ностальгический, и это где-то выбор того, что умею и наивного предположеня, что проект простой да и он пет-проект, где хочется не воевать с тулингом, а писать игру. CodeIgniter + MySQL + текстовая RPG - олдскул как он есть ))
Про чекбокс ты прямо в корень смотришь: да, ровно эта классика. Снятый чекбокс в форме просто не приходит в запросе, и половина «загадочных» багов растёт из того же огорода, что и (bool)“false”. Лечится скучно - нормализовать вход на бэке и не верить тому, что прислал браузер.
"false" ==> true
Javascript'еры сейчас посмеиваются над такой тривиальной для них задачей )
boolvar ? 1 : 0
Я проверил, можно сделать без тернарника
$update['value_bool'] = boolvar * 1

Ни одна из этих граблей не лечится чтением документации вперёд
Почему же?
https://www.php.net/language.types.boolean.php#:~:text=Example %231 Casting to Boolean
Эх ссылку разломало. Нажимать нужно на правый обломок.
Спасибо, но тут небольшое смещение акцента. * 1 работает, когда на входе уже настоящий bool — тогда да, true * 1 | false * 1 → 1|0, короче тернарника.
Но грабля была не в этом. Из формы прилетала строка "false", а не булево:
(bool) "false" === true— непустая строка истинна, поэтому тернарник и давал1;"false" * 1тут не спасает: на PHP 8 этоTypeError: Unsupported operand types: string * int, на PHP 7 —0с warning. То есть либо падение, либо «угадал» по случайной причине.
Поэтому фикс — filter_var($v, FILTER_VALIDATE_BOOLEAN): он понимает именно строковые "false"/"0"/"" → false.
Про «не лечится чтением доков» — справедливо придрались: правила приведения, конечно, задокументированы. Я имел в виду не «доки врут», а что заранее не угадаешь, в каком из тысяч мест прилетит именно строка "false" из живого ввода. Вылезает на реальных данных, а не на странице про casting.
Чувак, неужели это такой сложный комментарий был, что отвечать на него пришлось просить ChatGPT?
Про bool я понимаю. Предложил только заменить ? 1 : 0 на * 1
Одна беда: переписать тысячи $char[‘…’] на $char->… за раз — это поставить мир на паузу.
Эм, что? Почему что-то надо ставить на какую-то паузу?
«Пауза мира» — метафора, не буквальная остановка сервера. Смысл: заменить тысячи $char['x'] на $char->x можно только одним огромным коммитом, который трогает разом весь код. Выкатываешь — и если хоть в одном из тысяч мест опечатка, падает у живых игроков прямо в бою или походе.
То есть выбор: либо заморозить всю остальную разработку ради одного big-bang рефактора и надеяться, что нигде не промахнулся, либо ломать прод вживую. «Нельзя ставить на паузу» = нельзя позволить себе такой разовый риск, пока по карте ходят живые люди.
Поэтому и сделал ArrayAccess на Entity: старый $char['x'] и новый $char->x работают одновременно → миграция по кусочку, без остановки.
Сразу видно гениального маркетолога. Собственная криворукость легким движением руки превращается в "грабли РНР", которые ещё и "не лечатся чтением документации".
Два года один пилю MMORPG на CI4: пять багов, за каждым из которых стоял живой игрок