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

10 мар. 2011 г., 07:45:56
Просмотры: 38.7K
Голосов: 20

Я прочитал WordPress Codex и Professional WordPress. Похоже, оба используют что-то вроде

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

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

0
Все ответы на вопрос 7
0
13

Если вы используете "IF NOT EXISTS", то скрипт dbdelta не обновит вашу базу данных с изменениями (дельтами), появившимися после первоначального создания базы.

(предполагая, что вы хотите повторно использовать тот же SQL-скрипт)

По крайней мере... так я думаю

12 мар. 2011 г. 02:56:05
1

Попробуйте этот вариант:

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 ) {
    // вперед
}
12 апр. 2019 г. 18:10:40
Комментарии

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему?

fuxia fuxia
12 апр. 2019 г. 18:47:13
0

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не эксперт по WordPress, только администратор баз данных MySQL

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

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

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

22 апр. 2011 г. 09:46:59
1

Кратко

require_once ABSPATH . 'wp-admin/includes/upgrade.php';
global $wpdb;
$tablename = 'myTable'; 
$main_sql_create = "CREATE TABLE $tablename";    
maybe_create_table( $wpdb->prefix . $tablename, $main_sql_create );

WordPress теперь предоставляет функцию maybe_create_table - см. https://developer.wordpress.org/reference/functions/maybe_create_table/

Перед вызовом этой функции необходимо вручную подключить файл upgrade.php, иначе вы получите фатальную ошибку следующего вида:

PHP Fatal error: Uncaught Error: Call to undefined function maybe_create_table()

3 дек. 2020 г. 07:47:17
Комментарии

Добро пожаловать в разработку на WordPress! Хотя теоретически это может отвечать на вопрос, желательно включить основные части ответа здесь, а ссылку предоставить для справки.

Glorfindel Glorfindel
3 дек. 2020 г. 09:01:26
2

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

if (in_array('snippets', $wpdb->tables)) {
  // выполнить что-то, если wp_snippets существует
}
18 сент. 2018 г. 19:05:36
Комментарии

это работает только для основных таблиц, как я обнаружил во время тестирования

Manchumahara Manchumahara
7 мар. 2019 г. 10:02:41

у меня сработало для обнаружения таблицы плагина Code Snippets.

iSWORD iSWORD
7 мар. 2019 г. 12:32:59
0

Понимаю, что это очень старый вопрос, но возможно кто-то найдет его полезным. Небольшой класс, который обрабатывает функции для новой БД, версии таблицы и создает ее, если она не существует.

class ACCESS_TBDB {
 private $wpdb = null;
 private $accessTable = 'table_prefix'; // просто название префикса вашей таблицы
 private $accessTableVer = '1.0.7'; // версия таблицы
 private $accessTableOptName = 'access_db_ver'; // название опции для версии БД

public function __construct()
{
    global $wpdb;
    //Мне не нравится вызывать global $wpdb в каждой функции класса
    $this->wpdb = $wpdb;
    $tablename = $this->accessTable;
    //устанавливаем префикс нашей таблицы
    $this->wpdb->access_table = $this->wpdb->prefix . $tablename;

    // каждый раз проверяем, нужно ли создавать БД или нет
    $this->checkAccessDatabase();
}

private function createDBSQL(){
    // SQL для создания таблицы БД
    $charset = $this->wpdb->get_charset_collate();
    $sql = "
    CREATE TABLE {$this->wpdb->access_table} (
        id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
        name TINYTEXT,
        type VARCHAR(10),
        value SMALLINT DEFAULT 0 NOT NULL,
        created_at DATETIME DEFAULT NULL,
        PRIMARY KEY (id)
    ) $charset;
    ";

    return $sql;
}

private function checkAccessDatabase(){

    $version = $this->accessTableVer;

    //обрабатываем версии БД
    $db_version = get_option( $this->accessTableOptName , '0.0.0');
    
    //Без этого мы получим ошибку в dbDelta и maybe_create_table
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    $dbCreateSql = $this->createDBSQL();
    
    // проверяем, нужно ли обновление БД
    if (version_compare($version, $db_version, '>')) {
        
        // если содержатся старые dev/legacy версии
        if (version_compare($db_version, '1.0.0', '<')) {
            $this->wpdb->query("DROP TABLE IF EXISTS {$this->wpdb->access_table};");
        }

        dbDelta($dbCreateSql);

        update_option( $this->accessTableOptName , $version);

    }else{
        //https://developer.wordpress.org/reference/functions/maybe_create_table/
        // просто проверяем существование БД на случай, если она была удалена по каким-то причинам... :)
        $recreate = maybe_create_table( $this->wpdb->access_table, $dbCreateSql );
        if(!$recreate){
            update_option( $this->accessTableOptName , $version);
        }
    }
    
 }
    ... другие функции ...
}
7 мая 2021 г. 15:46:02
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();
}

Ссылка: Выбор переменной

26 окт. 2019 г. 00:15:42