diff --git a/wp-admin/includes/class-wp-debug-data.php b/wp-admin/includes/class-wp-debug-data.php index 39ecd016e8..77b5c3f014 100644 --- a/wp-admin/includes/class-wp-debug-data.php +++ b/wp-admin/includes/class-wp-debug-data.php @@ -855,10 +855,7 @@ class WP_Debug_Data { ); // Populate the database debug fields. - if ( is_resource( $wpdb->dbh ) ) { - // Old mysql extension. - $extension = 'mysql'; - } elseif ( is_object( $wpdb->dbh ) ) { + if ( is_object( $wpdb->dbh ) ) { // mysqli or PDO. $extension = get_class( $wpdb->dbh ); } else { @@ -868,16 +865,7 @@ class WP_Debug_Data { $server = $wpdb->get_var( 'SELECT VERSION()' ); - if ( isset( $wpdb->use_mysqli ) && $wpdb->use_mysqli ) { - $client_version = $wpdb->dbh->client_info; - } else { - // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_client_info,PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved - if ( preg_match( '|[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}|', mysql_get_client_info(), $matches ) ) { - $client_version = $matches[0]; - } else { - $client_version = null; - } - } + $client_version = $wpdb->dbh->client_info; $info['wp-database']['fields']['extension'] = array( 'label' => __( 'Extension' ), diff --git a/wp-admin/includes/class-wp-site-health.php b/wp-admin/includes/class-wp-site-health.php index a0e1de586b..9951c8da25 100644 --- a/wp-admin/includes/class-wp-site-health.php +++ b/wp-admin/includes/class-wp-site-health.php @@ -1356,13 +1356,8 @@ class WP_Site_Health { } } - if ( $wpdb->use_mysqli ) { - // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysqli_get_client_info - $mysql_client_version = mysqli_get_client_info(); - } else { - // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_client_info,PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved - $mysql_client_version = mysql_get_client_info(); - } + // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysqli_get_client_info + $mysql_client_version = mysqli_get_client_info(); /* * libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server. diff --git a/wp-includes/class-wpdb.php b/wp-includes/class-wpdb.php index 4fe5ea5bd4..494778aeae 100644 --- a/wp-includes/class-wpdb.php +++ b/wp-includes/class-wpdb.php @@ -142,16 +142,14 @@ class wpdb { * * Possible values: * - * - For successful SELECT, SHOW, DESCRIBE, or EXPLAIN queries: - * - `mysqli_result` instance when the `mysqli` driver is in use - * - `resource` when the older `mysql` driver is in use + * - `mysqli_result` instance for successful SELECT, SHOW, DESCRIBE, or EXPLAIN queries * - `true` for other query types that were successful * - `null` if a query is yet to be made or if the result has since been flushed * - `false` if the query returned an error * * @since 0.71 * - * @var mysqli_result|resource|bool|null + * @var mysqli_result|bool|null */ protected $result; @@ -604,14 +602,13 @@ class wpdb { * * Possible values: * - * - `mysqli` instance when the `mysqli` driver is in use - * - `resource` when the older `mysql` driver is in use + * - `mysqli` instance during normal operation * - `null` if the connection is yet to be made or has been closed * - `false` if the connection has failed * * @since 0.71 * - * @var mysqli|resource|false|null + * @var mysqli|false|null */ protected $dbh; @@ -693,15 +690,6 @@ class wpdb { */ private $allow_unsafe_unquoted_parameters = true; - /** - * Whether to use mysqli over mysql. Default false. - * - * @since 3.9.0 - * - * @var bool - */ - private $use_mysqli = false; - /** * Whether we've managed to successfully connect at some point. * @@ -751,15 +739,6 @@ class wpdb { $this->show_errors(); } - // Use the `mysqli` extension if it exists unless `WP_USE_EXT_MYSQL` is defined as true. - if ( function_exists( 'mysqli_connect' ) ) { - $this->use_mysqli = true; - - if ( defined( 'WP_USE_EXT_MYSQL' ) ) { - $this->use_mysqli = ! WP_USE_EXT_MYSQL; - } - } - $this->dbuser = $dbuser; $this->dbpassword = $dbpassword; $this->dbname = $dbname; @@ -880,7 +859,7 @@ class wpdb { * } */ public function determine_charset( $charset, $collate ) { - if ( ( $this->use_mysqli && ! ( $this->dbh instanceof mysqli ) ) || empty( $this->dbh ) ) { + if ( ( ! ( $this->dbh instanceof mysqli ) ) || empty( $this->dbh ) ) { return compact( 'charset', 'collate' ); } @@ -915,9 +894,9 @@ class wpdb { * * @since 3.1.0 * - * @param mysqli|resource $dbh The connection returned by `mysqli_connect()` or `mysql_connect()`. - * @param string $charset Optional. The character set. Default null. - * @param string $collate Optional. The collation. Default null. + * @param mysqli $dbh The connection returned by `mysqli_connect()`. + * @param string $charset Optional. The character set. Default null. + * @param string $collate Optional. The collation. Default null. */ public function set_charset( $dbh, $charset = null, $collate = null ) { if ( ! isset( $charset ) ) { @@ -929,29 +908,16 @@ class wpdb { if ( $this->has_cap( 'collation' ) && ! empty( $charset ) ) { $set_charset_succeeded = true; - if ( $this->use_mysqli ) { - if ( function_exists( 'mysqli_set_charset' ) && $this->has_cap( 'set_charset' ) ) { - $set_charset_succeeded = mysqli_set_charset( $dbh, $charset ); - } + if ( function_exists( 'mysqli_set_charset' ) && $this->has_cap( 'set_charset' ) ) { + $set_charset_succeeded = mysqli_set_charset( $dbh, $charset ); + } - if ( $set_charset_succeeded ) { - $query = $this->prepare( 'SET NAMES %s', $charset ); - if ( ! empty( $collate ) ) { - $query .= $this->prepare( ' COLLATE %s', $collate ); - } - mysqli_query( $dbh, $query ); - } - } else { - if ( function_exists( 'mysql_set_charset' ) && $this->has_cap( 'set_charset' ) ) { - $set_charset_succeeded = mysql_set_charset( $charset, $dbh ); - } - if ( $set_charset_succeeded ) { - $query = $this->prepare( 'SET NAMES %s', $charset ); - if ( ! empty( $collate ) ) { - $query .= $this->prepare( ' COLLATE %s', $collate ); - } - mysql_query( $query, $dbh ); + if ( $set_charset_succeeded ) { + $query = $this->prepare( 'SET NAMES %s', $charset ); + if ( ! empty( $collate ) ) { + $query .= $this->prepare( ' COLLATE %s', $collate ); } + mysqli_query( $dbh, $query ); } } } @@ -967,26 +933,20 @@ class wpdb { */ public function set_sql_mode( $modes = array() ) { if ( empty( $modes ) ) { - if ( $this->use_mysqli ) { - $res = mysqli_query( $this->dbh, 'SELECT @@SESSION.sql_mode' ); - } else { - $res = mysql_query( 'SELECT @@SESSION.sql_mode', $this->dbh ); - } + $res = mysqli_query( $this->dbh, 'SELECT @@SESSION.sql_mode' ); if ( empty( $res ) ) { return; } - if ( $this->use_mysqli ) { - $modes_array = mysqli_fetch_array( $res ); - if ( empty( $modes_array[0] ) ) { - return; - } - $modes_str = $modes_array[0]; - } else { - $modes_str = mysql_result( $res, 0 ); + $modes_array = mysqli_fetch_array( $res ); + + if ( empty( $modes_array[0] ) ) { + return; } + $modes_str = $modes_array[0]; + if ( empty( $modes_str ) ) { return; } @@ -1013,11 +973,7 @@ class wpdb { $modes_str = implode( ',', $modes ); - if ( $this->use_mysqli ) { - mysqli_query( $this->dbh, "SET SESSION sql_mode='$modes_str'" ); - } else { - mysql_query( "SET SESSION sql_mode='$modes_str'", $this->dbh ); - } + mysqli_query( $this->dbh, "SET SESSION sql_mode='$modes_str'" ); } /** @@ -1220,20 +1176,17 @@ class wpdb { * * @since 0.71 * - * @param string $db Database name. - * @param mysqli|resource $dbh Optional. Database connection. - * Defaults to the current database handle. + * @param string $db Database name. + * @param mysqli $dbh Optional. Database connection. + * Defaults to the current database handle. */ public function select( $db, $dbh = null ) { if ( is_null( $dbh ) ) { $dbh = $this->dbh; } - if ( $this->use_mysqli ) { - $success = mysqli_select_db( $dbh, $db ); - } else { - $success = mysql_select_db( $db, $dbh ); - } + $success = mysqli_select_db( $dbh, $db ); + if ( ! $success ) { $this->ready = false; if ( ! did_action( 'template_redirect' ) ) { @@ -1297,12 +1250,11 @@ class wpdb { } /** - * Real escape, using mysqli_real_escape_string() or mysql_real_escape_string(). + * Real escape using mysqli_real_escape_string(). * * @since 2.8.0 * * @see mysqli_real_escape_string() - * @see mysql_real_escape_string() * * @param string $data String to escape. * @return string Escaped string. @@ -1313,11 +1265,7 @@ class wpdb { } if ( $this->dbh ) { - if ( $this->use_mysqli ) { - $escaped = mysqli_real_escape_string( $this->dbh, $data ); - } else { - $escaped = mysql_real_escape_string( $data, $this->dbh ); - } + $escaped = mysqli_real_escape_string( $this->dbh, $data ); } else { $class = get_class( $this ); @@ -1836,12 +1784,9 @@ class wpdb { global $EZSQL_ERROR; if ( ! $str ) { - if ( $this->use_mysqli ) { - $str = mysqli_error( $this->dbh ); - } else { - $str = mysql_error( $this->dbh ); - } + $str = mysqli_error( $this->dbh ); } + $EZSQL_ERROR[] = array( 'query' => $this->last_query, 'error_str' => $str, @@ -1963,7 +1908,7 @@ class wpdb { $this->num_rows = 0; $this->last_error = ''; - if ( $this->use_mysqli && $this->result instanceof mysqli_result ) { + if ( $this->result instanceof mysqli_result ) { mysqli_free_result( $this->result ); $this->result = null; @@ -1976,8 +1921,6 @@ class wpdb { while ( mysqli_more_results( $this->dbh ) ) { mysqli_next_result( $this->dbh ); } - } elseif ( is_resource( $this->result ) ) { - mysql_free_result( $this->result ); } } @@ -1995,80 +1938,45 @@ class wpdb { public function db_connect( $allow_bail = true ) { $this->is_mysql = true; - /* - * Deprecated in 3.9+ when using MySQLi. No equivalent - * $new_link parameter exists for mysqli_* functions. - */ - $new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true; $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0; - if ( $this->use_mysqli ) { - /* - * Set the MySQLi error reporting off because WordPress handles its own. - * This is due to the default value change from `MYSQLI_REPORT_OFF` - * to `MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT` in PHP 8.1. - */ - mysqli_report( MYSQLI_REPORT_OFF ); + /* + * Set the MySQLi error reporting off because WordPress handles its own. + * This is due to the default value change from `MYSQLI_REPORT_OFF` + * to `MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT` in PHP 8.1. + */ + mysqli_report( MYSQLI_REPORT_OFF ); - $this->dbh = mysqli_init(); + $this->dbh = mysqli_init(); - $host = $this->dbhost; - $port = null; - $socket = null; - $is_ipv6 = false; + $host = $this->dbhost; + $port = null; + $socket = null; + $is_ipv6 = false; - $host_data = $this->parse_db_host( $this->dbhost ); - if ( $host_data ) { - list( $host, $port, $socket, $is_ipv6 ) = $host_data; - } + $host_data = $this->parse_db_host( $this->dbhost ); + if ( $host_data ) { + list( $host, $port, $socket, $is_ipv6 ) = $host_data; + } - /* - * If using the `mysqlnd` library, the IPv6 address needs to be enclosed - * in square brackets, whereas it doesn't while using the `libmysqlclient` library. - * @see https://bugs.php.net/bug.php?id=67563 - */ - if ( $is_ipv6 && extension_loaded( 'mysqlnd' ) ) { - $host = "[$host]"; - } + /* + * If using the `mysqlnd` library, the IPv6 address needs to be enclosed + * in square brackets, whereas it doesn't while using the `libmysqlclient` library. + * @see https://bugs.php.net/bug.php?id=67563 + */ + if ( $is_ipv6 && extension_loaded( 'mysqlnd' ) ) { + $host = "[$host]"; + } - if ( WP_DEBUG ) { - mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags ); - } else { - // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged - @mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags ); - } - - if ( $this->dbh->connect_errno ) { - $this->dbh = null; - - /* - * It's possible ext/mysqli is misconfigured. Fall back to ext/mysql if: - * - We haven't previously connected, and - * - WP_USE_EXT_MYSQL isn't set to false, and - * - ext/mysql is loaded. - */ - $attempt_fallback = true; - - if ( $this->has_connected ) { - $attempt_fallback = false; - } elseif ( defined( 'WP_USE_EXT_MYSQL' ) && ! WP_USE_EXT_MYSQL ) { - $attempt_fallback = false; - } elseif ( ! function_exists( 'mysql_connect' ) ) { - $attempt_fallback = false; - } - - if ( $attempt_fallback ) { - $this->use_mysqli = false; - return $this->db_connect( $allow_bail ); - } - } + if ( WP_DEBUG ) { + mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags ); } else { - if ( WP_DEBUG ) { - $this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags ); - } else { - // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged - $this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags ); - } + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged + @mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags ); + } + + if ( $this->dbh->connect_errno ) { + $this->dbh = null; } if ( ! $this->dbh && $allow_bail ) { @@ -2196,14 +2104,8 @@ class wpdb { * @return bool|void True if the connection is up. */ public function check_connection( $allow_bail = true ) { - if ( $this->use_mysqli ) { - if ( ! empty( $this->dbh ) && mysqli_ping( $this->dbh ) ) { - return true; - } - } else { - if ( ! empty( $this->dbh ) && mysql_ping( $this->dbh ) ) { - return true; - } + if ( ! empty( $this->dbh ) && mysqli_ping( $this->dbh ) ) { + return true; } $error_reporting = false; @@ -2347,24 +2249,15 @@ class wpdb { // Database server has gone away, try to reconnect. $mysql_errno = 0; - if ( ! empty( $this->dbh ) ) { - if ( $this->use_mysqli ) { - if ( $this->dbh instanceof mysqli ) { - $mysql_errno = mysqli_errno( $this->dbh ); - } else { - /* - * $dbh is defined, but isn't a real connection. - * Something has gone horribly wrong, let's try a reconnect. - */ - $mysql_errno = 2006; - } - } else { - if ( is_resource( $this->dbh ) ) { - $mysql_errno = mysql_errno( $this->dbh ); - } else { - $mysql_errno = 2006; - } - } + + if ( $this->dbh instanceof mysqli ) { + $mysql_errno = mysqli_errno( $this->dbh ); + } else { + /* + * $dbh is defined, but isn't a real connection. + * Something has gone horribly wrong, let's try a reconnect. + */ + $mysql_errno = 2006; } if ( empty( $this->dbh ) || 2006 === $mysql_errno ) { @@ -2377,18 +2270,10 @@ class wpdb { } // If there is an error then take note of it. - if ( $this->use_mysqli ) { - if ( $this->dbh instanceof mysqli ) { - $this->last_error = mysqli_error( $this->dbh ); - } else { - $this->last_error = __( 'Unable to retrieve the error message from MySQL' ); - } + if ( $this->dbh instanceof mysqli ) { + $this->last_error = mysqli_error( $this->dbh ); } else { - if ( is_resource( $this->dbh ) ) { - $this->last_error = mysql_error( $this->dbh ); - } else { - $this->last_error = __( 'Unable to retrieve the error message from MySQL' ); - } + $this->last_error = __( 'Unable to retrieve the error message from MySQL' ); } if ( $this->last_error ) { @@ -2404,33 +2289,23 @@ class wpdb { if ( preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) { $return_val = $this->result; } elseif ( preg_match( '/^\s*(insert|delete|update|replace)\s/i', $query ) ) { - if ( $this->use_mysqli ) { - $this->rows_affected = mysqli_affected_rows( $this->dbh ); - } else { - $this->rows_affected = mysql_affected_rows( $this->dbh ); - } + $this->rows_affected = mysqli_affected_rows( $this->dbh ); + // Take note of the insert_id. if ( preg_match( '/^\s*(insert|replace)\s/i', $query ) ) { - if ( $this->use_mysqli ) { - $this->insert_id = mysqli_insert_id( $this->dbh ); - } else { - $this->insert_id = mysql_insert_id( $this->dbh ); - } + $this->insert_id = mysqli_insert_id( $this->dbh ); } + // Return number of rows affected. $return_val = $this->rows_affected; } else { $num_rows = 0; - if ( $this->use_mysqli && $this->result instanceof mysqli_result ) { + + if ( $this->result instanceof mysqli_result ) { while ( $row = mysqli_fetch_object( $this->result ) ) { $this->last_result[ $num_rows ] = $row; $num_rows++; } - } elseif ( is_resource( $this->result ) ) { - while ( $row = mysql_fetch_object( $this->result ) ) { - $this->last_result[ $num_rows ] = $row; - $num_rows++; - } } // Log and return the number of rows selected. @@ -2442,7 +2317,7 @@ class wpdb { } /** - * Internal function to perform the mysql_query() call. + * Internal function to perform the mysqli_query() call. * * @since 3.9.0 * @@ -2455,11 +2330,10 @@ class wpdb { $this->timer_start(); } - if ( ! empty( $this->dbh ) && $this->use_mysqli ) { + if ( ! empty( $this->dbh ) ) { $this->result = mysqli_query( $this->dbh, $query ); - } elseif ( ! empty( $this->dbh ) ) { - $this->result = mysql_query( $query, $this->dbh ); } + $this->num_queries++; if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) { @@ -3636,11 +3510,7 @@ class wpdb { if ( $this->charset ) { $connection_charset = $this->charset; } else { - if ( $this->use_mysqli ) { - $connection_charset = mysqli_character_set_name( $this->dbh ); - } else { - $connection_charset = mysql_client_encoding(); - } + $connection_charset = mysqli_character_set_name( $this->dbh ); } if ( is_array( $value['length'] ) ) { @@ -3850,16 +3720,10 @@ class wpdb { return; } - if ( $this->use_mysqli ) { - $num_fields = mysqli_num_fields( $this->result ); - for ( $i = 0; $i < $num_fields; $i++ ) { - $this->col_info[ $i ] = mysqli_fetch_field( $this->result ); - } - } else { - $num_fields = mysql_num_fields( $this->result ); - for ( $i = 0; $i < $num_fields; $i++ ) { - $this->col_info[ $i ] = mysql_fetch_field( $this->result, $i ); - } + $num_fields = mysqli_num_fields( $this->result ); + + for ( $i = 0; $i < $num_fields; $i++ ) { + $this->col_info[ $i ] = mysqli_fetch_field( $this->result ); } } @@ -3932,18 +3796,10 @@ class wpdb { if ( $this->show_errors ) { $error = ''; - if ( $this->use_mysqli ) { - if ( $this->dbh instanceof mysqli ) { - $error = mysqli_error( $this->dbh ); - } elseif ( mysqli_connect_errno() ) { - $error = mysqli_connect_error(); - } - } else { - if ( is_resource( $this->dbh ) ) { - $error = mysql_error( $this->dbh ); - } else { - $error = mysql_error(); - } + if ( $this->dbh instanceof mysqli ) { + $error = mysqli_error( $this->dbh ); + } elseif ( mysqli_connect_errno() ) { + $error = mysqli_connect_error(); } if ( $error ) { @@ -3975,11 +3831,7 @@ class wpdb { return false; } - if ( $this->use_mysqli ) { - $closed = mysqli_close( $this->dbh ); - } else { - $closed = mysql_close( $this->dbh ); - } + $closed = mysqli_close( $this->dbh ); if ( $closed ) { $this->dbh = null; @@ -4098,11 +3950,8 @@ class wpdb { if ( version_compare( $db_version, '5.5.3', '<' ) ) { return false; } - if ( $this->use_mysqli ) { - $client_version = mysqli_get_client_info(); - } else { - $client_version = mysql_get_client_info(); - } + + $client_version = mysqli_get_client_info(); /* * libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server. @@ -4154,19 +4003,13 @@ class wpdb { } /** - * Retrieves full database server information. + * Returns the version of the MySQL server. * * @since 5.5.0 * - * @return string|false Server info on success, false on failure. + * @return string Server version as a string. */ public function db_server_info() { - if ( $this->use_mysqli ) { - $server_info = mysqli_get_server_info( $this->dbh ); - } else { - $server_info = mysql_get_server_info( $this->dbh ); - } - - return $server_info; + return mysqli_get_server_info( $this->dbh ); } } diff --git a/wp-includes/load.php b/wp-includes/load.php index 9324eed562..3db556583c 100644 --- a/wp-includes/load.php +++ b/wp-includes/load.php @@ -134,7 +134,7 @@ function wp_populate_basic_auth_from_authorization_header() { } /** - * Checks for the required PHP version, and the MySQL extension or + * Checks for the required PHP version, and the mysqli extension or * a database drop-in. * * Dies if requirements are not met. @@ -166,7 +166,7 @@ function wp_check_php_mysql_versions() { // This runs before default constants are defined, so we can't assume WP_CONTENT_DIR is set yet. $wp_content_dir = defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR : ABSPATH . 'wp-content'; - if ( ! function_exists( 'mysqli_connect' ) && ! function_exists( 'mysql_connect' ) + if ( ! function_exists( 'mysqli_connect' ) && ! file_exists( $wp_content_dir . '/db.php' ) ) { require_once ABSPATH . WPINC . '/functions.php'; diff --git a/wp-includes/version.php b/wp-includes/version.php index 85194b7cd8..93e039e35c 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.4-alpha-56474'; +$wp_version = '6.4-alpha-56475'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.