WordPress 4.8.1 utilise mysql_connect qui ne fonctionne pas avec PHP 7

10

Je viens de passer à PHP 7 uniquement pour constater que WordPress 4.8.1 (dernière version) utilise toujours mysql_connect dans le module wp-db.php, mais mysql_connect a été déconseillé.

Le code suivant est tiré de wp-db-php, lignes 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);
}

Voici la sortie lorsque j'essaie d'exécuter mon programme:

Erreur fatale: erreur non détectée: appel à la fonction non définie mysql_connect () dans D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp-db.php: 1570
Trace de pile:
# 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} jeté dans D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp-db. php en ligne 1570

Je ne peux pas croire que WordPress dit qu'il recommande PHP 7, mais cela ne fonctionne pas avec lui. Qu'est-ce que j'oublie ici?

Bob Jones
la source
2
mysql_connectest uniquement utilisé comme solution de secours lorsqu'il mysqlin'est pas détecté. Il semblerait que vous n'ayez ni installé mysqlini mysqlinstallé ( mysqliest recommandé, mysqldéconseillé)
Tom J Nowell

Réponses:

10

Cela semble que vous n'avez pas installé et / ou activé mysqli sur votre serveur. IIRC a mysqliété ajouté à php dans la version 5.5, et l'ancienne mysqlextension a été déconseillée et entièrement retirée depuis lors. Si vous avez effectué une mise à niveau à partir d'une très ancienne version de PHP, il se peut que vous ayez encore besoin de l'étape supplémentaire d'activation mysqli.

(wordpress vérifie l'existence de mysqliet seulement s'il n'existe pas essaie les anciennes mysqlfonctions.)

Mark Kaplun
la source
mysql faisait partie de PHP dans les versions 4 et 5, et a été supprimé dans la version 7. mysqli a été introduit dans PHP 5.0.0 et fonctionne dans toutes les versions de PHP 5 et jusqu'à présent dans toutes les versions de PHP 7. Vous pensez probablement que mysql a été déprécié en PHP 5.5.0.
CJ Dennis
@CJDennis, c'est exactement ce que j'ai dit concernant la dépréciation. Si vous pensez qu'il y a une erreur dans mon anglais, vous êtes plus que bienvenus pour éditer la réponse;)
Mark Kaplun
Je corrigeais votre pensée que mysqli a été introduit dans 5.5.0, quand il a été introduit dans 5.0.0.
CJ Dennis
4

En plus de la réponse @MarkKaplun, je poste du code de la classe wpdb:

Voici comment le wpdb::use_mysqliest déterminé:

Il est initalisé avec:

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

puis dans le wpdbconstructeur nous avons:

/* 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
la source
2

Ce que vous devez faire pour résoudre ce problème, c'est d'éditer votre fichier php.ini.

courir où est-ce que php.ini j'ai trouvé le mien à:

/etc/php/php.ini (même si je ne sais pas quel système d'exploitation vous utilisez, trouvez le vôtre)

Recherchez ces deux fichiers:

extension=pdo_mysql.so
extension=mysqli.so

et décommentez-les. Voila, cela ferait le travail à tout moment.

Pour en savoir plus: https://wiki.archlinux.org/index.php/PHP

Lawrence Oputa
la source
2

Utilisez-vous Xamppp 7.x pour Windows?

Cela m'est arrivé lorsque j'ai mis à niveau mon Xampp 5.6 vers Xampp 7.1. En inspectant le fichier de configuration C: \ Xampp \ php \ php.ini , j'ai remarqué beaucoup d'erreurs impliquant le nom des extensions PHP (il leur manque le préfixe php_ et le suffixe .dll). L'un d'eux est lié à mysqli.

Le mauvais réglage que j'ai trouvé là-bas:

extension=mysqli

Le bon réglage (après avoir édité cette ligne):

extension=php_mysqli.dll

La correction a résolu mon problème.

Soit dit en passant: n'oubliez pas de corriger tous les autres paramètres incorrects (le nom correct des extensions peut être vu dans C: \ xampp \ php \ ext).

aldemarcalazans
la source