Проверка существования таблицы базы данных

11

Я читал WordPress Codex и профессиональный WordPress. Кажется, оба используют что-то вроде

if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {

определить, существует ли таблица. Есть ли причина, почему CREATE TABLE IF NOT EXISTS ( ... )не используется? Он проверит и создаст таблицу за 1 запрос, не будет ли лучше? Или я что-то упустил?

JM на работе
источник

Ответы:

10

Если вы используете «ЕСЛИ НЕ СУЩЕСТВУЕТ», то сценарий dbdelta не будет обновлять вашу базу данных, если дельта появились после первоначального создания базы данных.

(при условии, что вы хотите повторно использовать тот же сценарий SQL)

по крайней мере ... это то, что я думаю

edelwater
источник
5

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не гуру WordPress, только администратор MySQL

Если вы хотите использовать другой запрос, попробуйте это

SELECT COUNT(1) FROM information_schema.tables WHERE table_schema='dbname' AND table_name='tbname';

Он либо возвратит 0 (если таблица не существует), либо 1 (если таблица существует)

RolandoMySQLDBA
источник
3

Попробуй это:

global $wpdb;
$table_name = $wpdb->base_prefix.'custom_prices';
$query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $table_name ) );

if ( ! $wpdb->get_var( $query ) == $table_name ) {
    // go go
}
Раксимжон Комильжонов
источник
1
Пожалуйста, отредактируйте свой ответ и добавьте объяснение: почему это может решить проблему?
fuxia
1

Не уверен, как или почему это работает, но я могу сделать:

if (in_array('snippets', $wpdb->tables)) {
  // do something if wp_snippets exists
}
iSWORD
источник
2
это работает только для базовых таблиц, как я нахожу во время тестирования
Manchumahara
это помогло мне определить таблицу плагинов Code Snippets.
iSWORD
0

Используйте get_varфункцию из wpdbкласса с обработкой исключений:

try {
    $wpdb->hide_errors();
    $wpdb->get_var( 'SELECT COUNT(*) FROM ' . $wpdb->prefix . 'translator' );
    $wpdb->show_errors();
} catch (Exception $e) {
    error_log($e);
} finally {
    translator_create_db();
}

Ссылка: ВЫБРАТЬ переменную

Маркос Резенде
источник