WordPress 4.8.1 usa mysql_connect que no funciona con PHP 7

5 ago 2017, 22:58:36
Vistas: 18.1K
Votos: 10

Acabo de actualizar a PHP 7 solo para descubrir 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 obsoleto.

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á la salida cuando intento ejecutar mi programa:

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

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

1
Comentarios

mysql_connect solo se utiliza como respaldo cuando no se detecta mysqli. Parece que no tienes instalado ni mysqli ni mysql (se recomienda mysqli, ya que mysql está obsoleto).

Tom J Nowell Tom J Nowell
6 ago 2017 00:26:26
Todas las respuestas a la pregunta 4
3
10

Parece que no tienes mysqli instalado y/o habilitado en tu servidor. Si no recuerdo mal, mysqli se añadió a PHP en la versión 5.5, y la antigua extensión mysql quedó obsoleta y fue retirada por completo desde entonces. Si has actualizado desde una versión muy antigua de PHP, puede que aún necesites el paso adicional de habilitar mysqli.

(WordPress comprueba la existencia de mysqli y solo si no existe intenta usar las funciones antiguas de mysql).

5 ago 2017 23:25:58
Comentarios

mysql fue parte de PHP en las versiones 4 y 5, y fue eliminado 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ás pensando que mysql fue obsoleto en PHP 5.5.0.

CJ Dennis CJ Dennis
6 ago 2017 04:24:16

@CJDennis, eso es exactamente lo que dije respecto a la obsolescencia. Si crees que hay un error en mi inglés, eres más que bienvenido a editar la respuesta ;)

Mark Kaplun Mark Kaplun
6 ago 2017 06:33:10

Estaba corrigiendo tu pensamiento de que mysqli se introdujo en 5.5.0, cuando en realidad se introdujo en 5.0.0.

CJ Dennis CJ Dennis
6 ago 2017 06:36:29
0

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

Aquí se muestra cómo se determina wpdb::use_mysqli:

Se inicializa con:

/**
 * Define si se debe usar mysqli en lugar de mysql.
 *
 * @since 3.9.0
 * @access private
 * @var bool
 */
private $use_mysqli = false;

y luego en el constructor de wpdb tenemos:

/* Usar ext/mysqli si existe y:
 *  - WP_USE_EXT_MYSQL está definido como false, o
 *  - Es una versión de desarrollo de WordPress, o
 *  - Se está ejecutando PHP 5.5 o superior, o
 *  - ext/mysql no está cargado.
 */
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 ago 2017 23:35:40
0

Lo que debes hacer para resolver este problema es editar tu archivo php.ini.

Ejecuta donde está php.ini El mío lo encontré en:

/etc/php/php.ini (aunque no sé qué sistema operativo estás usando, simplemente encuentra el tuyo)

Busca estas dos líneas:

extension=pdo_mysql.so
extension=mysqli.so

y descoméntalas. Voilà, eso hará el trabajo en cualquier momento.

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

16 nov 2017 14:39:08
0

¿Estás utilizando Xampp 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 de 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 olvides corregir todas las demás configuraciones incorrectas (el nombre correcto de las extensiones se puede ver en C:\xampp\php\ext).

7 mar 2018 23:44:15