dbDelta no crea tablas

26 dic 2012, 11:41:10
Vistas: 17.1K
Votos: 17

Revisé muchos hilos, la página del codex y probé diferentes cosas pero mi código no parece estar creando las tablas. No logro identificar dónde está el error. Verifiqué booking_db_version en la base de datos y se actualiza cuando lo modifico en el archivo.

Aquí está el código

global $booking_db_version;
$booking_db_version = "1.0.0";

function booking_install() {
    global $wpdb;
    global $booking_db_version;
    global $tableprefix;
    $installed_version = get_option('booking_db_option');

    $tableprefix = $wpdb->prefix . 'booking_';

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

    if ( $installed_version !== $booking_db_version ) {
        /* Crear tabla para paquetes */
        $packagetable = $tableprefix . 'packages';
        $sql = "create table  $packagetable (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            description text NOT NULL, 
            city1 text NOT NULL, 
            city2 text NOT NULL,
            PRIMARY KEY  (id)
        );";
        dbDelta($sql);

        /* Crear tabla para hoteles */
        $hoteltable = $tableprefix . 'hotels';
        $sql = "create table $hoteltable (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            city text NOT NULL, 
            price decimal(10,2) NOT NULL,
            PRIMARY KEY  (id)
        );";
        dbDelta($sql);

        /* Crear tabla para addons */
        $addontable = $tableprefix . 'addons';
        $sql = "create table $addontable (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            addongroup text NOT NULL, 
            price decimal(10,2) NOT NULL,
            PRIMARY KEY  (id)
        );";
        dbDelta($sql);

        /* Crear tabla para grupos de addons */
        $addongrouptable = $tableprefix . 'addon_groups';
        $sql = "create table $addongrouptable (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            perhead text NOT NULL,
            PRIMARY KEY  (id)
        );";
        dbDelta($sql);

        update_option('booking_db_version', $booking_db_version);
    }
}
register_activation_hook(__FILE__, 'booking_install');
0
Todas las respuestas a la pregunta 5
5
20

Del WordPress-codex sobre dbDelta:

La función dbDelta examina la estructura actual de la tabla, la compara con la estructura deseada y agrega o modifica la tabla según sea necesario, por lo que puede ser muy útil para actualizaciones (consulte wp-admin/upgrade-schema.php para más ejemplos de cómo usar dbDelta). Sin embargo, ten en cuenta que la función dbDelta es bastante exigente. Por ejemplo:

  • Debes poner cada campo en su propia línea en tu sentencia SQL.
  • Debes tener dos espacios entre las palabras PRIMARY KEY y la definición de tu clave primaria.
  • Debes usar la palabra KEY en lugar de su sinónimo INDEX y debes incluir al menos una KEY.
  • No debes usar apóstrofes o backticks alrededor de los nombres de los campos.

Con esas advertencias, aquí están las siguientes líneas en nuestra función, que realmente crearán o actualizarán la tabla. Necesitarás sustituir tu propia estructura de tabla en la variable $sql.

Cambié tu sql: "create table $packagetable (

A esto: "CREATE TABLE " . $packagetable . " (

Aquí tienes una copia funcional de tu código:

global $booking_db_version;
$booking_db_version = "1.0.0";

function booking_install() {
    global $wpdb;
    global $booking_db_version;
    global $tableprefix;
    $installed_version = get_option('booking_db_option');

    $tableprefix = $wpdb->prefix . 'booking_';

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

    if ( $installed_version !== $booking_db_version ) {
        // Crear tabla para paquetes
        $packagetable = $tableprefix . 'packages';
        $sql = "CREATE TABLE " . $packagetable . " (
            id INT NOT NULL AUTO_INCREMENT, 
            name TEXT NOT NULL, 
            description TEXT NOT NULL, 
            city1 TEXT NOT NULL, 
            city2 TEXT NOT NULL,
            PRIMARY KEY  (id)
        ) ". $charset_collate .";";
        dbDelta($sql);

        // Crear tabla para hoteles
        $hoteltable = $tableprefix . 'hotels';
        $sql = "CREATE TABLE " . $hoteltable . " (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            city text NOT NULL, 
            price decimal(10,2) NOT NULL,
            PRIMARY KEY  (id)
        ) ". $charset_collate .";";
        dbDelta($sql);

        // Crear tabla para complementos
        $addontable = $tableprefix . 'addons';
        $sql = "CREATE TABLE " . $addontable . " (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            addongroup text NOT NULL, 
            price decimal(10,2) NOT NULL,
            PRIMARY KEY  (id)
        ) ". $charset_collate .";";
        dbDelta($sql);

        // Crear tabla para grupos de complementos
        $addongrouptable = $tableprefix . 'addon_groups';
        $sql = "CREATE TABLE " . $addongrouptable . " (
            id mediumint(9) NOT NULL AUTO_INCREMENT, 
            name text NOT NULL, 
            perhead text NOT NULL,
            PRIMARY KEY  (id)
        ) ". $charset_collate .";";
        dbDelta($sql);

        update_option('booking_db_version', $booking_db_version);
    }
}
register_activation_hook(__FILE__, 'booking_install');
26 dic 2012 14:35:02
Comentarios

