Comprobando si existe una Tabla en la Base de Datos

10 mar 2011, 07:45:56
Vistas: 38.7K
Votos: 20

He leído el codex de WordPress y WordPress profesional. Parece que ambos utilizan algo como

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

para determinar si la tabla existe. ¿Hay alguna razón por la que no se usa CREATE TABLE IF NOT EXISTS ( ... )? Esto verificará y creará la tabla en 1 consulta, ¿no sería mejor? ¿O me estoy perdiendo algo?

0
Todas las respuestas a la pregunta 7
0
13

Si usas "IF NOT EXISTS" entonces el script dbdelta no actualizará tu base de datos con los cambios (delta) que aparezcan después de la creación inicial de la base de datos.

(asumiendo que quieres reutilizar el mismo script SQL)

al menos... eso es lo que pienso

12 mar 2011 02:56:05
1

Prueba este:

global $wpdb;
$table_name = $wpdb->base_prefix.'custom_prices'; // Prefijo de la tabla de precios personalizados
$query = $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $table_name ) );

if ( ! $wpdb->get_var( $query ) == $table_name ) {
    // continuar
}
12 abr 2019 18:10:40
Comentarios

Por favor, [edita] tu respuesta y agrega una explicación: ¿por qué eso podría resolver el problema?

fuxia fuxia
12 abr 2019 18:47:13
0

DESCARGO DE RESPONSABILIDAD: No soy un gurú de WordPress, solo un DBA de MySQL

Si deseas utilizar una consulta diferente, prueba esta:

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

Esto devolverá 0 (si la tabla no existe) o 1 (si la tabla existe)

22 abr 2011 09:46:59
1

TL;DR (Demasiado Largo; No Leído)

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

WordPress ahora provee la función maybe_create_table - ver https://developer.wordpress.org/reference/functions/maybe_create_table/

Antes de llamar a esta función debes incluir manualmente el archivo upgrade.php, de lo contrario obtendrás un error fatal como el siguiente:

PHP Error fatal: Error no capturado: Llamada a función indefinida maybe_create_table()

3 dic 2020 07:47:17
Comentarios

¡Bienvenido al Desarrollo de WordPress! Si bien esto podría responder teóricamente a la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia.

Glorfindel Glorfindel
3 dic 2020 09:01:26
2

No estoy seguro de cómo o por qué funciona esto, pero puedo hacer:

if (in_array('snippets', $wpdb->tables)) {
  // hacer algo si wp_snippets existe
}
18 sept 2018 19:05:36
Comentarios

esto solo funciona para tablas principales según lo que encontré durante las pruebas

Manchumahara Manchumahara
7 mar 2019 10:02:41

funcionó para mí para detectar la tabla del plugin Code Snippets.

iSWORD iSWORD
7 mar 2019 12:32:59
0

Entiendo que esta es una pregunta bastante antigua, pero tal vez alguien la encuentre útil. Pequeña clase que maneja funciones en una nueva base de datos, versión de la tabla y crea si no existe.

class ACCESS_TBDB {
 private $wpdb = null;
 private $accessTable = 'table_prefix'; // solo el nombre del prefijo de tu tabla
 private $accessTableVer = '1.0.7'; // versión de la tabla
 private $accessTableOptName = 'access_db_ver'; // nombre para la opción de versión de la base de datos

public function __construct()
{
    global $wpdb;
    //No me gusta llamar a global $wpdb en cada función de la clase
    $this->wpdb = $wpdb;
    $tablename = $this->accessTable;
    //establecer nuestro prefijo de tabla
    $this->wpdb->access_table = $this->wpdb->prefix . $tablename;

    // verificar cada vez si la base de datos necesita ser creada o no
    $this->checkAccessDatabase();
}

private function createDBSQL(){
    // crear SQL para la tabla
    $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;

    //manejar versiones de la base de datos
    $db_version = get_option( $this->accessTableOptName , '0.0.0');
    
    //Sin esto enfrentaremos un error en dbDelta y maybe_create_table
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    $dbCreateSql = $this->createDBSQL();
    
    // verificar si tal vez la base de datos necesita actualización
    if (version_compare($version, $db_version, '>')) {
        
        // si contiene versiones antiguas/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/
        // solo verificar si la base de datos existe en caso de que haya sido eliminada por alguna razón... :)
        $recreate = maybe_create_table( $this->wpdb->access_table, $dbCreateSql );
        if(!$recreate){
            update_option( $this->accessTableOptName , $version);
        }
    }
    
 }
    ... otras funciones ...
}
7 may 2021 15:46:02
0

Utiliza la función get_var de la clase wpdb con manejo de excepciones:

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

Referencia: Seleccionar una Variable

26 oct 2019 00:15:42