WordPress 4.8.1 usa mysql_connect que no funciona con PHP 7
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í?
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).
@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
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;
}
}
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
¿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).