Verifica dell'esistenza di una Tabella nel Database

10 mar 2011, 07:45:56
Visualizzazioni: 38.7K
Voti: 20

Ho letto il codex di WordPress e WordPress professionale. Sembra che entrambi utilizzino qualcosa come

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

per determinare se la tabella esiste. C'è qualche motivo per cui non viene utilizzato CREATE TABLE IF NOT EXISTS ( ... )? Controllerà e creerà la tabella in una sola query, non sarebbe meglio? O mi sta sfuggendo qualcosa?

0
Tutte le risposte alla domanda 7
0
13

Se utilizzi "IF NOT EXISTS" allora lo script dbdelta non aggiornerà il tuo database con le modifiche (delta) apparse dopo la creazione iniziale del database.

(supponendo che tu voglia riutilizzare lo stesso script sql)

Almeno... questo è quello che penso

12 mar 2011 02:56:05
1

Prova questo:

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 ) {
    // vai avanti
}
12 apr 2019 18:10:40
Commenti

Per favore [modifica] la tua risposta e aggiungi una spiegazione: perché questa soluzione potrebbe risolvere il problema?

fuxia fuxia
12 apr 2019 18:47:13
0

DICHIARAZIONE: Non sono un Guru di WordPress, solo un DBA MySQL

Se vuoi utilizzare una query diversa, prova questa

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

Restituirà 0 (se la tabella non esiste) o 1 (se la tabella esiste)

22 apr 2011 09:46:59
1

TL;DR

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 ora fornisce la funzione maybe_create_table - vedi https://developer.wordpress.org/reference/functions/maybe_create_table/

Prima di chiamare questa funzione è necessario includere manualmente il file upgrade.php, altrimenti si otterrà un errore fatale come il seguente:

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

3 dic 2020 07:47:17
Commenti

Benvenuti nello Sviluppo WordPress! Sebbene questo potrebbe teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il link come riferimento.

Glorfindel Glorfindel
3 dic 2020 09:01:26
2

Non sono sicuro di come o perché funzioni, ma posso fare:

if (in_array('snippets', $wpdb->tables)) {
  // fai qualcosa se wp_snippets esiste
}
18 set 2018 19:05:36
Commenti

questo funziona solo per le tabelle core, come ho scoperto durante i test

Manchumahara Manchumahara
7 mar 2019 10:02:41

ha funzionato per me nel rilevare la tabella del plugin Code Snippets.

iSWORD iSWORD
7 mar 2019 12:32:59
0

Capisco che questa sia una domanda molto vecchia, ma forse qualcuno la troverà utile. Una piccola classe che gestisce le funzioni su un nuovo database, la versione della tabella e la crea se non esiste.

class ACCESS_TBDB {
 private $wpdb = null;
 private $accessTable = 'table_prefix'; // solo il nome del prefisso della tua tabella
 private $accessTableVer = '1.0.7'; // versione della tabella
 private $accessTableOptName = 'access_db_ver'; // nome dell'opzione per la versione del db

public function __construct()
{
    global $wpdb;
    //Non mi piace chiamare global $wpdb in ogni funzione della classe
    $this->wpdb = $wpdb;
    $tablename = $this->accessTable;
    //imposta il prefisso della nostra tabella
    $this->wpdb->access_table = $this->wpdb->prefix . $tablename;

    // controlla ogni volta se il db deve essere creato o meno
    $this->checkAccessDatabase();
}

private function createDBSQL(){
    // crea il sql per la tabella del db
    $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;

    //gestisce le versioni del DB
    $db_version = get_option( $this->accessTableOptName , '0.0.0');
    
    //Senza questo otterremo un errore su dbDelta e maybe_create_table
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    $dbCreateSql = $this->createDBSQL();
    
    // controlla se forse il DB ha bisogno di un aggiornamento
    if (version_compare($version, $db_version, '>')) {
        
        // se contiene vecchie versioni di sviluppo/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/
        // controlla semplicemente se il DB esiste nel caso sia stato cancellato per qualche motivo... :)
        $recreate = maybe_create_table( $this->wpdb->access_table, $dbCreateSql );
        if(!$recreate){
            update_option( $this->accessTableOptName , $version);
        }
    }
    
 }
    ... altre funzioni ...
}
7 mag 2021 15:46:02
0

Utilizza la funzione get_var della classe wpdb con gestione delle eccezioni:

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

Riferimento: Seleziona una Variabile

26 ott 2019 00:15:42