dbDelta no crea tablas


15

Revisé muchos subprocesos, página de codex e intenté jugar con muchas cosas, pero mi código no parece estar creando las tablas. Y no soy capaz de averiguar dónde me estoy equivocando. Verifiqué booking_db_version en la base de datos, se actualiza cuando lo actualizo 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 ) {
        /* Create table for packages */
        $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);

        /* Create table for hotels */
        $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);

        /* Create table for 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);

        /* Create table for addon groups */
        $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');

Respuestas:


18

Desde WordPress-codex sobre dbDelta :

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

  • Debe colocar cada campo en su propia línea en su declaración SQL.
  • Debe tener dos espacios entre las palabras PRIMARY KEY y la definición de su clave principal.
  • Debe usar la palabra clave CLAVE en lugar de su sinónimo ÍNDICE y debe incluir al menos una CLAVE.
  • No debe utilizar ningún apóstrofe o retroceso alrededor de los nombres de campo.

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

Cambié tu sql: "create table $packagetable (

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

Aquí hay una copia de trabajo de su 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 ) {
        // Create table for packages 
        $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);

        // Create table for hotels 
        $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);

        // Create table for 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)
        ) ". $charset_collate .";";
        dbDelta($sql);

        // Create table for addon groups 
        $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');

1
Eso funcionó. Leí que dbDelta es quisquilloso, pero no me di cuenta de que no capitalizarlo CREATE TABLEhará que falle.
— mehulved

2
Aunque Wordpress no dice esto en su página de códice, no puede tener una coma final en la última línea. Ejemplo: PRIMARY KEY (id),. dbDelta en realidad dice que crea la tabla a pesar de que no lo hace
— JoeMoe1984

1
Solo como referencia, el problema con la coma final PRIMARY KEY (id),es un problema de SQL, no dbDelta ni un problema de WP. Por lo tanto, no hay documentación.
— Jeremy

Tenga en cuenta que al crear múltiples consultas con dbDelta()usted, puede pasar sus SQL como una matriz en dbDeltalugar de llamar dbDeltaindividualmente para cada consulta.
— toni_lehtimaki

1

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

0

El uso de 'CREAR TABLA' en lugar de 'crear tabla' me resolvió el problema.


0

Además de todos esos puntos importantes, debe activar el gancho de activación.

Mientras desarrollaste tu plugin y escribiste el código correcto, aún necesitas reactivar tu plugin para activar el enlace, por lo que tu tabla se creará cuando se active el plugin.


-2

Las palabras clave de SQL, como CREATE TABLE y UPDATE, deben estar en mayúsculas. así que cambie la línea de crear tabla 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í


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

para usar la función dbDelta, debemos usar mayúsculas. consulte esta página: codex.wordpress.org/Creating_Tables_with_Plugins
— shirin niki

Lo siento, pero no puedo leer eso en ninguna parte de la fuente . ¿Me he perdido algo? ¿Tal vez desee agregar un mini-complemento de ejemplo a su respuesta que muestre que falla (que alguien puede tomar y probar) con una sintaxis en minúsculas?
— Kaiser

en este enlace: enlace , el primer párrafo de Creación o actualización de la tabla menciona este problema.
— shirin niki

Esto solo es cierto para CREATE TABLE,CREATE DATABASE , INSERT INTO, y UPDATE. Todo lo demás no se usa en una comparación entre mayúsculas y minúsculas o se convierte a minúsculas . Tus sugerencias no tienen efecto.
— fuxia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.