dbDelta không tạo bảng


15

Tôi đã xem qua rất nhiều chủ đề, trang codex và đã thử làm rối tung rất nhiều thứ nhưng mã của tôi dường như không tạo ra các bảng. Và tôi không thể tìm ra nơi tôi sẽ sai. Tôi đã kiểm tra booking_db_version trong cơ sở dữ liệu, nó được cập nhật khi tôi cập nhật nó trong tệp.

Đây là mã

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

Câu trả lời:


18

Từ WordPress-codex về dbDelta :

Hàm dbDelta kiểm tra cấu trúc bảng hiện tại, so sánh nó với cấu trúc bảng mong muốn và thêm hoặc sửa đổi bảng khi cần thiết, vì vậy nó có thể rất tiện cho việc cập nhật (xem wp-admin / nâng cấp-lược đồ.php để biết thêm ví dụ về cách sử dụng dbDelta). Lưu ý rằng hàm dbDelta khá kén chọn, tuy nhiên. Ví dụ:

  • Bạn phải đặt từng trường trên dòng riêng của nó trong câu lệnh SQL của bạn.
  • Bạn phải có hai khoảng trắng giữa các từ PRIMARY KEY và định nghĩa của khóa chính của bạn.
  • Bạn phải sử dụng từ khóa KEY thay vì từ đồng nghĩa INDEX và bạn phải bao gồm ít nhất một KEY.
  • Bạn không được sử dụng bất kỳ dấu nháy đơn hoặc backticks nào xung quanh tên trường.

Với những cảnh báo này, đây là các dòng tiếp theo trong chức năng của chúng tôi, sẽ thực sự tạo hoặc cập nhật bảng. Bạn sẽ cần thay thế cấu trúc bảng của riêng bạn trong biến $ sql.

Tôi đã thay đổi sql của bạn: "create table $packagetable (

Về điều này: "CREATE TABLE " . $packagetable . " (

Đây là một bản sao làm việc của mã của bạn:

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
Điều đó đã làm việc. Tôi đọc được rằng dbDelta rất khó nhưng không nhận ra rằng việc không viết hoa CREATE TABLEsẽ khiến nó thất bại.
mehulved

2
Mặc dù Wordpress không nói điều này trên trang codex của họ, nhưng bạn không thể có dấu phẩy ở dòng cuối cùng. Ví dụ : PRIMARY KEY (id),. dbDelta thực sự nói rằng nó tạo ra bảng ngay cả khi nó không
JoeMoe1984

1
Chỉ để tham khảo, vấn đề với dấu phẩy dấu, PRIMARY KEY (id),là một vấn đề SQL, không phải là dbDelta cũng không phải là vấn đề WP. Do đó không có tài liệu.
Jeremy

Lưu ý rằng khi tạo nhiều truy vấn với dbDelta()bạn, bạn có thể chuyển SQL của mình thành một mảng dbDeltathay vì gọi dbDeltariêng cho mỗi truy vấn.
toni_lehtimaki

1

Bạn có thể thử chức năng này :

$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

Sử dụng 'CREATE TABLE' thay vì 'tạo bảng' đã giải quyết vấn đề cho tôi.


0

Bên cạnh tất cả những điểm quan trọng, bạn nên kích hoạt móc kích hoạt.

Trong khi bạn phát triển plugin và viết mã chính xác, bạn vẫn cần kích hoạt lại plugin để kích hoạt hook, do đó bảng của bạn sẽ được tạo khi plugin được kích hoạt.


-2

Các từ khóa SQL, như CREATE TABLE và UPDATE, phải là chữ hoa. vì vậy thay đổi dòng tạo bảng thành:

"CREATE TABLE " . $packagetable . "( 

id mediumint(9) NOT NULL AUTO_INCREMENT,

đến:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

hoặc này:

name text NOT NULL, 

đến:

name TEXT NOT NULL, 

và như thế


"Từ khóa SQL, như [Hoài], phải viết hoa" . Xin lỗi, nhưng không, điều này không đúng.
kaiser

để sử dụng hàm dbDelta, chúng ta nên sử dụng chữ hoa. vui lòng kiểm tra trang này: codex.wordpress.org/Creating_Tables_with_Plugins
shirin niki

Xin lỗi, nhưng tôi có thể đọc không nơi nào trong nguồn . Tôi đã bỏ lỡ một cái gì đó? Có lẽ bạn muốn thêm một ví dụ mini-plugin vào câu trả lời của mình cho thấy nó không thành công (mà ai đó có thể thực hiện và kiểm tra) với cú pháp viết thấp hơn?
kaiser

trong liên kết này: liên kết , đoạn đầu tiên của Tạo hoặc Cập nhật Bảng đề cập đến vấn đề này.
shirin niki

Điều này chỉ đúng cho CREATE TABLE, CREATE DATABASE, INSERT INTO, và UPDATE. Mọi thứ khác hoặc không được sử dụng trong một so sánh phân biệt chữ hoa chữ thường hoặc được chuyển thành chữ thường . Đề xuất của bạn không có hiệu lực.
fuxia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.