dbDelta nu creează tabele

26 dec. 2012, 11:41:10
Vizualizări: 17.1K
Voturi: 17

Am parcurs multe discuții, pagina codex și am încercat să modific diverse lucruri, dar codul meu nu pare să creeze tabelele. Nu reușesc să înțeleg unde greșesc. Am verificat booking_db_version în baza de date, se actualizează când o modific în fișier.

Iată codul

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 ) {
        /* Creează tabelul pentru pachete */
        $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);

        /* Creează tabelul pentru hoteluri */
        $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);

        /* Creează tabelul pentru addon-uri */
        $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);

        /* Creează tabelul pentru grupurile de addon-uri */
        $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
Toate răspunsurile la întrebare 5
5
20

Din WordPress-codex despre dbDelta:

Funcția dbDelta analizează structura curentă a tabelului, o compară cu structura dorită și adaugă sau modifică tabelul după caz, fiind foarte utilă pentru actualizări (vezi wp-admin/upgrade-schema.php pentru mai multe exemple de utilizare a dbDelta). Totuși, funcția dbDelta este destul de pretențioasă. De exemplu:

  • Trebuie să pui fiecare câmp pe linia sa în instrucțiunea SQL.
  • Trebuie să ai două spații între cuvintele PRIMARY KEY și definiția cheii primare.
  • Trebuie să folosești cuvântul cheie KEY și nu sinonimul INDEX și trebuie să incluzi cel puțin un KEY.
  • Nu trebuie să folosești ghilimele simple sau backtick-uri în jurul numelor de câmpuri.

Ținând cont de aceste precauții, iată următoarele linii din funcția noastră, care vor crea sau actualiza tabelul. Va trebui să înlocuiești structura tabelului tău în variabila $sql.

Am schimbat sql-ul tău: "create table $packagetable (

În asta: "CREATE TABLE " . $packagetable . " (

Iată o copie funcțională a codului tău:

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 ) {
        // Crează tabelul pentru pachete 
        $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);

        // Crează tabelul pentru hoteluri 
        $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);

        // Crează tabelul pentru suplimente 
        $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);

        // Crează tabelul pentru grupuri de suplimente 
        $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 dec. 2012 14:35:02
Comentarii

A funcționat. Am citit că dbDelta este capricios, dar nu mi-am dat seama că scrierea necapitalizată a CREATE TABLE va cauza eșec.

mehulved mehulved
27 dec. 2012 07:21:00

Deși WordPress nu menționează asta pe pagina lor din codex, nu poți avea o virgulă la finalul ultimei linii. Exemplu: PRIMARY KEY (id),. dbDelta de fapt afirmă că creează tabelul chiar dacă nu o face

JoeMoe1984 JoeMoe1984
8 mai 2015 21:57:12

Doar pentru referință, problema cu virgula la sfârșit, PRIMARY KEY (id), este o problemă SQL, nu dbDelta și nici o problemă WP. De aceea nu există documentație.

Jeremy Jeremy
16 oct. 2015 19:19:53

Rețineți că atunci când creați mai multe interogări cu dbDelta(), puteți transmite SQL-urile ca un array către dbDelta în loc să apelați dbDelta individual pentru fiecare interogare.

toni_lehtimaki toni_lehtimaki
11 oct. 2017 14:37:27

Un alt punct de adăugat în listă: Nu ar trebui să aveți o linie goală în interogarea dumneavoastră.

Koorosh Koorosh
28 nov. 2024 00:35:56
0

Puteți încerca această funcție:

$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

Folosirea 'CREATE TABLE' în loc de 'create table' a rezolvat problema pentru mine.

3 iul. 2017 10:25:03
0

Pe lângă toate aceste puncte importante, trebuie să declanșezi cârligul (hook) de activare.

Chiar dacă ai dezvoltat plugin-ul tău și ai scris cod corect, tot trebuie să reactivezi plugin-ul pentru a declanșa cârligul, astfel încât tabela ta să fie creată atunci când plugin-ul este activat.

25 feb. 2019 10:34:55
6
-2

Cuvintele cheie SQL, cum ar fi CREATE TABLE și UPDATE, trebuie să fie scrise cu majuscule. deci schimbă linia de creare a tabelului în:

"CREATE TABLE " . $packagetable . "( 

și

id mediumint(9) NOT NULL AUTO_INCREMENT,

în:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

sau acest lucru:

name text NOT NULL, 

în:

name TEXT NOT NULL, 

și așa mai departe

8 ian. 2017 15:22:39
Comentarii

"Cuvintele cheie SQL, cum ar fi […], trebuie să fie scrise cu majuscule". Îmi pare rău, dar nu, acest lucru nu este adevărat.

kaiser kaiser
8 ian. 2017 15:52:46

pentru utilizarea funcției dbDelta, ar trebui să folosim majuscule. te rugăm să verifici această pagină: https://codex.wordpress.org/Creating_Tables_with_Plugins

shirin niki shirin niki
8 ian. 2017 15:56:25

Îmi pare rău, dar nu pot găsi această informație nicăieri în sursă. Am omis ceva? Poate doriți să adăugați în răspunsul dumneavoastră un exemplu de mini-plugin care arată că nu funcționează (și pe care cineva îl poate testa) cu sintaxa scrisă cu litere mici?

kaiser kaiser
8 ian. 2017 15:59:44

în acest link: link, primul paragraf din secțiunea Creating or Updating the Table menționează această problemă.

shirin niki shirin niki
8 ian. 2017 16:13:35

Acest lucru este valabil doar pentru CREATE TABLE, CREATE DATABASE, INSERT INTO și UPDATE. Orice altceva fie nu este utilizat într-o comparație case-sensitive, fie este convertit la lowercase. Sugestiile tale nu au niciun efect.

fuxia fuxia
8 ian. 2017 16:52:37

dar funcționează pentru mine, la început am folosit uppercase doar pentru create table, iar pluginul meu nu a returnat nicio eroare, dar tabela nu a fost creată, iar a doua oară când am schimbat și celelalte părți în uppercase, a funcționat corespunzător.

shirin niki shirin niki
9 ian. 2017 08:42:25
Arată celelalte 1 comentarii