WordPress 4.8.1 verwendet mysql_connect, was mit PHP 7 nicht funktioniert

9

Ich habe gerade ein Upgrade auf PHP 7 durchgeführt, nur um festzustellen, dass WordPress 4.8.1 (neueste Version) immer noch mysql_connect im Modul wp-db.php verwendet, aber mysql_connect ist veraltet.

Der folgende Code stammt aus wp-db-php, Zeilen 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);
}

Hier ist die Ausgabe, wenn ich versuche, mein Programm auszuführen:

Schwerwiegender Fehler: Nicht erfasster Fehler: Aufruf der undefinierten Funktion mysql_connect () in D: \ ApacheHtdocs \ ConneXions \ wp-Includes \ wp-db.php: 1570 Stapelverfolgung
:
# 0 D: \ ApacheHtdocs \ ConneXions \ wp-Includes \ wp- db.php (658): wpdb-> db_connect ()
# 1 D: \ ApacheHtdocs \ ConneXions \ wp-Includes \ load.php (404): wpdb -> __ Konstrukt ('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} wird in D: \ ApacheHtdocs \ ConneXions \ wp-includes \ wp-db ausgelöst. PHP auf Linie 1570

Ich kann nicht glauben, dass WordPress sagt, dass es PHP 7 empfiehlt, aber es funktioniert nicht damit. Was fehlt mir hier?

Bob Jones
quelle
2
mysql_connectwird nur als Fallback verwendet, wenn mysqlies nicht erkannt wird. Es scheint, Sie haben keine mysqlioder mysqlinstalliert ( mysqliwird empfohlen, mysqlist veraltet)
Tom J Nowell

Antworten:

9

Dies klingt so, als ob Sie mysqli nicht auf Ihrem Server installiert und / oder aktiviert haben. IIRC mysqliwurde in Version 5.5 zu PHP hinzugefügt, und die ältere mysqlErweiterung war seitdem veraltet und vollständig eingestellt. Wenn Sie ein Upgrade von einer sehr alten PHP-Version durchgeführt haben, müssen Sie möglicherweise noch den zusätzlichen Schritt zum Aktivieren ausführen mysqli.

(WordPress prüft, mysqliob und nur wenn es nicht existiert, versucht es mit den älteren mysqlFunktionen.)

Mark Kaplun
quelle
mysql war Teil von PHP in den Versionen 4 und 5 und wurde in Version 7 entfernt. mysqli wurde in PHP 5.0.0 eingeführt und funktioniert in allen PHP 5-Versionen und bisher in allen PHP 7-Versionen. Sie denken wahrscheinlich, dass MySQL in PHP 5.5.0 veraltet war.
CJ Dennis
@ CJDennis, das ist genau das, was ich über die Abwertung gesagt habe. Wenn Sie denken, dass es einen Fehler in meinem Englisch gibt, können Sie die Antwort gerne bearbeiten;)
Mark Kaplun
Ich habe Ihren Gedanken korrigiert, dass mysqli in 5.5.0 eingeführt wurde, als es in 5.0.0 eingeführt wurde.
CJ Dennis
4

Zusätzlich zur Antwort von @MarkKaplun poste ich einen Code aus der wpdb-Klasse:

So wpdb::use_mysqliwird das bestimmt:

Es ist initialisiert mit:

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

und dann wpdbhaben wir im Konstruktor:

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

Um dieses Problem zu lösen, müssen Sie Ihre Datei php.ini bearbeiten.

lauf wo php.ini ich meine gefunden habe bei:

/etc/php/php.ini (obwohl ich nicht weiß, welches Betriebssystem Sie verwenden, finden Sie einfach Ihr)

Suchen Sie nach diesen beiden Dateien:

extension=pdo_mysql.so
extension=mysqli.so

und kommentiere sie aus. Voila, das würde den Job jederzeit erledigen.

Weiterführende Literatur: https://wiki.archlinux.org/index.php/PHP

Lawrence Oputa
quelle
2

Verwenden Sie Xamppp 7.x für Windows?

Es ist mir passiert, als ich mein Xampp 5.6 auf Xampp 7.1 aktualisiert habe. Bei der Überprüfung der Konfigurationsdatei C: \ Xampp \ php \ php.ini sind mir viele Fehler beim Namen der PHP-Erweiterungen aufgefallen (ihnen fehlen das Präfix php_ und das Suffix .dll). Einer von ihnen ist mit Mysqli verwandt.

Die falsche Einstellung habe ich dort gefunden:

extension=mysqli

Die richtige Einstellung (nach dem Bearbeiten dieser Zeile):

extension=php_mysqli.dll

Das zu beheben löste mein Problem.

Übrigens: Vergessen Sie nicht, alle anderen falschen Einstellungen zu korrigieren (der korrekte Name der Erweiterungen ist unter C: \ xampp \ php \ ext zu sehen).

Aldemarcalazane
quelle