Comprobando si la tabla de base de datos existe

11

Leo el codex de wordpress y el wordpress profesional. Parece que ambos usan algo como

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

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

JM en el trabajo
fuente

Respuestas:

10

Si usa "SI NO EXISTE", el script dbdelta no actualizará su base de datos con los delta aparecidos después de la creación inicial de la base de datos.

(suponiendo que desea reutilizar el mismo script sql)

al menos ... eso es lo que pienso

Edelwater
fuente
5

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

Si desea utilizar una consulta diferente, intente esto

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

Devolverá 0 (si la tabla no existe) o 1 (si la tabla existe)

RolandoMySQLDBA
fuente
3

Prueba este:

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
}
Raximjon Komiljonov
fuente
1
Por favor, editar su respuesta , y añadir una explicación: ¿por qué podría que resolver el problema?
fuxia
1

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

if (in_array('snippets', $wpdb->tables)) {
  // do something if wp_snippets exists
}
iSWORD
fuente
2
esto solo funciona para las tablas principales como encuentro durante las pruebas
Manchumahara
funcionó para mí para detectar la tabla del complemento de fragmentos de código.
iSWORD
0

Utilice la get_varfunción de la wpdbclase con un manejo de excepción:

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: SELECCIONE una variable

Marcos Rezende
fuente