dbDelta tablo oluşturmuyor


15

Ben iş parçacıkları, kodeks sayfası bir sürü geçti ve bir çok şey ile uğraşmayı denedim ama benim kod tabloları oluşturmak gibi görünmüyor. Ve nerede yanlış yaptığımı anlayamıyorum. Veritabanındaki booking_db_version'u kontrol ettim, dosyada güncellediğimde güncelleniyor.

İşte kod

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

Yanıtlar:


18

DbDelta hakkında WordPress- codex'tan :

DbDelta işlevi geçerli tablo yapısını inceler, istenen tablo yapısıyla karşılaştırır ve tabloyu gerektiği gibi ekler veya değiştirir, böylece güncellemeler için çok kullanışlı olabilir (daha fazla örnek için bkz. Wp-admin / upgrade-schema.php dbDelta nasıl kullanılır). Bununla birlikte, dbDelta işlevinin oldukça seçici olduğunu unutmayın. Örneğin:

  • Her alanı SQL ifadenizde kendi satırına koymanız gerekir.
  • PRIMARY KEY kelimeleri ile birincil anahtarınızın tanımı arasında iki boşluk olmalıdır.
  • INDEX eş anlamlısı yerine KEY anahtar sözcüğünü kullanmalı ve en az bir KEY eklemelisiniz.
  • Alan adlarının çevresinde kesme işareti veya ters tırnak kullanmamalısınız.

Bu uyarılarla, fonksiyonumuzda aslında tabloyu yaratacak veya güncelleyecek olan sonraki satırlar. $ Sql ​​değişkeninde kendi tablo yapınızı değiştirmelisiniz.

SQL'inizi değiştirdim: "create table $packagetable (

Buna: "CREATE TABLE " . $packagetable . " (

Kodunuzun çalışan bir kopyası:

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
Bu işe yaradı. Ben dbDelta titiz olduğunu okudum ama büyük harf yapmamak CREATE TABLEbaşarısız olmasına neden olacağını fark etmedi .
12'de

2
Wordpress kodeks sayfalarında bunu söylemese de, son satırda sondaki virgül olamaz. Örnek: PRIMARY KEY (id),. dbDelta aslında olmasa da tablo oluşturduğunu söylüyor
JoeMoe1984

1
Sadece referans olarak, sondaki virgülle PRIMARY KEY (id),ilgili sorun, dbDelta veya WP sorunu değil, bir SQL sorunudur. Dolayısıyla dokümantasyon yok.
Jeremy

dbDelta()Sizinle birden çok sorgu oluştururken , her sorguyu tek tek dbDeltaçağırmak yerine SQL'lerinizi bir dizi olarak aktarabileceğinizi unutmayın dbDelta.
toni_lehtimaki

1

Bu işlevi deneyebilirsiniz :

$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

'Tablo oluştur' yerine 'CREATE TABLE'ı kullanmak benim için sorunu çözdü.


0

Tüm bu önemli noktaların yanı sıra aktivasyon kancasını da tetiklemelisiniz.

Eklentinizi geliştirirken ve doğru kodu yazarken , kancayı tetiklemek için eklentinizi yeniden etkinleştirmeniz gerekir , böylece eklenti etkinleştirildiğinde tablonuz oluşturulur.


-2

CREATE TABLE ve UPDATE gibi SQL anahtar kelimeleri büyük harf olmalıdır. bu nedenle tablo oluşturma satırını şu şekilde değiştirin:

"CREATE TABLE " . $packagetable . "( 

ve

id mediumint(9) NOT NULL AUTO_INCREMENT,

için:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

veya bu:

name text NOT NULL, 

için:

name TEXT NOT NULL, 

ve bunun gibi


Msgstr "[…] gibi SQL anahtar sözcükleri büyük harf olmalıdır" . Üzgünüm, ama hayır, bu doğru değil.
Kaiser

dbDelta işlevini kullanmak için büyük harf kullanmalıyız. lütfen bu sayfayı kontrol edin: codex.wordpress.org/Creating_Tables_with_Plugins
shirin niki

Üzgünüm, ama kaynağın hiçbir yerinde okuyamıyorum . Bir şey mi kaçırdım? Belki cevabınıza daha düşük kasalı sözdizimi ile başarısız olduğunu (birisinin alabilir ve test edebileceğini) gösteren bir mini eklenti eklemek istersiniz?
Kaiser

bu bağlantıda: link , Tablo Oluşturma veya Güncellemenin ilk paragrafı bu sorundan bahseder.
shirin niki

Bu sadece doğrudur CREATE TABLE, CREATE DATABASE, INSERT INTO, ve UPDATE. Diğer her şey büyük / küçük harfe duyarlı bir karşılaştırmada kullanılmaz veya küçük harfe dönüştürülür . Önerilerinizin hiçbir etkisi yoktur.
fuxia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.