WordPress 4.8.1 utilizza mysql_connect che non funziona con PHP 7


10

Ho appena aggiornato a PHP 7 solo per scoprire che WordPress 4.8.1 (ultima versione) utilizza ancora mysql_connect nel modulo wp-db.php, ma mysql_connect è stato deprecato.

Il seguente codice è tratto da wp-db-php, righe 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);
}

Ecco l'output quando provo a eseguire il mio programma:

Errore irreversibile: errore non rilevato: chiamata alla funzione indefinita mysql_connect () in D: \ ApacheHtdocs \ ConneXions \ wp-Includes \ wp-db.php: 1570
Traccia stack:
# 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} inserito in D: \ ApacheHtdocs \ ConneXions \ wp-Includes \ wp-db. php sulla linea 1570

Non riesco a credere che WordPress affermi che raccomanda PHP 7, ma non funziona con esso. Cosa mi sto perdendo qui?


2
mysql_connectviene utilizzato come fallback solo quando mysqlinon viene rilevato. Sembrerebbe che tu non ne abbia installato mysqlio mysqlinstallato ( mysqliè consigliato, mysqlè obsoleto)
Tom J Nowell

Risposte:


10

Sembra che tu non abbia mysqli installato e / o abilitato sul tuo server. IIRC è mysqlistato aggiunto a php nella versione 5.5 e l' mysqlestensione precedente era stata deprecata e completamente ritirata da allora. Se hai eseguito l'upgrade da una versione PHP molto vecchia, è possibile che tu abbia ancora bisogno del passaggio aggiuntivo di abilitazione mysqli.

(wordpress controlla l'esistenza di mysqlie solo se non esiste prova le mysqlfunzioni precedenti ).


mysql faceva parte di PHP nelle versioni 4 e 5, e rimosso nella versione 7. mysqli è stato introdotto in PHP 5.0.0 e funziona in tutte le versioni di PHP 5 e finora in tutte le versioni di PHP 7. Probabilmente stai pensando che mysql sia stato deprecato in PHP 5.5.0.
CJ Dennis,

@CJDennis, questo è esattamente quello che ho detto riguardo alla deprecazione. Se pensi che ci sia un errore nel mio inglese, sei più che benvenuto a modificare la risposta;)
Mark Kaplun,

Stavo correggendo il tuo pensiero che mysqli fosse stato introdotto in 5.5.0, quando era stato introdotto in 5.0.0.
CJ Dennis,

4

Oltre alla risposta @MarkKaplun, inserisco del codice della classe wpdb:

Ecco come wpdb::use_mysqliviene determinato:

È initalizzato con:

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

e poi nel wpdbcostruttore abbiamo:

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

Quello che dovresti fare per risolvere questo problema è modificare il tuo file php.ini.

corri dove php.ini ho trovato il mio a:

/etc/php/php.ini (anche se non so quale SO stai eseguendo, trova il tuo)

Cerca questi due file:

extension=pdo_mysql.so
extension=mysqli.so

e commentarli. Voila, che avrebbe svolto il lavoro in qualsiasi momento.

Ulteriori letture: https://wiki.archlinux.org/index.php/PHP


2

Stai usando Xamppp 7.x per Windows?

Mi è successo quando ho aggiornato il mio Xampp 5.6 a Xampp 7.1. Ispezionando il file di configurazione C: \ Xampp \ php \ php.ini , ho notato molti errori che coinvolgono il nome delle estensioni PHP (mancano del prefisso php_ e del suffisso .dll). Uno di questi è legato a mysqli.

L'impostazione sbagliata che ho trovato lì:

extension=mysqli

L'impostazione corretta (dopo aver modificato questa riga):

extension=php_mysqli.dll

Correggere ciò ha risolto il mio problema.

A proposito: non dimenticare di correggere tutte le altre impostazioni errate (il nome corretto delle estensioni può essere visto in C: \ xampp \ php \ ext).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.