Почему не срабатывает TRUNCATE TABLE через php?
Всем привет, хочу сделать очищение таблицы через кнопку по ajax, с ajax'ом всё ок, рботает, пробовал создавать таблицу, копировать в неё данные из другой таблицы, но вот очистить её, не срабатывает, в чём может быть проблема?
Это работает:
$sql.= "CREATE TABLE wp_11_posts LIKE wp_posts;";
Это не работает:
$sql.= "TRUNCATE TABLE wp_11_posts;";
Причём, если на прямую выполнить запрос через phpmyadmin, то всё работает как надо:
TRUNCATE TABLE wp_11_posts;
Добавлю, в php в конце запроса выполнение идёт следующим образом:
dbDelta($sql);
UPD:
Данный запрос работает через код:
$wpdb->query('TRUNCATE TABLE wp_11_posts;');
Однако, это занимает много времени... Изначальный вопрос остаётся в силе!
UPD:
Это тоже не срабатывает
$sql.= "DROP TABLE wp_11_posts;";
Дополнительно:
Ответы:
проще удалить и создать заново
DROP TABLE wp_11_posts;
CREATE TABLE wp_11_posts LIKE wp_posts;
- Это-то понятно, но вопрос в другом)
Хотя запрос на удаление, я еще не пробовал…
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
dbDelta()не предназначен для выполнения произвольных SQL-команд вродеTRUNCATE TABLEилиDROP TABLE. Это функция WordPress для создания и обновления структуры таблиц поCREATE TABLE. ПоэтомуCREATE TABLE ... LIKE ...может частично сработать, аTRUNCATEчерезdbDelta()— нет.Для очистки таблицы используйте
$wpdb->query():global $wpdb; $table = $wpdb->prefix . '11_posts'; $wpdb->query('TRUNCATE TABLE ' . $table);
Но если таблица большая и операция «занимает много времени», причина не в
$wpdb->query(), а в самой операции, блокировках, внешних ключах, размере таблицы или сервере БД.TRUNCATEобычно быстрееDELETE, но требует правDROPи берёт блокировку таблицы.Для AJAX-кнопки обязательно добавьте проверку прав и nonce:
add_action('wp_ajax_clear_custom_table', function () { check_ajax_referer('clear_custom_table'); if (! current_user_can('manage_options')) { wp_send_json_error('Недостаточно прав', 403); } global $wpdb; $wpdb->query('TRUNCATE TABLE ' . $wpdb->prefix . '11_posts'); wp_send_json_success(); });
Не передавайте имя таблицы напрямую из AJAX-запроса. Для операций очистки лучше использовать белый список таблиц, иначе можно случайно или намеренно удалить не те данные.