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');
mehulved
fuente

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');
Pontus Abrahamsson
fuente
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);
mirza
fuente
0

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

Kallol
fuente
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.

Adi Prasetyo
fuente
-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í

shirin niki
fuente
"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