Класс конструктора запросов Codeigniter: как правильно обрабатывать возможные непредвиденные ошибки? - PullRequest
0 голосов
/ 03 мая 2019

После работы с Nodejs я привык к различным API-интерфейсам, основанным на обещаниях, которые выдают исключение / ошибку в случае какой-либо ошибки.

Как в Codeigniter, так и в Laravel, я вижу, что ВСЕ примеры запросов типа "предполагают", что все "будет хорошо": нет try-catch или какой-либо другой формы обработки ошибок.

Например, я вижу, что метод вставки CI возвращает true при успехе, false при ошибке. Несмотря на это, ни один из примеров, которые я видел, не использует булевскую проверку if / else для операции. То же самое касается Laravel, который, очевидно, является гораздо более современной и профессиональной структурой.

На данный момент я вручную проверял «true» или «false» для каждого запроса, который возвращает логическое значение, но проблема в том, что некоторые методы возвращают другие типы, например методы «insert_batch», тип возвращаемого значения указано как «смешанный».

Может кто-то пролить свет на эту проблему? Какой подход используют другие, чтобы ничего не сломалось из-за плохой обработки ошибок в базе данных?

Ссылка на соответствующий раздел в документах CI: https://www.codeigniter.com/user_guide/database/query_builder.html?highlight=query%20builder

1 Ответ

3 голосов
/ 04 мая 2019

Запросы на «чтение» - get() и get_where() - не документированы правильно. Он говорит, что возвращаемое значение равно CI_DB_result, но также может возвращать FALSE. Я всегда проверяю возвращение методов «чтения», используя этот шаблон (или что-то подобное).

$query = $this->db->get();
return $query !== FALSE ? $query->result() : NULL;

Главное знать, что $query не FALSE, прежде чем пытаться запустить метод для него.

Для запросов «записи» просто возвращает результат работы метода Query Builder, например,

return $this->db->insert('mytable', $data);

Естественно, получатель этого возврата должен обратить внимание.

Следующая строка кода может вернуть любой из следующих объектов: TRUE, FALSE или CI_DB_result объект.

$this->db->query('YOUR QUERY HERE');

Полное определение query() равно

DB_driver::query($sql, $binds = FALSE, $return_object = NULL);

Настройте проверку возврата на запрос строки $sql.

После определения синтаксиса оператора запроса будущие проблемы чаще всего связаны с неверными входными данными. Я обычно трачу больше времени на проверку входных данных запроса, чем на выход. Вещи как: есть ли здесь ценность? Это правильный тип данных? Это в ожидаемом диапазоне? Вывоз мусора - Вывоз мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...