Eso funcionó. Leí que dbDelta es delicado pero no me di cuenta de que no capitalizar CREATE TABLE haría que fallara.

mehulved mehulved
27 dic 2012 07:21:00

Aunque WordPress no lo menciona en su página del codex, no puedes tener una coma al final de la última línea. Ejemplo: PRIMARY KEY (id),. dbDelta incluso dice que crea la tabla aunque en realidad no lo hace

JoeMoe1984 JoeMoe1984
8 may 2015 21:57:12

Solo como referencia, el problema con la coma al final, PRIMARY KEY (id),, es un problema de SQL, no de dbDelta ni de WordPress. Por eso no hay documentación al respecto.

Jeremy Jeremy
16 oct 2015 19:19:53

Ten en cuenta que al crear múltiples consultas con dbDelta(), puedes pasar tus sentencias SQL como un array a dbDelta en lugar de llamar a dbDelta individualmente para cada consulta.

toni_lehtimaki toni_lehtimaki
11 oct 2017 14:37:27

Otro punto para agregar a la lista: No deberías tener una línea vacía en tu consulta.

Koorosh Koorosh
28 nov 2024 00:35:56
0

Puedes probar esta función:

$table_name = "ratings";

$table_columns = "id INT(6) UNSIGNED AUTO_INCREMENT,
                    rate tinyint(1) NOT NULL,
                    ticket_id bigint(20) NOT NULL,
                    response_id bigint(20) NOT NULL,
                    created_at TIMESTAMP";

$table_keys = "PRIMARY KEY (id),
                    KEY ratings_rate (rate),
                    UNIQUE KEY ratings_response_id (response_id)";

create_table($table_name, $table_columns, $table_keys);
31 mar 2016 15:58:03
0

Usar 'CREATE TABLE' en lugar de 'create table' resolvió el problema para mí.

3 jul 2017 10:25:03
0

Además de todos esos puntos importantes, debes activar el hook de activación.

Aunque hayas desarrollado tu plugin y escrito el código correctamente, aún necesitas reactivar tu plugin para activar el hook, de modo que tu tabla se creará cuando el plugin esté activado.

25 feb 2019 10:34:55
6
-2

Las palabras clave de SQL, como CREATE TABLE y UPDATE, deben ir en mayúsculas. así que cambia la línea de create table a:

"CREATE TABLE " . $packagetable . "( 

y

id mediumint(9) NOT NULL AUTO_INCREMENT,

a:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

o esto:

name text NOT NULL, 

a:

name TEXT NOT NULL, 

y así sucesivamente

8 ene 2017 15:22:39
Comentarios

"Las palabras clave de SQL, como [...], deben estar en mayúsculas". Lo siento, pero no, esto no es cierto.

kaiser kaiser
8 ene 2017 15:52:46

para usar la función dbDelta, debemos usar mayúsculas. Por favor, revisa esta página: https://codex.wordpress.org/Creating_Tables_with_Plugins

shirin niki shirin niki
8 ene 2017 15:56:25

Lo siento, pero no puedo leer eso en ninguna parte del código fuente. ¿Me he perdido algo? ¿Quizás quieras añadir un mini-plugin de ejemplo a tu respuesta que muestre que falla (y que alguien pueda tomar y probar) con la sintaxis en minúsculas?

kaiser kaiser
8 ene 2017 15:59:44

en este enlace: enlace, el primer párrafo de Crear o Actualizar la Tabla menciona este problema.

shirin niki shirin niki
8 ene 2017 16:13:35

Esto solo es cierto para CREATE TABLE, CREATE DATABASE, INSERT INTO y UPDATE. Todo lo demás o no se usa en una comparación que distinga mayúsculas y minúsculas o se convierte a minúsculas. Tus sugerencias no tienen efecto.

fuxia fuxia
8 ene 2017 16:52:37

pero funciona para mí, al principio usé mayúsculas solo para create table, y mi plugin no devolvió ningún error, pero la tabla no se creó, y la segunda vez que cambié las otras partes a mayúsculas funcionó bien.

shirin niki shirin niki
9 ene 2017 08:42:25
Mostrar los 1 comentarios restantes