Исходный код
function table_exists($table) {
self :: query("show tables from ".DB_NAME);
for ($i = 0; $i < self :: num(); $i++) {
$res = mysqli_fetch_array($this -> result);
if ($res[0] == DB_PREFIX . $table) {
return true;
}
}
return false;
}
Очень здорово, что проверка существования таблицы убрана в отдельный метод, а не заинлайнена в код, где она необходима, — это позволяет менять реализацию проверки произвольным образом. Например, если проверки выполняются часто, мы можем захотеть добавить кеширование, чтобы уменьшить количество запросов к БД.
Рефакторинг логики проверки существования таблицы
Когда я принимаюсь за реализацию какой-то маленькой подзадачи, я всегда сначала оцениваю, как много людей могли бы захотеть сделать то же самое. Если таких людей много — больше миллиона, то скорее всего, функция для решения моей подзадачи уже есть в стандартной библиотеке. Если больше 1000 — то функцию стоит поискать где-то в библиотечных пакетах.
В MySQL есть возможность сделать выборку отдельной таблицы, а не всех таблиц в базе данных — с помощью того же запроса SHOW TABLES
, через предложение LIKE
.
function table_exists($table) {
self :: query("show tables from ".DB_NAME." like '".DB_PREFIX . $table."'");
return self :: num() > 0;
}