Еще раз. Только мое личное дело, куда я буду писать лог и по каким причинам. Я пишу в базу, а значит хэндлеру просто необходимо к ней подключиться. Вопрос же заключался в том, почему после завершения хэндлера объект соединения не содержит данных об ошибке.
Я уже принял ответ "FanatPHP Не знаю. Похоже на багофичу. Возможно, унутре у нее mysqli_connect_error(), которая соединениев не различает..." и единственное, что меня теперь беспокоит (да и с самого начала), это: Данное поведение нормально, или, все таки, это "странная" работа mysqli?
Предлагаете открывать соединение всегда, на случай ошибки? Это глупо, учитывая тот факт, что 99.9% времени ошибок нет. И, рация на танке - второй коннект происходит внутри хэндлера, а не до его вызова.
А причина багофичи мне видится в том, что mysqli имеет и процедурный интерфейс. Как ни крути, я сколько бы ошибочным ни было писать ошибки в базу, мне не кажется такое поведение правильным.
По причине того, что приведенный листинг упрощен. Это раз) Два - $db->connect_error все равно пуст в данном случае, так как $log->mysqli_connect "перезаписал" его значение.
Факт ошибки - E_WARNING mysqli::mysqli(): (HY000/2005): Unknown MySQL server host...
Окей, мы уже определились, что писать лог в базу направильно. И что такое поведение "багофича". Спасибо за ответы ;)
1. Таким образом я заставляю MySQLi кидать критическую ошибку и не более того. Для моего приложения этого хватит, но
2. Все же, почему статус ошибки перезаписывается другим экземпляром? Какая-то фундаментальная ошибка в моих знаниях?
3. Почему эррор хэндлер - вредно? Писать в базу не выпендреж, мне надо писать единый лог с нескольких нод одного сервиса. А так же, производить иные манипуляции - например, слать пушами критические ошибки и прочие ошибки в логике приложения.
Вот-вот. Так как объект возвращается в любом случае, проверить можно только ошибкой, которая по какой-то непонятной причине перезаписывается после вызова другого экземпляра.
Да, собственно, если отключить запись в лог, я получаю корректную ошибку. $mysqli->connect_error в моем случае тоже пустой.
Я, пока, вижу только один выход - использовать для лога PDO, но это же неправильно!
И как это должно помочь? В обработчике нет ошибок, он спокойно пишет в другую базу. По дальше мне надо проверить соединение и прервать выполнение (т.к. эта ошибка критична для меня). Но при проверке я вижу код 0, хотя должен видеть ошибку, разве не так?
Только читая доку понял, что ошибка в другом месте была.