dbDelta ไม่ได้สร้างตาราง


15

ฉันผ่านหลายเธรดหน้าตัวแปลงสัญญาณและพยายามยุ่งกับสิ่งต่าง ๆ มากมาย แต่รหัสของฉันดูเหมือนจะไม่สร้างตาราง และฉันไม่สามารถรู้ได้ว่าฉันกำลังไปไหนผิด ฉันตรวจสอบ booking_db_version ในฐานข้อมูลจะได้รับการอัพเดตเมื่อฉันอัปเดตในไฟล์

นี่คือรหัส

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

คำตอบ:


18

จาก WordPress-codex เกี่ยวกับdbDelta :

ฟังก์ชัน dbDelta ตรวจสอบโครงสร้างตารางปัจจุบันเปรียบเทียบกับโครงสร้างตารางที่ต้องการและเพิ่มหรือปรับเปลี่ยนตารางตามความจำเป็นดังนั้นจึงเป็นประโยชน์อย่างมากสำหรับการอัปเดต (ดู wp-admin / upgrade-schema.php สำหรับตัวอย่างเพิ่มเติมของ วิธีใช้ dbDelta) โปรดทราบว่าฟังก์ชัน dbDelta ค่อนข้างจะพิถีพิถัน ตัวอย่างเช่น

  • คุณต้องใส่แต่ละฟิลด์ในบรรทัดของตัวเองในคำสั่ง SQL ของคุณ
  • คุณต้องมีช่องว่างสองช่องระหว่างคำว่า KEY KEY และคำจำกัดความของคีย์หลักของคุณ
  • คุณต้องใช้คีย์คำ KEY แทนคำพ้องความหมาย INDEX และคุณต้องมีคีย์อย่างน้อยหนึ่งรายการ
  • คุณต้องไม่ใช้เครื่องหมายอัญประกาศเดี่ยวหรือ Backticks รอบ ๆ ชื่อฟิลด์

ด้วยคำเตือนเหล่านี้นี่คือบรรทัดถัดไปในฟังก์ชั่นของเราซึ่งจริงๆแล้วจะสร้างหรืออัปเดตตาราง คุณจะต้องแทนที่โครงสร้างตารางของคุณเองในตัวแปร $ sql

ฉันเปลี่ยน sql ของคุณ: "create table $packagetable (

สำหรับสิ่งนี้: "CREATE TABLE " . $packagetable . " (

นี่คือสำเนาของรหัสที่ใช้งานได้:

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
มันทำงานได้ดี ฉันอ่าน dbDelta นั้นพิถีพิถัน แต่ไม่ทราบว่าการใช้ตัวพิมพ์ใหญ่CREATE TABLEจะทำให้ล้มเหลว
mehulved

2
แม้ว่า Wordpress จะไม่พูดสิ่งนี้ในหน้า codex ของพวกเขา แต่คุณไม่สามารถใช้จุลภาคต่อท้ายในบรรทัดสุดท้าย ตัวอย่าง: PRIMARY KEY (id),. dbDelta บอกว่าจริง ๆ แล้วมันสร้างตารางแม้ว่ามันจะไม่ได้เป็นอย่างนั้นก็ตาม
JoeMoe1984

1
สำหรับการอ้างอิงปัญหาเกี่ยวกับเครื่องหมายจุลภาคต่อท้ายPRIMARY KEY (id),เป็นปัญหา SQL ไม่ใช่ dbDelta หรือปัญหา WP ดังนั้นจึงไม่มีเอกสาร
Jeremy

โปรดทราบว่าเมื่อสร้างแบบสอบถามหลายรายการด้วยdbDelta()คุณสามารถส่ง SQL ของคุณเป็นอาร์เรย์ไปยังdbDeltaแทนที่จะเรียกเป็นdbDeltaรายบุคคลสำหรับทุกแบบสอบถาม
toni_lehtimaki

1

คุณสามารถลองใช้ฟังก์ชั่นนี้:

$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

นอกจากประเด็นสำคัญทั้งหมดเหล่านี้คุณควรเปิดใช้งานฮุกการเปิดใช้งาน

ในขณะที่คุณพัฒนาปลั๊กอินและเขียนรหัสที่ถูกต้องคุณยังต้องเปิดใช้งานปลั๊กอินของคุณอีกครั้งเพื่อเรียกใช้ hook ดังนั้นตารางของคุณจะถูกสร้างขึ้นเมื่อเปิดใช้งานปลั๊กอิน


-2

คำหลัก SQL เช่น CREATE TABLE และ UPDATE ต้องเป็นตัวพิมพ์ใหญ่ ดังนั้นเปลี่ยนบรรทัดสร้างตารางเป็น:

"CREATE TABLE " . $packagetable . "( 

และ

id mediumint(9) NOT NULL AUTO_INCREMENT,

ถึง:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

หรือสิ่งนี้:

name text NOT NULL, 

ถึง:

name TEXT NOT NULL, 

และอื่น ๆ


"คำหลัก SQL เช่น [ ... ] ต้องเป็นตัวพิมพ์ใหญ่" ขออภัย แต่ไม่เป็นความจริง
ไกเซอร์

สำหรับการใช้ฟังก์ชั่น dbDelta เราควรใช้ตัวพิมพ์ใหญ่ โปรดตรวจสอบหน้านี้: codex.wordpress.org/Creating_Tables_with_Plugins
shirin niki

ขออภัย แต่ฉันสามารถอ่านว่าไม่มีที่ไหนในแหล่งที่มา ฉันพลาดอะไรไปหรือเปล่า? บางทีคุณอาจต้องการเพิ่มตัวอย่าง mini-plugin ลงในคำตอบของคุณซึ่งแสดงว่ามันล้มเหลว (ซึ่งบางคนสามารถใช้และทดสอบ) ด้วยไวยากรณ์ที่ต่ำกว่า?
ไกเซอร์

ในลิงค์นี้: ลิงค์วรรคแรกของการสร้างหรืออัปเดตตารางพูดถึงปัญหานี้
shirin niki

นี้เป็นเพียงความจริงสำหรับCREATE TABLE, CREATE DATABASE, และINSERT INTO UPDATEทุกอย่างอื่นไม่ได้ใช้ในการเปรียบเทียบแบบตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ คำแนะนำของคุณไม่มีผล
fuxia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.