WordPress 4.8.1 использует mysql_connect, который не работает с PHP 7

10

Я только что обновился до PHP 7 и обнаружил, что WordPress 4.8.1 (последняя версия) все еще использует mysql_connect в модуле wp-db.php, но mysql_connect устарела.

Следующий код взят из wp-db-php, строки 1567-1571:

if ( WP_DEBUG ) {
    $this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
} else {
    $this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this>dbpassword,
                                 $new_link, $client_flags);
}

Вот вывод, когда я пытаюсь запустить мою программу:

Неустранимая ошибка: необработанная ошибка: вызов неопределенной функции mysql_connect () в D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp-db.php: 1570
Трассировка стека:
# 0 D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp- db.php (658): wpdb-> db_connect ()
# 1 D: \ ApacheHtdocs \ ConneXions \ wp-includes \ load.php (404): wpdb -> __ construct ('root', '', 'connectionsxions', ' localhost ')
# 2 D: \ ApacheHtdocs \ ConneXions \ wp-settings.php (106): require_wp_db ()
# 3 D: \ ApacheHtdocs \ ConneXions \ wp-config.php (104): require_once (' D: \ ApacheHtdocs. .. ')
# 4 D: \ ApacheHtdocs \ ConneXions \ wp-load.php (37): require_once (' D: \ ApacheHtdocs ... ')
# 5 D: \ ApacheHtdocs \ ConneXions \ wp-blog-header.php (13): require_once ('D: \ ApacheHtdocs ...')
# 6 D: \ ApacheHtdocs \ ConneXions \ index.php (17): require ('D: \ ApacheHtdocs ...')
# 7 {main}, брошенный в D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp-db. PHP на линии 1570

Я не могу поверить, что WordPress рекомендует PHP 7, но он не работает с ним. Что мне здесь не хватает?

Боб Джонс
источник
2
mysql_connectиспользуется только как запасной вариант, когда mysqliне обнаружен. Казалось бы, у вас нет ни одного mysqliили mysqlустановлен ( mysqliрекомендуется, mysqlне рекомендуется)
Том Дж. Новелл

Ответы:

10

Похоже, у вас не установлен и / или не включен mysqli на вашем сервере. IIRC mysqliбыл добавлен в php в версии 5.5, и с mysqlтех пор старое расширение устарело и полностью устарело. Если вы обновили очень старую версию PHP, возможно, вам все еще нужен дополнительный шаг включения mysqli.

(WordPress проверяет существование, mysqliи только если он не существует, пробует старые mysqlфункции.)

Марк Каплун
источник
mysql был частью PHP в версиях 4 и 5 и удален в версии 7. mysqli был представлен в PHP 5.0.0 и работает во всех версиях PHP 5 и до сих пор во всех версиях PHP 7. Вы, вероятно, думаете, что mysql устарел в PHP 5.5.0.
CJ Деннис
@ CJDennis, это именно то, что я сказал об устаревании. Если вы считаете, что в моем английском есть ошибка, вы можете редактировать ответ;)
Марк Каплун,
Я исправил вашу мысль, что mysqli был введен в 5.5.0, когда он был представлен в 5.0.0.
CJ Деннис
4

В дополнение к ответу @MarkKaplun я публикую некоторый код из класса wpdb:

Вот как wpdb::use_mysqliэто определяется:

Это начато с:

/**
 * Whether to use mysqli over mysql.
 *
 * @since 3.9.0
 * @access private
 * @var bool
 */
private $use_mysqli = false;

и тогда в wpdbконструкторе мы имеем:

/* Use ext/mysqli if it exists and:
 *  - WP_USE_EXT_MYSQL is defined as false, or
 *  - We are a development version of WordPress, or
 *  - We are running PHP 5.5 or greater, or
 *  - ext/mysql is not loaded.
 */
if ( function_exists( 'mysqli_connect' ) ) {
        if ( defined( 'WP_USE_EXT_MYSQL' ) ) {
                $this->use_mysqli = ! WP_USE_EXT_MYSQL;
        } elseif ( version_compare( phpversion(), '5.5', '>=' ) || ! function_exists( 'mysql_connect' ) ) {
                $this->use_mysqli = true;
        } elseif ( false !== strpos( $GLOBALS['wp_version'], '-' ) ) {
                $this->use_mysqli = true;
        }
}
birgire
источник
2

Чтобы решить эту проблему, вам нужно отредактировать файл php.ini.

беги, где php.ini я нашел свой в:

/etc/php/php.ini (хотя я не знаю, какую ОС вы используете, просто найдите вашу)

Посмотрите на эти два файла:

extension=pdo_mysql.so
extension=mysqli.so

и раскомментируйте их. Вуаля, это сделало бы работу в любое время.

Дополнительная информация: https://wiki.archlinux.org/index.php/PHP.

Лоуренс Опута
источник
2

Вы используете Xamppp 7.x для Windows?

Это случилось со мной, когда я обновил свой Xampp 5.6 до Xampp 7.1. Изучив файл конфигурации C: \ Xampp \ php \ php.ini , я заметил множество ошибок, связанных с именами расширений PHP (в них отсутствуют префикс php_ и суффикс .dll). Один из них связан с MySQL.

Неправильная настройка, которую я нашел там:

extension=mysqli

Правильная настройка (после редактирования этой строки):

extension=php_mysqli.dll

Исправление, которое решило мою проблему.

Кстати, не забудьте исправить все другие неправильные настройки (правильное имя расширений можно увидеть в C: \ xampp \ php \ ext).

aldemarcalazans
источник