dbDelta तालिकाएँ नहीं बना रहा है


15

मैं बहुत सारे थ्रेड्स, कोडेक्स पेज के माध्यम से गया और बहुत सी चीजों के साथ खिलवाड़ करने की कोशिश की, लेकिन मेरा कोड तालिकाओं का निर्माण नहीं करता है। और मैं यह पता लगाने में सक्षम नहीं हूं कि मैं कहां गलत हो रहा हूं। मैंने डेटाबेस में Book_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 के बारे में वर्डप्रेस-कोडेक्स से :

DbDelta फ़ंक्शन वर्तमान तालिका संरचना की जांच करता है, इसे वांछित तालिका संरचना से तुलना करता है, और या तो तालिका को आवश्यक रूप से जोड़ता या संशोधित करता है, इसलिए यह अपडेट के लिए बहुत उपयोगी हो सकता है (अधिक विवरण के लिए wp-admin / उन्नयन- schema.php देखें) dbDelta का उपयोग कैसे करें)। ध्यान दें कि dbDelta फ़ंक्शन, हालांकि picky है। उदाहरण के लिए:

  • आपको अपने SQL स्टेटमेंट में प्रत्येक फ़ील्ड को अपनी लाइन पर रखना होगा।
  • आपके पास शब्द प्राथमिक कुंजी और आपकी प्राथमिक कुंजी की परिभाषा के बीच दो स्थान होने चाहिए।
  • आपको इसके पर्याय INDEX के बजाय कुंजी शब्द कुंजी का उपयोग करना चाहिए और आपको कम से कम एक कुंजी शामिल करनी होगी।
  • आपको फ़ील्ड नामों के आसपास किसी भी एपोस्ट्रोफ़ या बैकटिक्स का उपयोग नहीं करना चाहिए।

उन कैविटीज़ के साथ, हमारे फ़ंक्शन में अगली पंक्तियाँ हैं, जो वास्तव में टेबल बनाएंगे या अपडेट करेंगे। आपको $ 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 वास्तव में कहता है कि यह तालिका बनाता है, भले ही यह नहीं हो
जोमेयो 1984

1
संदर्भ के लिए, अनुगामी अल्पविराम के साथ PRIMARY KEY (id),समस्या, एक SQL मुद्दा है, न dbDelta और न ही WP समस्या। इसलिए कोई दस्तावेज नहीं।
जेरेमी

ध्यान दें कि dbDelta()आपके साथ कई प्रश्न बनाते समय आप प्रत्येक क्वेरी के लिए व्यक्तिगत रूप dbDeltaसे कॉल करने के बजाय अपने SQL के सरणी के रूप में पास कर सकते हैं dbDelta
टोनि_लिहिमाकी

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

'क्रिएट टेबल' के बजाय 'क्रिएट टेबल' का उपयोग करने से मेरे लिए समस्या हल हो गई।


0

उन सभी महत्वपूर्ण बिंदुओं के अलावा, आपको सक्रियण हुक को ट्रिगर करना चाहिए।

जब आपने अपना प्लगइन विकसित किया था और सही कोड लिखा था, तब भी आपको हुक को ट्रिगर करने के लिए अपने प्लगइन को फिर से सक्रिय करना होगा, इसलिए प्लगइन सक्रिय होने पर आपकी तालिका बनाई जाएगी।


-2

SQL कीवर्ड, जैसे क्रिएट टेबल और अपडेट, अपरकेस होना चाहिए। इसलिए तालिका बनाने की परिवर्तन रेखा:

"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, 

और इसी तरह


"एसक्यूएल कीवर्ड, जैसे […], अपरकेस होना चाहिए" । क्षमा करें, लेकिन नहीं, यह सच नहीं है।
कैसर

dbDelta फ़ंक्शन का उपयोग करने के लिए, हमें अपरकेस का उपयोग करना चाहिए। कृपया इस पृष्ठ को देखें: codex.wordpress.org/Creating_Tables_with_Plugins
shirin niki

क्षमा करें, लेकिन मैं स्रोत में कहीं नहीं पढ़ सकता । क्या मैं कुछ भुल गया? हो सकता है कि आप अपने उत्तर में एक उदाहरण मिनी-प्लगइन जोड़ना चाहते हैं जो यह दर्शाता है कि यह कम कैस सिंटैक्स के साथ विफल रहता है (जिसे कोई ले सकता है और परीक्षण कर सकता है)?
कैसर

इस लिंक में: लिंक , तालिका बनाने या अद्यतन करने के पहले पैराग्राफ में इस मुद्दे का उल्लेख है।
शिरीन निकी

इस के लिए केवल सच है CREATE TABLE, CREATE DATABASE, INSERT INTO, और UPDATE। बाकी सब कुछ या तो केस-संवेदी तुलना में उपयोग नहीं किया जाता है या निचले मामले में परिवर्तित हो जाता है । आपके सुझावों का कोई प्रभाव नहीं है।
FUXIA
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.