Verifica dell'esistenza della tabella del database


11

Ho letto il codice wordpress e wordpress professionale. Sembra che entrambi usino qualcosa di simile

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

per determinare se la tabella esiste. C'è qualche motivo per cui CREATE TABLE IF NOT EXISTS ( ... )non viene utilizzato? Controllerà e creerà la tabella in 1 query, non sarà meglio? Oppure mi sfugge qualcosa?

Risposte:


10

Se si utilizza "SE NON ESISTE", lo script dbdelta non aggiornerà il database con i delta visualizzati dopo la creazione iniziale del database.

(supponendo che tu voglia riutilizzare lo stesso script sql)

almeno ... questo è quello che penso


5

NOTA BENE: non sono un guru di WordPress, solo un DBA MySQL

Se si desidera utilizzare una query diversa, provare questo

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)


3

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 ) {
    // go go
}

1
Si prega di modificare la risposta , e aggiungere una spiegazione: perché potrebbe che risolvere il problema?
fuxia

1

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

if (in_array('snippets', $wpdb->tables)) {
  // do something if wp_snippets exists
}

2
questo funziona solo per le tabelle di base che trovo durante i test
Manchumahara

ha funzionato per me per rilevare la tabella dei plugin di Code Snippets.
iSWORD

0

Utilizzare la get_varfunzione dalla wpdbclasse con una 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.