Вопрос или проблема
У меня есть пользовательская база данных на моем сайте 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 позволяет эффективно манипулировать данными и обеспечивать их целостность. Этот подход не только упрощает процесс добавления новых значений, но и помогает гарантировать, что вы всегда работаете с корректными данными.
Не забывайте тщательно тестировать вашу функцию и обрабатывать возможные ошибки, чтобы обеспечить надежность всего процесса работы с базой данных.