Почему не срабатывает TRUNCATE TABLE через php?

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

Всем привет, хочу сделать очищение таблицы через кнопку по 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;

  • Это-то понятно, но вопрос в другом)
    Хотя запрос на удаление, я еще не пробовал…
Нужно решить такую задачу?

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

Заказать помощь
Лучший ответ
1
Антон С. Ответ

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);

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();
});

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-запроса. Для операций очистки лучше использовать белый список таблиц, иначе можно случайно или намеренно удалить не те данные.

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

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

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

комментарий

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

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