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

dbDelta 에 대한 WordPress-codex에서 :

dbDelta 함수는 현재 테이블 구조를 검사하여 원하는 테이블 구조와 비교 한 후 필요에 따라 테이블을 추가 또는 수정하므로 업데이트에 매우 유용 할 수 있습니다 (더 자세한 예는 wp-admin / upgrade-schema.php 참조). dbDelta 사용 방법). 그러나 dbDelta 함수는 다소 까다 롭습니다. 예를 들어 :

  • SQL 문에서 각 필드를 고유 한 행에 두어야합니다.
  • PRIMARY KEY 단어와 기본 키 정의 사이에 공백이 두 개 있어야합니다.
  • 동의어 INDEX가 아닌 키워드 KEY를 사용해야하며 하나 이상의 KEY를 포함해야합니다.
  • 필드 이름 주위에 아포스트로피 나 백틱을 사용해서는 안됩니다.

이러한 경고와 함께 함수의 다음 줄은 실제로 테이블을 만들거나 업데이트합니다. $ 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가 코덱스 페이지에서 이것을 말하지는 않지만 마지막 줄에는 후행 쉼표를 사용할 수 없습니다. 예 : PRIMARY KEY (id),. dbDelta는 실제로 테이블을 생성하지 않더라도 테이블을 생성한다고 말합니다
JoeMoe1984

1
참고로 후행 쉼표 PRIMARY KEY (id),문제는 dbDelta 나 WP 문제가 아닌 SQL 문제입니다. 따라서 문서가 없습니다.
Jeremy Jeremy

여러 쿼리를 만들 때 모든 쿼리 에 대해 개별적 으로 호출 dbDelta()하는 dbDelta대신 SQL을 배열로 전달할 수 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

'create table'대신 'CREATE TABLE'을 사용하면 문제가 해결되었습니다.


0

이러한 모든 중요한 사항 외에도 활성화 후크를 트리거해야합니다.

플러그인을 개발하고 올바른 코드를 작성하는 동안 여전히 후크를 트리거 하기 위해 플러그인다시 활성화해야 하므로 플러그인이 활성화 될 때 테이블이 작성됩니다.


-2

CREATE TABLE 및 UPDATE와 같은 SQL 키워드는 대문자 여야합니다. 따라서 create table의 행을 다음으로 변경하십시오.

"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

죄송하지만 소스의 아무 곳도 읽을 수 없습니다 . 내가 뭐 놓친 거 없니? 어쩌면 소문자 구문으로 실패하고 (누군가가 테스트 할 수 있음) 보여주는 미니 플러그인 예제를 답변에 추가하고 싶습니까?
카이저

이 링크 : link 에서 테이블 작성 또는 업데이트의 첫 번째 단락에이 문제가 언급되어 있습니다.
shirin niki

이는 만 사실이다 CREATE TABLE, CREATE DATABASE, INSERT INTO,와 UPDATE. 다른 모든 것은 대소 문자 구분 비교에서 사용되지 않거나 소문자로 변환 되지 않습니다 . 귀하의 제안은 효과가 없습니다.
fuxia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.