Как дублировать таблицу в БД через код php?

Ссылка скопирована
1 ответ

Здравствуйте, есть сайт на wordpress , подключен мультисайт.
Суть такова, хочется сделать по нажатию кнопки что бы таблица относящаяся к главному сайту, копировалась на остальные поддомены...
Так вот, сам вопрос: Есть-ли такой код, что бы дублировать всю таблицу, с заданием нового имени?
Никогда такое не делал, но делал такое через phpmyadmin, там такое делается в пару кнопок, а мне нужно что бы через код)

Дополнительно:

Как дублировать таблицу в БД через код php?

meusov11 @meusov11 Да, в php необходимо использовать оператор SQL INSERT INTO … SELECT

Пример:

$sqlCopyData = "INSERT INTO $newTable SELECT * FROM $oldTable"; if ($conn->query($sqlCopyData) === TRUE) {     echo "Данные успешно скопированы в новую таблицу."; } else {     echo "Ошибка при копировании данных: " . $conn->error; }

$sqlCopyData = "INSERT INTO $newTable SELECT * FROM $oldTable"; if ($conn->query($sqlCopyData) === TRUE) { echo "Данные успешно скопированы в новую таблицу."; } else { echo "Ошибка при копировании данных: " . $conn->error; }

  • Спасибо добрый человек, буду изучать)
    Получается, перед этим ещё нужно создать похожую структуру таблицы оригинала, верно?
    CREATE TABLE $newTable LIKE $oldTable;
  • sergo573, чтобы сильно не мучиться, код для создания таблиц бери из инструментов резервного копирования самой бд, например для mysql это mysqldump... в принципе можно и данные ею же копировать
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Юрий Linux Ответ

Да, таблицу MySQL можно скопировать из PHP в два шага: сначала создать новую таблицу с такой же структурой, затем перенести данные. В WordPress лучше работать через $wpdb, а имена таблиц обязательно проверять или собирать самому, потому что плейсхолдеры SQL не защищают имена таблиц так же, как значения.

global $wpdb;
 
$old_table = $wpdb->base_prefix . 'some_table';
$new_table = $wpdb->prefix . 'some_table_copy';
 
if (!preg_match('/^[a-zA-Z0-9_]+$/', $old_table . $new_table)) {
    wp_die('Bad table name');
}
 
$wpdb->query("CREATE TABLE {$new_table} LIKE {$old_table}");
$wpdb->query("INSERT INTO {$new_table} SELECT * FROM {$old_table}");

global $wpdb; $old_table = $wpdb->base_prefix . 'some_table'; $new_table = $wpdb->prefix . 'some_table_copy'; if (!preg_match('/^[a-zA-Z0-9_]+$/', $old_table . $new_table)) { wp_die('Bad table name'); } $wpdb->query("CREATE TABLE {$new_table} LIKE {$old_table}"); $wpdb->query("INSERT INTO {$new_table} SELECT * FROM {$old_table}");

Если таблица должна копироваться на сайты мультисайта, нужно пройтись по блогам через get_sites() и switch_to_blog(). Тогда $wpdb->prefix будет меняться под текущий сайт сети.

global $wpdb;
 
$source_table = $wpdb->base_prefix . 'catalog';
 
foreach (get_sites(['fields' => 'ids']) as $blog_id) {
    switch_to_blog($blog_id);
 
    $target_table = $wpdb->prefix . 'catalog';
    $wpdb->query("DROP TABLE IF EXISTS {$target_table}");
    $wpdb->query("CREATE TABLE {$target_table} LIKE {$source_table}");
    $wpdb->query("INSERT INTO {$target_table} SELECT * FROM {$source_table}");
 
    restore_current_blog();
}

global $wpdb; $source_table = $wpdb->base_prefix . 'catalog'; foreach (get_sites(['fields' => 'ids']) as $blog_id) { switch_to_blog($blog_id); $target_table = $wpdb->prefix . 'catalog'; $wpdb->query("DROP TABLE IF EXISTS {$target_table}"); $wpdb->query("CREATE TABLE {$target_table} LIKE {$source_table}"); $wpdb->query("INSERT INTO {$target_table} SELECT * FROM {$source_table}"); restore_current_blog(); }

Важные ограничения:

  • CREATE TABLE ... LIKE копирует структуру и индексы, но не всегда копирует внешние ключи и триггеры.
  • Если таблица большая, операция может занять время и заблокировать таблицы.
  • Перед запуском по сети сайтов сделайте дамп БД или хотя бы копию исходной таблицы.
  • Если это стандартные таблицы WordPress, слепое копирование может сломать связи записей, пользователей, метаданных и таксономий.

Для разовой административной операции безопаснее оформить это отдельной WP-CLI командой или админским инструментом с nonce и проверкой прав, а не запускать по обычной кнопке без защиты.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно