dbDelta tidak membuat tabel

15

Saya telah melalui banyak utas, halaman codex dan mencoba mengacaukan banyak hal tetapi kode saya sepertinya tidak membuat tabel. Dan saya tidak bisa mencari tahu di mana saya salah. Saya memeriksa booking_db_version dalam database, ini akan diperbarui ketika saya memperbaruinya dalam file.

Ini kodenya

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
sumber

Jawaban:

18

Dari WordPress-codex tentang dbDelta :

Fungsi dbDelta memeriksa struktur tabel saat ini, membandingkannya dengan struktur tabel yang diinginkan, dan menambah atau memodifikasi tabel sebagaimana diperlukan, sehingga sangat berguna untuk pembaruan (lihat wp-admin / upgrade-schema.php untuk contoh lebih lanjut tentang cara menggunakan dbDelta). Perhatikan bahwa fungsi dbDelta agak pilih-pilih. Contohnya:

  • Anda harus meletakkan setiap bidang pada barisnya sendiri dalam pernyataan SQL Anda.
  • Anda harus memiliki dua spasi antara kata-kata KUNCI UTAMA dan definisi kunci utama Anda.
  • Anda harus menggunakan kata kunci KEY daripada sinonim INDEX dan Anda harus memasukkan setidaknya satu KUNCI.
  • Anda tidak boleh menggunakan apostrof atau tanda kutip belakang di sekitar nama bidang.

Dengan peringatan itu, berikut adalah baris berikutnya dalam fungsi kami, yang sebenarnya akan membuat atau memperbarui tabel. Anda harus mengganti struktur tabel Anda sendiri dalam variabel $ sql.

Saya mengubah sql Anda: "create table $packagetable (

Untuk ini: "CREATE TABLE " . $packagetable . " (

Berikut ini adalah salinan kode Anda yang berfungsi:

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
sumber
1
Itu berhasil. Saya membaca bahwa dbDelta rewel tetapi tidak menyadari bahwa tidak memanfaatkan CREATE TABLEakan menyebabkan kegagalan.
mehulved
2
Meskipun Wordpress tidak mengatakan ini pada halaman codex mereka, Anda tidak dapat memiliki tanda koma di baris terakhir. Contoh: PRIMARY KEY (id),. dbDelta sebenarnya mengatakan bahwa ia menciptakan tabel meskipun tidak
JoeMoe1984
1
Hanya untuk referensi, masalah dengan tanda koma, PRIMARY KEY (id),adalah masalah SQL, bukan dbDelta atau masalah WP. Karenanya tidak ada dokumentasi.
Jeremy
Perhatikan bahwa saat membuat beberapa kueri dengan dbDelta()Anda, Anda dapat meneruskan SQL sebagai array dbDeltaalih-alih memanggil satu dbDeltaper satu untuk setiap kueri.
toni_lehtimaki
1

Anda dapat mencoba fungsi ini :

$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
sumber
0

Menggunakan 'CREATE TABLE' alih-alih 'create table' memecahkan masalah bagi saya.

Kallol
sumber
0

Selain semua poin penting itu, Anda harus memicu kait aktivasi.

Saat Anda mengembangkan plugin dan menulis kode yang benar, Anda masih perlu mengaktifkan kembali plugin Anda untuk memicu hook, sehingga tabel Anda akan dibuat ketika plugin diaktifkan.

Adi Prasetyo
sumber
-2

Kata kunci SQL, seperti CREATE TABLE dan UPDATE, harus huruf besar. jadi ganti baris buat tabel ke:

"CREATE TABLE " . $packagetable . "( 

dan

id mediumint(9) NOT NULL AUTO_INCREMENT,

untuk:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

atau ini:

name text NOT NULL, 

untuk:

name TEXT NOT NULL, 

dan seterusnya

shirin niki
sumber
"Kata kunci SQL, seperti [...], harus dalam huruf besar" . Maaf, tapi tidak, ini tidak benar.
kaiser
untuk menggunakan fungsi dbDelta, kita harus menggunakan huruf besar. silakan periksa halaman ini: codex.wordpress.org/Creating_Tables_with_Plugins
shirin niki
Maaf, tapi saya tidak bisa membacanya di sumbernya . Apakah saya melewatkan sesuatu? Mungkin Anda ingin menambahkan contoh mini-plugin ke jawaban Anda yang menunjukkan bahwa itu gagal (yang dapat diambil dan diuji seseorang) dengan sintaks yang lebih rendah?
kaiser
di tautan ini: tautan , paragraf pertama dari Membuat atau Memutakhirkan Tabel menyebutkan masalah ini.
shirin niki
Ini hanya berlaku untuk CREATE TABLE, CREATE DATABASE, INSERT INTO, dan UPDATE. Segala sesuatu yang lain tidak digunakan dalam perbandingan case-sensitive atau dikonversi ke huruf kecil . Saran Anda tidak berpengaruh.
fuxia