O WordPress 4.8.1 usa mysql_connect que não funciona com o PHP 7


9

Acabei de atualizar para o PHP 7 apenas para descobrir que o WordPress 4.8.1 (versão mais recente) ainda usa mysql_connect no módulo wp-db.php, mas o mysql_connect foi descontinuado.

O código a seguir é obtido de wp-db-php, linhas 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);
}

Aqui está a saída quando tento executar meu programa:

Erro fatal: Erro não capturado: Chame para a função indefinida mysql_connect () em D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp-db.php: 1570
Rastreio de pilha:
# 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} lançado em D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp-db. php on line 1570

Não acredito que o WordPress diz que recomenda o PHP 7, mas não funciona com ele. O que estou perdendo aqui?


2
mysql_connecté usado apenas como fallback quando mysqlinão é detectado. Parece que você não mysqliou mysqlinstalado ( mysqlié recomendado, mysqlé obsoleto)
Tom J Nowell

Respostas:


9

Parece que você não tem o mysqli instalado e / ou ativado no seu servidor. O IIRC mysqlifoi adicionado ao php na versão 5.5 e a mysqlextensão mais antiga foi preterida e totalmente desativada desde então. Se você atualizou de uma versão PHP muito antiga, pode ser que você ainda precise da etapa extra de ativação mysqli.

(o wordpress verifica a existência de mysqlie somente se ele não existir tenta as mysqlfunções mais antigas .)


O mysql fazia parte do PHP nas versões 4 e 5 e foi removido na versão 7. O mysqli foi introduzido no PHP 5.0.0 e funciona em todas as versões do PHP 5 e até agora em todas as versões do PHP 7. Você provavelmente está pensando que o mysql foi reprovado no PHP 5.5.0.
CJ Dennis

@CJDennis, foi exatamente o que eu disse sobre a depreciação. Se você acha que há um erro no meu Inglês, você está mais do que bem-vindos para editar a resposta;)
Mark Kaplun

Eu estava corrigindo seu pensamento de que o mysqli foi introduzido na 5.5.0, quando foi introduzido na 5.0.0.
CJ Dennis

4

Além da resposta do @MarkKaplun, eu posto alguns códigos da classe wpdb:

Aqui está como o wpdb::use_mysqlié determinado:

É inicializado com:

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

e depois no wpdbconstrutor, temos:

/* 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;
        }
}

2

O que você deve fazer para resolver esse problema é editar o seu arquivo php.ini.

executar onde php.ini eu encontrei o meu em:

/etc/php/php.ini (embora eu não saiba em qual SO você está executando, encontre o seu)

Procure estes dois arquivos:

extension=pdo_mysql.so
extension=mysqli.so

e descomente-os. Voila, isso faria o trabalho a qualquer momento.

Leitura adicional: https://wiki.archlinux.org/index.php/PHP


2

Você está usando o Xamppp 7.x para Windows?

Aconteceu comigo quando atualizei meu Xampp 5.6 para o Xampp 7.1. Inspecionando o arquivo de configuração C: \ Xampp \ php \ php.ini , notei muitos erros envolvendo o nome das extensões PHP (eles não possuem o prefixo php_ e o sufixo .dll). Um deles está relacionado ao mysqli.

A configuração errada que encontrei lá:

extension=mysqli

A configuração correta (após editar esta linha):

extension=php_mysqli.dll

Corrigir isso resolveu meu problema.

A propósito: não esqueça de corrigir todas as outras configurações erradas (o nome correto das extensões pode ser visto em C: \ xampp \ php \ ext).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.