WordPress 4.8.1 folosește mysql_connect care nu funcționează cu PHP 7

5 aug. 2017, 22:58:36
Vizualizări: 18.1K
Voturi: 10

Tocmai am actualizat la PHP 7 doar pentru a descoperi că WordPress 4.8.1 (ultima versiune) încă folosește mysql_connect în modulul wp-db.php, dar mysql_connect a fost depreciat.

Următorul cod este preluat din wp-db-php, rândurile 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);
}

Iată rezultatul când încerc să rulez programul meu:

Eroare fatală: Eroare neprinsă: Apel la funcție nedefinită mysql_connect() în 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} aruncat în D:\ApacheHtdocs\ConneXions\wp-includes\wp-db.php pe linia 1570

Nu pot să cred că WordPress spune că recomandă PHP 7, dar nu funcționează cu el. Ce îmi scapă aici?

1
Comentarii

mysql_connect este folosit doar ca o soluție de rezervă atunci când mysqli nu este detectat. Se pare că nu ai nici mysqli și nici mysql instalate ( mysqli este recomandat, mysql este învechit )

Tom J Nowell Tom J Nowell
6 aug. 2017 00:26:26
Toate răspunsurile la întrebare 4
3
10

Se pare că nu ai mysqli instalat și/sau activat pe serverul tău. Dacă îmi amintesc corect, extensia mysqli a fost adăugată în PHP începând cu versiunea 5.5, iar vechea extensie mysql a fost depreciată și ulterior eliminată. Dacă ai făcut upgrade de la o versiune foarte veche de PHP, este posibil să fie necesar să activezi manual extensia mysqli.

(WordPress verifică existența extensiei mysqli și doar dacă aceasta nu există, încearcă să utilizeze funcțiile mai vechi din mysql.)

5 aug. 2017 23:25:58
Comentarii

mysql a făcut parte din PHP în versiunile 4 și 5, și a fost eliminat în versiunea 7. mysqli a fost introdus în PHP 5.0.0 și funcționează în toate versiunile PHP 5 și până acum în toate versiunile PHP 7. Probabil te gândești că mysql a fost învechit în PHP 5.5.0.

CJ Dennis CJ Dennis
6 aug. 2017 04:24:16

@CJDennis, exact asta am spus și eu referitor la învechire. Dacă crezi că este o greșeală în engleza mea, ești mai mult decât binevenit să editezi răspunsul ;)

Mark Kaplun Mark Kaplun
6 aug. 2017 06:33:10

Corectam ideea ta că mysqli a fost introdus în 5.5.0, când de fapt a fost introdus în 5.0.0.

CJ Dennis CJ Dennis
6 aug. 2017 06:36:29
0

În plus față de răspunsul lui @MarkKaplun, postez niște cod din clasa wpdb:

Iată cum este determinat wpdb::use_mysqli:

Este inițializat cu:

/**
 * Dacă să folosească mysqli în loc de mysql.
 *
 * @since 3.9.0
 * @access private
 * @var bool
 */
private $use_mysqli = false;

și apoi în constructorul wpdb avem:

/* Folosește ext/mysqli dacă există și:
 *  - WP_USE_EXT_MYSQL este definit ca false, sau
 *  - Suntem pe o versiune de dezvoltare a WordPress, sau
 *  - Folosim PHP 5.5 sau mai mare, sau
 *  - ext/mysql nu este încărcat.
 */
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 aug. 2017 23:35:40
0

Ce ar trebui să faci pentru a rezolva această problemă este să editezi fișierul php.ini.

Rulează comanda pentru a afla locația php.ini Eu l-am găsit la:

/etc/php/php.ini (deși nu știu ce sistem de operare folosești, pur și simplu găsește-l pe al tău)

Caută aceste două linii:

extension=pdo_mysql.so
extension=mysqli.so

și decomentează-le. Voilà, asta ar rezolva problema oricând.

Lectură suplimentară: https://wiki.archlinux.org/index.php/PHP

16 nov. 2017 14:39:08
0

Folosești Xampp 7.x pentru Windows?

Mi s-a întâmplat același lucru când am actualizat de la Xampp 5.6 la Xampp 7.1. Inspectând fișierul de configurare C:\Xampp\php\php.ini, am observat multe erori legate de numele extensiilor PHP (lipsește prefixul php_ și sufixul .dll). Una dintre ele este legată de mysqli.

Setarea greșită pe care am găsit-o acolo:

extension=mysqli

Setarea corectă (după editarea acestei linii):

extension=php_mysqli.dll

Corectarea acestei setări mi-a rezolvat problema.

Apropo: nu uita să corectezi și celelalte setări incorecte (numele corect al extensiilor poate fi văzut în directorul C:\xampp\php\ext).

7 mar. 2018 23:44:15