Поддержка Проблемы и решения Не появляется новая таблица в БД

  • Всем привет
    Какой-то косяк, не пойму.

    Вобщем добавляю код , который создаёт новую таблицу, а потом уже сортирует данные, полученные из неё.

    Значит, пишу :
    Код:

    global $wpdb;
    $ppbv_tablename = $wpdb->prefix.'popular_by_views';
    function ppbv_create_table(){
        global $wpdb, $ppbv_tablename;
        $ppbv_table = $wpdb->get_results("SHOW TABLES LIKE '{$ppbv_tablename}'" , ARRAY_N);
        if(is_null($ppbv_table)){
            $create_table_sql = "CREATE TABLE {$ppbv_tablename} (
                id BIGINT(50) NOT NULL AUTO_INCREMENT,
                post_id VARCHAR(255) NOT NULL,
                views BIGINT(50) NOT NULL,
                PRIMARY KEY (id),
                UNIQUE (id)
            );";
            $wpdb->query($create_table_sql);
            $wpdb->flush();
        }

    Потом как-бы тело функции идёт, но ничего не появляется.. Начал разбираться, зашёл в БД, к которой WP подсоединён, и не вижу там новой таблицы..
    Помогите найти косяк..

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Модератор Yuri

    (@yube)

    Проверьте, что получается в $ppbv_table. Подозреваю, что там всегда array.

    Кстати, а чего не использовали IF NOT EXISTS?

    согласен с предыдущим постом, IF NOT EXISTS используйте, а проверки лучше делайте через empty()

    попробую!
    просто код писал не я, а я не так силён в php

    А можно узнать, где про IF NOT EXISTS можно почитать? не вижу материала..

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Если хочется с минимальными усилиями исправить существующий код, можно
    попробовать заменить if(is_null($ppbv_table)) на if(empty($ppbv_table)).

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    На другом форуме вы привели более полный фрагмент кода, в котором вышеупомянутая функция вызывается с помощью register_activation_hook(). Я правильно понимаю, что речь идёт о плагине?

    правильно.. if(empty($ppbv_table)) не помогает..
    действительно, более полный код:

    global $wpdb; // вызываем глобальные переменные для работы с функцией
    $ppbv_tablename = $wpdb->prefix.'popular_by_views'; // совмещаем префикс и название таблицы
    
    function ppbv_create_table(){
        global $wpdb, $ppbv_tablename; // называя global, мы можем использовать эти переменные  в  функции
        $ppbv_table = $wpdb->get_results("SHOW TABLES LIKE '{$ppbv_tablename}'" , ARRAY_N); // если нет результатов, возвращает ноль
        if(empty($ppbv_table)){ // если таблиц нет, то:
            $create_table_sql = "CREATE TABLE {$ppbv_tablename} (
                id BIGINT(50) NOT NULL AUTO_INCREMENT,
                post_id VARCHAR(255) NOT NULL,
                views BIGINT(50) NOT NULL,
                PRIMARY KEY (id),
                UNIQUE (id)
            );"; // осторожнее с SQL-синтаксисом, он очень чувствителен)
            $wpdb->query($create_table_sql); // запускаем SQL запрос к БД
        }
    }
    register_activation_hook(__FILE__,'ppbv_create_table'); // запуск функции 'ppbv_create_table' во время активации плагина
    
     function ppbv_page_viewed(){
        if(is_single() && !is_page()){ // только при запуске постов, а не страниц блога
            global $wpdb, $post, $ppbv_tablename; // вызываем глобальные переменные для работы с функцией   в  функции
            $wpdb->flush(); // очищает буфер БД
            $data = $wpdb->get_row("SELECT * FROM {$ppbv_tablename} WHERE post_id='{$post->ID}'", ARRAY_A); // проверяет данные из столбца, который содержит post ID
            if(!is_null($data)){ // если ячейка с  данными есть
                $new_views = $data['views'] + 1; // увеличиваем количество просмотров на 1
                $wpdb->query("UPDATE {$ppbv_tablename} SET views='{$new_views}' WHERE post_id='{$post->ID}';"); // обновляем данные с учётом нового просмотра
                $wpdb->flush(); // очищает буфер БД
            }
            else { // если ещё нет ячейки с данными (тоесть, пока  ни одного просмотра)
                $wpdb->query("INSERT INTO {$ppbv_tablename} (post_id, views) VALUES ('{$post->ID}','1');"); // добавляем ячейку , отсчёт просмотров  начинаетсяс 1
                $wpdb->flush(); // очищает буфер БД
            }
        }
    }
    add_action('wp_head','ppbv_page_viewed'); // добавляет ppbv_page_viewed к wp_head-счётчику

    это код плагина, который я хочу сделать не-плагином

    ну а весь код:

    ifolder.ru/20860440

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    это код плагина, который я хочу сделать не-плагином

    Т.е. вставить в functions.php?

    if(empty($ppbv_table)) не помогает..

    Помогает, но поскольку register_activation_hook() срабатывает только при активации плагинов, то вне плагина функция не вызывается.

    Можно заменить эту строку:

    register_activation_hook(__FILE__,'ppbv_create_table');

    на такую:

    add_action('init', 'ppbv_create_table');

    После этого у меня появилась таблица. Чтобы сэкономить запрос к БД, можно потом закомментировать строку.

    а можете показать получившися сниппет? я попробовал, но опять эффекта ноль..

    да, кстати, вставляю я код вот так:

    создаю в папке с темой popbyview.php, в него закидываю код, и вывожуу:

    <div>
    <?php include(TEMPLATEPATH."/popbyview.php"); ?>
    <?php ppbv_display(); ?>
    </div>

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Не появляется новая таблица в БД» закрыта для новых ответов.