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

5 авг. 2017 г., 22:58:36
Просмотры: 18.1K
Голосов: 10

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

Следующий код взят из 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);
}

Вот что я получаю при попытке запуска программы:

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in D:\ApacheHtdocs\ConneXions\wp-includes\wp-db.php:1570
Stack trace:
#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', '', 'connexions', '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} thrown in D:\ApacheHtdocs\ConneXions\wp-includes\wp-db.php on line 1570

Не могу поверить, что WordPress утверждает о совместимости с PHP 7, но при этом не работает с ним. Что я упускаю?

1
Комментарии

mysql_connect используется только как запасной вариант, если не обнаружен mysqli. Похоже, что у вас не установлены ни mysqli, ни mysql (рекомендуется использовать mysqli, так как mysql устарел)

Tom J Nowell Tom J Nowell
6 авг. 2017 г. 00:26:26
Все ответы на вопрос 4
3
10

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

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

5 авг. 2017 г. 23:25:58
Комментарии

mysql был частью PHP в версиях 4 и 5, а в версии 7 удален. mysqli был представлен в PHP 5.0.0 и работает во всех версиях PHP 5 и пока что во всех версиях PHP 7. Возможно, вы думали, что mysql был устаревшим в PHP 5.5.0.

CJ Dennis CJ Dennis
6 авг. 2017 г. 04:24:16

@CJDennis, именно это я и сказал касательно устаревания. Если вы считаете, что в моем английском есть ошибка, вы можете отредактировать ответ ;)

Mark Kaplun Mark Kaplun
6 авг. 2017 г. 06:33:10

Я исправлял вашу мысль о том, что mysqli был представлен в 5.5.0, тогда как он появился в 5.0.0.

CJ Dennis CJ Dennis
6 авг. 2017 г. 06:36:29
0

В дополнение к ответу @MarkKaplun, публикую часть кода из класса wpdb:

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

Инициализируется следующим образом:

/**
 * Использовать ли mysqli вместо mysql.
 *
 * @since 3.9.0
 * @access private
 * @var bool
 */
private $use_mysqli = false;

а затем в конструкторе wpdb имеем:

/* Использовать ext/mysqli, если он существует и:
 *  - WP_USE_EXT_MYSQL определен как false, или
 *  - Мы используем разработческую версию WordPress, или
 *  - Мы используем PHP 5.5 или новее, или
 *  - ext/mysql не загружен.
 */
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;
        }
}
5 авг. 2017 г. 23:35:40
0

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

Выполните поиск, где находится php.ini Я нашел свой здесь:

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

Найдите эти две строки:

extension=pdo_mysql.so
extension=mysqli.so

и раскомментируйте их. Вуаля, это должно решить проблему в любой ситуации.

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

16 нояб. 2017 г. 14:39:08
0

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

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

Некорректная настройка, которую я обнаружил:

extension=mysqli

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

extension=php_mysqli.dll

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

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

7 мар. 2018 г. 23:44:15