WordPress 4.8.1 menggunakan mysql_connect yang tidak berfungsi dengan PHP 7

10

Saya baru saja memutakhirkan ke PHP 7 hanya untuk menemukan bahwa WordPress 4.8.1 (versi terbaru) masih menggunakan mysql_connect di modul wp-db.php, tetapi mysql_connect telah ditinggalkan.

Kode berikut diambil dari wp-db-php, baris 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);
}

Ini adalah output ketika saya mencoba menjalankan program saya:

Kesalahan fatal: Kesalahan Tidak Tertangkap: Panggil ke fungsi mysql_connect () yang tidak terdefinisi di D: \ ApacheHtdocs \ ConneXions \ wp-include \ wp-db.php: 1570
Jejak tumpukan:
# 0 D: \ ApacheHtdocs \ ConneXions \ wp-include \ wp- termasuk \ wp- db.php (658): wpdb-> db_connect ()
# 1 D: \ ApacheHtdocs \ ConneXions \ wp-include \ 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): memerlukan ('D: \ ApacheHtdocs ...')
# 7 {main} dilemparkan ke D: \ ApacheHtdocs \ ConneXions \ wp-termasuk \ wp-db. php on line 1570

Saya tidak percaya bahwa WordPress mengatakan merekomendasikan PHP 7, tetapi tidak berhasil. Apa yang kulewatkan di sini?

Bob Jones
sumber
2
mysql_connecthanya digunakan sebagai cadangan jika mysqlitidak terdeteksi. Tampaknya Anda belum menginstal mysqliatau mysqlmenginstalnya ( mysqlidisarankan, mysqlsudah tidak digunakan lagi)
Tom J Nowell

Jawaban:

10

Sepertinya Anda tidak menginstal mysqli dan / atau mengaktifkan server Anda. IIRC mysqliditambahkan ke php dalam versi 5.5, dan mysqlekstensi yang lebih lama telah ditinggalkan dan sepenuhnya pensiun sejak saat itu. Jika Anda memutakhirkan dari versi PHP yang sangat lama, mungkin Anda masih memerlukan langkah tambahan untuk mengaktifkannya mysqli.

(Wordpress memeriksa keberadaan mysqlidan hanya jika tidak ada, coba mysqlfungsi yang lebih lama .)

Mark Kaplun
sumber
mysql adalah bagian dari PHP di versi 4 & 5, dan dihapus di versi 7. mysqli diperkenalkan di PHP 5.0.0 dan bekerja di semua versi PHP 5 dan sejauh ini di semua versi PHP 7. Anda mungkin berpikir bahwa mysql sudah tidak digunakan lagi di PHP 5.5.0.
CJ Dennis
@ CJDennis, itu adalah persis apa yang saya katakan tentang penghinaan. Jika Anda berpikir ada kesalahan dalam bahasa Inggris saya, Anda lebih dari cukup untuk mengedit jawabannya;)
Mark Kaplun
Saya mengoreksi pemikiran Anda bahwa mysqli diperkenalkan di 5.5.0, ketika diperkenalkan di 5.0.0.
CJ Dennis
4

Selain jawaban @MarkKaplun, saya memposting beberapa kode dari kelas wpdb:

Begini caranya wpdb::use_mysqliditentukan:

Ini diresmikan dengan:

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

dan kemudian di wpdbkonstruktor yang kita miliki:

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

Apa yang harus Anda lakukan untuk mengatasi masalah ini, adalah mengedit file php.ini Anda.

jalankan di mana php.ini saya menemukan milik saya di:

/etc/php/php.ini (walaupun saya tidak tahu OS apa yang Anda jalankan dengan mudah, temukan milik Anda)

Cari dua file ini:

extension=pdo_mysql.so
extension=mysqli.so

dan menghapus komentar mereka. Voila, itu akan menyelesaikan pekerjaan kapan saja.

Bacaan lebih lanjut: https://wiki.archlinux.org/index.php/PHP

Lawrence Oputa
sumber
2

Apakah Anda menggunakan Xamppp 7.x untuk Windows?

Itu terjadi pada saya ketika saya memutakhirkan Xampp 5.6 saya ke Xampp 7.1. Memeriksa file konfigurasi C: \ Xampp \ php \ php.ini , saya melihat banyak kesalahan yang melibatkan nama ekstensi PHP (mereka tidak memiliki awalan php_ dan akhiran .dll). Salah satunya terkait dengan mysqli.

Pengaturan yang salah saya temukan di sana:

extension=mysqli

Pengaturan yang tepat (setelah mengedit baris ini):

extension=php_mysqli.dll

Mengoreksi itu memecahkan masalah saya.

Omong-omong: jangan lupa untuk memperbaiki semua pengaturan yang salah lainnya (nama ekstensi yang benar dapat dilihat di C: \ xampp \ php \ ext).

aldemarcalazans
sumber