Добавить значение в массив в базе данных

Вопрос или проблема

У меня есть пользовательская база данных на моем сайте WordPress, где я хочу сохранить несколько значений в одной строке.

Допустим, у меня есть запись:

  • id: автоинкремент
  • pageid: id текущей страницы
  • time: текст (это массив, созданный с помощью implode)

Пример:

id  pageid  time
1   1       121212,121314,121415
2   2       121212,121314

Что я пытаюсь сделать, так это найти способ расширить поле “time”. Каждый раз, когда срабатывает функция, я хочу добавлять timestamp к существующим значениям.

Таким образом, это будет выглядеть так:

id  pageid  time
1   1       121212,121314,121415, 181920
2   2       121212,121314, 292929, 988339

Как лучше всего решить эту задачу и как?

function custom_setup_db(){
    global $wpdb;
    $table_name = "customdb"; 
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
      id mediumint(9) NOT NULL AUTO_INCREMENT,
      userid mediumint(9) NOT NULL,
      timestamparray text,
      UNIQUE KEY id (id)
    ) $charset_collate;";

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );    
}

function wp_install_data(){
    global $wpdb;

    $table_name="customdb";
    $timestamparray = array();
    array_push($timestamparray, '121212', '131415', '121316');
    $timeofvisit = implode(",", $timeofvisit);

    $wpdb->insert( 
        $table_name, 
        array( 
            'timeofvisit' => $timeofvisit,
            'userid' => '2'
        ) 
    );   
}

В вашей таблице нет колонки timeofvisit. Второе значение $wpdb->insert ожидает пары значений столбца, смотрите здесь. Попробуйте

$wpdb->insert( 
    $table_name, 
    array( 
        'timestamparray' => $timeofvisit,
        'userid' => '2'
    ) 
);

Почему вы не используете $wpdb->update? Я имею в виду, когда вы вставляете данные, используя $wpdb->insert(), и задаете условия

if(following_conditions){
       $wpdb->update($table, $data, $where);
}

и добавляете запятую после последних данных.

Вот пример моих функций обновления:

$wpdb->update($wpdb->prefix . 'users', ['user_pass'=>$repeat_password], ['user_email'=>$_GET["req:em"]]);

Я думаю, что лучший способ сохранить несколько данных в базе данных — это использовать стандартную функциональность ядра WordPress, используя maybe_serialize, мы можем сохранять и извлекать данные в определенном формате. Пожалуйста, ознакомьтесь с этой ссылкой.

Позвольте мне объяснить вам по вашему коду.
После использования функции maybe_serialize ваш код будет выглядеть так.

function wp_install_data() {
    global $wpdb;

    $table_name="customdb";
    $timestamparray = array();
    array_push($timestamparray, '121212', '131415', '121316');
    //$timeofvisit = implode(",", $timeofvisit);

    // Код обновления начинается
    $timeofvisit = maybe_serialize($timestamparray);
    // Код обновления заканчивается

    $wpdb->insert( 
        $table_name, 
        array( 
            'timeofvisit' => $timeofvisit,
            'userid' => '2'
        ) 
    );   
}

В базе данных данные будут храниться следующим образом.

a:2:{i:1;s:12:"Hello World!";s:3:"foo";s:3:"bar";}

Когда вы получите эти записи из базы данных, вам нужно будет вызвать функцию maybe_unserialize, и вы получите массив этих данных.

Надеюсь, это поможет вам.

Ответ или решение

Добавление значений в массив в базе данных: полное руководство по расширению поля в WordPress

Ваша задача — добавить новые временные метки в существующее поле в базе данных WordPress, которое уже содержит массив значений. В данном ответе мы разберем, как эффективно реализовать эту функциональность, обеспечивая устойчивость и эффективность ваших операций с базой данных.

Шаг 1: Создание таблицы в базе данных

Начнем с создания таблицы, которая будет хранить ваши данные. Из вашего кода видно, что вы уже используете функцию dbDelta для создания таблицы. Убедитесь, что ваше поле называется именно timestamparray, что единственно правильно в этом контексте.

Вот исправленный код для функции создания таблицы:

function custom_setup_db() {
    global $wpdb;
    $table_name = $wpdb->prefix . "customdb"; 
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
      id mediumint(9) NOT NULL AUTO_INCREMENT,
      pageid mediumint(9) NOT NULL,
      timestamparray text,
      UNIQUE KEY id (id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);    
}

Шаг 2: Вставка или обновление данных

Для вставки или обновления значений в поле timestamparray вам необходимо будет использовать метод maybe_serialize(), чтобы сохранить массив значений правильно. Это позволит избежать проблем с форматом хранения, и вы сможете более удобно извлекать данные позже.

Вот пример, как это можно реализовать:

function update_timestamps($pageid, $new_timestamp) {
    global $wpdb;
    $table_name = $wpdb->prefix . "customdb";

    // Получаем текущее значение
    $current_record = $wpdb->get_row($wpdb->prepare("SELECT timestamparray FROM $table_name WHERE pageid = %d", $pageid));

    if ($current_record) {
        // Распаковываем текущее значение в массив
        $existing_timestamps = maybe_unserialize($current_record->timestamparray);

        // Добавляем новую временную метку
        if (!is_array($existing_timestamps)) {
            $existing_timestamps = [];
        }

        // Проверка на уникальность
        if (!in_array($new_timestamp, $existing_timestamps)) {
            $existing_timestamps[] = $new_timestamp;
        }

        // Сериализуем массив для хранения
        $updated_timestamps = maybe_serialize($existing_timestamps);

        // Обновляем запись в базе данных
        $wpdb->update(
            $table_name,
            ['timestamparray' => $updated_timestamps],
            ['pageid' => $pageid]
        );
    } else {
        // Если записи не существует, создаем новую
        $new_timestamps = maybe_serialize([$new_timestamp]);
        $wpdb->insert(
            $table_name,
            ['timestamparray' => $new_timestamps, 'pageid' => $pageid]
        );
    }
}

Шаг 3: Вызов функции

Теперь, когда у вас есть функция для добавления новой временной метки, вы можете просто вызывать её в нужный момент вашего кода, например, при обработке определённых действий на странице:

update_timestamps(1, '181920'); // обновление записи с pageid = 1 добавив новую временную метку

Заключение

Использование сериализации для хранения массивов в базе данных WordPress позволяет эффективно манипулировать данными и обеспечивать их целостность. Этот подход не только упрощает процесс добавления новых значений, но и помогает гарантировать, что вы всегда работаете с корректными данными.

Не забывайте тщательно тестировать вашу функцию и обрабатывать возможные ошибки, чтобы обеспечить надежность всего процесса работы с базой данных.

Оцените материал
Добавить комментарий

Капча загружается...