Verificare dacă există o tabelă în baza de date

10 mar. 2011, 07:45:56
Vizualizări: 38.7K
Voturi: 20

Am citit documentația WordPress și WordPress Professional. Se pare că ambele folosesc ceva de genul

if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
// Verifică dacă tabela există în baza de date

pentru a determina dacă tabela există. Există vreun motiv pentru care nu se folosește CREATE TABLE IF NOT EXISTS ( ... )? Aceasta va verifica și va crea tabela într-o singură interogare, nu ar fi mai bine? Sau îmi scapă ceva?

0
Toate răspunsurile la întrebare 7
0
13

Dacă folosești "IF NOT EXISTS", atunci scriptul dbdelta nu va actualiza baza ta de date cu modificările (delta) apărute după crearea inițială a bazei de date.

(presupunând că vrei să reutilizezi același script sql)

Cel puțin... asta cred eu

12 mar. 2011 02:56:05
1

Încearcă această variantă:

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
}
12 apr. 2019 18:10:40
Comentarii

Te rog să [editezi] răspunsul tău și să adaugi o explicație: de ce ar putea rezolva această soluție problema?

fuxia fuxia
12 apr. 2019 18:47:13
0

DECLARAȚIE DE RESPONSABILITATE : Nu sunt un expert WordPress, doar un MySQL DBA

Dacă doriți să utilizați o altă interogare, încercați aceasta

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

Va returna fie 0 (dacă tabela nu există) sau 1 (dacă tabela există)

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 oferă acum funcția maybe_create_table - vezi https://developer.wordpress.org/reference/functions/maybe_create_table/

Înainte de a apela această funcție, trebuie să incluzi manual fișierul upgrade.php, altfel vei primi o eroare fatală precum:

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

3 dec. 2020 07:47:17
Comentarii

Bine ați venit la Dezvoltarea WordPress! Deși acest răspuns ar putea teoretic să răspundă la întrebare, ar fi preferabil să includeți părțile esențiale ale răspunsului aici și să furnizați link-ul pentru referință.

Glorfindel Glorfindel
3 dec. 2020 09:01:26
2

Nu sunt sigur cum sau de ce funcționează, dar pot face:

if (in_array('snippets', $wpdb->tables)) {
  // fă ceva dacă wp_snippets există
}
18 sept. 2018 19:05:36
Comentarii

acest lucru funcționează doar pentru tabelele de bază, conform testelor mele

Manchumahara Manchumahara
7 mar. 2019 10:02:41

a funcționat pentru mine în detectarea tabelului din plugin-ul Code Snippets.

iSWORD iSWORD
7 mar. 2019 12:32:59
0

Înțeleg că aceasta este o întrebare foarte veche, dar poate cineva o va găsi utilă. O mică clasă care gestionează funcționalitățile pe o nouă bază de date, versiunea tabelei și o creează dacă nu există.

class ACCESS_TBDB {
 private $wpdb = null;
 private $accessTable = 'table_prefix'; // doar numele prefixului tabelei tale
 private $accessTableVer = '1.0.7'; // versiunea tabelei
 private $accessTableOptName = 'access_db_ver'; // numele opțiunii pentru versiunea bazei de date

public function __construct()
{
    global $wpdb;
    //Nu-mi place să apelez global $wpdb în fiecare funcție din clasă
    $this->wpdb = $wpdb;
    $tablename = $this->accessTable;
    //setează prefixul tabelei noastre
    $this->wpdb->access_table = $this->wpdb->prefix . $tablename;

    // verifică de fiecare dată dacă baza de date trebuie creată sau nu
    $this->checkAccessDatabase();
}

private function createDBSQL(){
    // creează SQL-ul pentru tabela din baza de date
    $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;

    //gestionează versiunile bazei de date
    $db_version = get_option( $this->accessTableOptName , '0.0.0');
    
    //Fără aceasta vom întâmpina eroare la dbDelta și maybe_create_table
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    $dbCreateSql = $this->createDBSQL();
    
    // verifică dacă baza de date are nevoie de actualizare
    if (version_compare($version, $db_version, '>')) {
        
        // dacă conține versiuni vechi/dezvoltare
        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/
        // verifică doar dacă baza de date există în caz că a fost ștearsă din diverse motive ... :)
        $recreate = maybe_create_table( $this->wpdb->access_table, $dbCreateSql );
        if(!$recreate){
            update_option( $this->accessTableOptName , $version);
        }
    }
    
 }
    ... alte funcții ...
}
7 mai 2021 15:46:02
0

Folosește funcția get_var din clasa wpdb cu gestionarea excepțiilor:

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

Referință: SELECT a Variable

26 oct. 2019 00:15:42