• Решено SvenSoft

    (@svensoft)


    Пытаюсь сделать запрос:

    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 . ';';
    $wpdb->query( $sql );

    WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘DROP TABLE IF EXISTS wpena_prowp_ena_brand_data’ at line 1]

    С SQL запросом все в порядке, если разбиваю на два запроса, то тоже работает, такое впечатление что DELIMITER изменяет сам WP, или я ошибаюсь?

Просмотр 10 ответов — с 1 по 10 (всего 10)
  • выполните два запроса… что в этом плохого?

    Да плохого, кроме увеличения времени работы скрипта, ничего, но вопрос в другом, почему не работают два запроса в одном?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    С SQL запросом все в порядке, если разбиваю на два запроса, то тоже работает, такое впечатление что DELIMITER изменяет сам WP, или я ошибаюсь?

    Нет, не меняет.

    Функции PHP mysql_query() и mysqli_query() не поддерживают несколько запросов в одной команде.

    Я думал, что $wpdb->query() обеспечивает функционал mysqli_multi_query(). А есть какая-то альтернатива вроде $wpdb->multi_query()?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    А есть какая-то альтернатива вроде $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);

    Все работает!

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Только не понятно, почему по умолчанию у WP отключен mysqli

    Потому что не на всех серверах есть это расширение. Однако в некоторых случаях по умолчанию используется именно mysqli:

    • При наличии константы WP_USE_EXT_MYSQL, как вы уже догадались.
    • При работе с версией WordPress, находящейся в разработке.
    • При использовании PHP 5.5 и выше.
    • При отсутствии расширения mysql.

    Полное обсуждение можно прочитать в багтрекере: #21663.

    Ок, спасибо за информацию.

Просмотр 10 ответов — с 1 по 10 (всего 10)
  • Тема «Проблема SQL» закрыта для новых ответов.