выполните два запроса… что в этом плохого?
Да плохого, кроме увеличения времени работы скрипта, ничего, но вопрос в другом, почему не работают два запроса в одном?
С SQL запросом все в порядке, если разбиваю на два запроса, то тоже работает, такое впечатление что DELIMITER изменяет сам WP, или я ошибаюсь?
Нет, не меняет.
Функции PHP mysql_query() и mysqli_query() не поддерживают несколько запросов в одной команде.
Я думал, что $wpdb->query() обеспечивает функционал mysqli_multi_query(). А есть какая-то альтернатива вроде $wpdb->multi_query()?
А есть какая-то альтернатива вроде $wpdb->multi_query()?
На текущий момент нет.
Да плохого, кроме увеличения времени работы скрипта, ничего
Вряд ли есть заметная разница между выполнением двух команд DROP TABLE
в PHP и непосредственно в MySQL.
Вряд ли есть заметная разница между выполнением двух команд DROP TABLE в PHP и непосредственно в MySQL.
Двух команд разницы нет, но если мне например нужно в какой-то момент создать 20 таблиц, да еще заполнить их первоначальными данными, то ….))
Но видимо в таких случаях придется конектиться штатно и использовать штатные методы mysqli
На текущий момент нет.
Странно, а почему не прикрутят mysqli метод multi_query(), ведь вроде именно mysqli WP использует.
Странно, а почему не прикрутят mysqli метод multi_query(), ведь вроде именно mysqli WP использует.
Ошибался, по умолчанию WP пользует mysql, которое в легкую можно изменить на mysqli
Вообщем решение 1-минуты делов:
Заходим в wp-includes/wp-db.php и в 549 строке меняем значение приватного свойства $use_mysqli = true;
После этого WP работает с mysqli, а значит можем сделать так:
global $wpdb;
$table_sertificate = $wpdb->prefix . 'prowp_ena_sertificate_data';
$table_brand = $wpdb->prefix . 'prowp_ena_brand_data';
$sql = 'DROP TABLE IF EXISTS ' . $table_sertificate . '; DROP TABLE IF EXISTS ' . $table_brand . ';';
mysqli_multi_query($wpdb->dbh, $sql);
Все работает!
p.s. Только не понятно, почему по умолчанию у WP отключен mysqli, может в wp-config где-то можно его подключить вместо изменения приватного свойства $use_mysqli?
Только не понятно, почему по умолчанию у WP отключен mysqli, может в wp-config где-то можно его подключить вместо изменения приватного свойства $use_mysqli
Поковырявшись немного в коде, понял, да, все можно включить из wp-config.php не залезая в файлы движка WP.
Окончательное решение:
В wp-config.php устанавливаем константу
define( ‘WP_USE_EXT_MYSQL’, false ); // (В wp-db.php ничего при этом не трогаем)
Теперь WP работает с mysqli, можно делать запрос:
global $wpdb;
$table_sertificate = $wpdb->prefix . 'prowp_ena_sertificate_data';
$table_brand = $wpdb->prefix . 'prowp_ena_brand_data';
$sql = 'DROP TABLE IF EXISTS ' . $table_sertificate . '; DROP TABLE IF EXISTS ' . $table_brand . ';';
mysqli_multi_query($wpdb->dbh, $sql);
Все работает!
Только не понятно, почему по умолчанию у WP отключен mysqli
Потому что не на всех серверах есть это расширение. Однако в некоторых случаях по умолчанию используется именно mysqli:
- При наличии константы
WP_USE_EXT_MYSQL
, как вы уже догадались.
- При работе с версией WordPress, находящейся в разработке.
- При использовании PHP 5.5 и выше.
- При отсутствии расширения mysql.
Полное обсуждение можно прочитать в багтрекере: #21663.
Ок, спасибо за информацию.