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


11

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

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

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

Ответы:


10

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

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

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


5

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

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

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

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


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
}

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();
}

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.