WordPress 4.8.1 utilizza mysql_connect che non funziona con PHP 7

5 ago 2017, 22:58:36
Visualizzazioni: 18.1K
Voti: 10

Ho appena effettuato l'aggiornamento 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 è stata deprecata.

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:

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

Non riesco a credere che WordPress dica di raccomandare PHP 7, ma non funziona con esso. Cosa mi sfugge?

1
Commenti

mysql_connect viene utilizzato solo come ripiego quando mysqli non viene rilevato. Sembrerebbe che tu non abbia né mysqlimysql installati (si consiglia mysqli, mentre mysql è deprecato).

Tom J Nowell Tom J Nowell
6 ago 2017 00:26:26
Tutte le risposte alla domanda 4
3
10

Sembra che tu non abbia mysqli installato e/o abilitato sul tuo server. Se non ricordo male, mysqli è stato aggiunto a PHP nella versione 5.5, e la vecchia estensione mysql era già deprecata e completamente rimossa da allora. Se hai effettuato l'aggiornamento da una versione molto vecchia di PHP, potrebbe essere necessario un passaggio aggiuntivo per abilitare mysqli.

(WordPress verifica l'esistenza di mysqli e solo se non esiste prova a utilizzare le vecchie funzioni mysql.)

5 ago 2017 23:25:58
Commenti

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

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

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

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

Stavo correggendo il tuo pensiero che mysqli sia stato introdotto in 5.5.0, quando invece è stato introdotto in 5.0.0.

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

In aggiunta alla risposta di @MarkKaplun, pubblico del codice dalla classe wpdb:

Ecco come viene determinato wpdb::use_mysqli:

Viene inizializzato con:

/**
 * Se utilizzare mysqli invece di mysql.
 *
 * @since 3.9.0
 * @access private
 * @var bool
 */
private $use_mysqli = false;

e poi nel costruttore wpdb abbiamo:

/* Usa ext/mysqli se esiste e:
 *  - WP_USE_EXT_MYSQL è definito come false, oppure
 *  - Siamo in una versione di sviluppo di WordPress, oppure
 *  - Stiamo eseguendo PHP 5.5 o superiore, oppure
 *  - ext/mysql non è caricato.
 */
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

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

Esegui dove si trova php.ini Io ho trovato il mio in:

/etc/php/php.ini (anche se non so quale sistema operativo stai utilizzando, trova semplicemente il tuo)

Cerca queste due righe:

extension=pdo_mysql.so
extension=mysqli.so

e rimuovi il commento da esse. Voilà, questo dovrebbe risolvere il problema ogni volta.

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

16 nov 2017 14:39:08
0

Stai utilizzando Xampp 7.x per Windows?

Mi è capitato quando ho aggiornato il mio Xampp 5.6 a Xampp 7.1. Analizzando il file di configurazione C:\Xampp\php\php.ini, ho notato molti errori riguardanti il nome delle estensioni PHP (mancano il prefisso php_ e il suffisso .dll). Uno di questi è relativo a mysqli.

L'impostazione errata che ho trovato:

extension=mysqli

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

extension=php_mysqli.dll

Correggendo questo ho 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).

7 mar 2018 23:44:15