WordPress 4.8.1 usa mysql_connect que no funciona con PHP 7

10

Acabo de actualizar a PHP 7 solo para encontrar que WordPress 4.8.1 (última versión) todavía usa mysql_connect en el módulo wp-db.php, pero mysql_connect ha quedado en desuso.

El siguiente código está tomado de wp-db-php, líneas 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);
}

Aquí está el resultado cuando intento ejecutar mi programa:

Error fatal: Error no detectado: Llamada a la función indefinida mysql_connect () en D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp-db.php: 1570 Seguimiento de
pila:
# 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} incluido en D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp-db. php en línea 1570

No puedo creer que WordPress diga que recomienda PHP 7, pero no funciona con él. ¿Que me estoy perdiendo aqui?

Bob Jones
fuente
2
mysql_connectsolo se usa como reserva cuando mysqlino se detecta. Parecería que haya ninguno mysqlio mysqlinstalado ( mysqlise recomienda, mysqles obsoleto)
Tom J Nowell

Respuestas:

10

Parece que no tiene mysqli instalado y / o habilitado en su servidor. IIRC mysqlise agregó a php en la versión 5.5, y la mysqlextensión anterior había quedado en desuso y se retiró por completo desde entonces. Si actualizó desde una versión PHP muy antigua, es posible que aún necesite el paso adicional de habilitar mysqli.

(WordPress comprueba la existencia de mysqliy solo si no existe prueba las mysqlfunciones más antiguas ).

Mark Kaplun
fuente
mysql era parte de PHP en las versiones 4 y 5, y se eliminó en la versión 7. mysqli se introdujo en PHP 5.0.0 y funciona en todas las versiones de PHP 5 y hasta ahora en todas las versiones de PHP 7. Probablemente esté pensando que mysql fue desaprobado en PHP 5.5.0.
CJ Dennis
@CJDennis, eso es exactamente lo que dije con respecto a la desaprobación. Si crees que hay un error en mi inglés, eres más que bienvenido a editar la respuesta;)
Mark Kaplun
Estaba corrigiendo su pensamiento de que mysqli se introdujo en 5.5.0, cuando se introdujo en 5.0.0.
CJ Dennis
4

Además de la respuesta @MarkKaplun, publico un código de la clase wpdb:

Así es como wpdb::use_mysqlise determina:

Está inicializado con:

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

y luego en el wpdbconstructor tenemos:

/* 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
fuente
2

Lo que debe hacer para resolver este problema es editar su archivo php.ini.

corre donde se php.ini encuentra el mío en:

/etc/php/php.ini (aunque no sé qué sistema operativo está ejecutando, simplemente encuentre el suyo)

Busque estos dos archivos:

extension=pdo_mysql.so
extension=mysqli.so

y descomentarlos. Voila, eso haría el trabajo en cualquier momento.

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

Lawrence Oputa
fuente
2

¿Estás usando Xamppp 7.x para Windows?

Me sucedió cuando actualicé mi Xampp 5.6 a Xampp 7.1. Al inspeccionar el archivo de configuración C: \ Xampp \ php \ php.ini , noté muchos errores relacionados con el nombre de las extensiones PHP (carecen del prefijo php_ y el sufijo .dll). Uno de ellos está relacionado con mysqli.

La configuración incorrecta que encontré allí:

extension=mysqli

La configuración correcta (después de editar esta línea):

extension=php_mysqli.dll

Corregir eso resolvió mi problema.

Por cierto: no olvide corregir todas las demás configuraciones incorrectas (el nombre correcto de las extensiones se puede ver en C: \ xampp \ php \ ext).

aldemarcalazans
fuente