]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-includes/wp-db.php
WordPress 4.2.1
[autoinstalls/wordpress.git] / wp-includes / wp-db.php
index 6eb0c75dc173d345d7e5cb8d5bd05285a90e875a..0bd7a1882bff96055cb13debfc65e45fe301248a 100644 (file)
@@ -43,7 +43,7 @@ define( 'ARRAY_N', 'ARRAY_N' );
  * file to your class. The wpdb class will still be included,
  * so you can extend it or simply use your own.
  *
- * @link http://codex.wordpress.org/Function_Reference/wpdb_Class
+ * @link https://codex.wordpress.org/Function_Reference/wpdb_Class
  *
  * @package WordPress
  * @subpackage Database
@@ -240,7 +240,7 @@ class wpdb {
        var $ready = false;
 
        /**
-        * {@internal Missing Description}}
+        * Blog ID.
         *
         * @since 3.0.0
         * @access public
@@ -249,7 +249,7 @@ class wpdb {
        public $blogid = 0;
 
        /**
-        * {@internal Missing Description}}
+        * Site ID.
         *
         * @since 3.0.0
         * @access public
@@ -634,8 +634,6 @@ class wpdb {
                        }
                }
 
-               $this->init_charset();
-
                $this->dbuser = $dbuser;
                $this->dbpassword = $dbpassword;
                $this->dbname = $dbname;
@@ -727,16 +725,31 @@ class wpdb {
        public function init_charset() {
                if ( function_exists('is_multisite') && is_multisite() ) {
                        $this->charset = 'utf8';
-                       if ( defined( 'DB_COLLATE' ) && DB_COLLATE )
+                       if ( defined( 'DB_COLLATE' ) && DB_COLLATE ) {
                                $this->collate = DB_COLLATE;
-                       else
+                       } else {
                                $this->collate = 'utf8_general_ci';
+                       }
                } elseif ( defined( 'DB_COLLATE' ) ) {
                        $this->collate = DB_COLLATE;
                }
 
-               if ( defined( 'DB_CHARSET' ) )
+               if ( defined( 'DB_CHARSET' ) ) {
                        $this->charset = DB_CHARSET;
+               }
+
+               if ( ( $this->use_mysqli && ! ( $this->dbh instanceof mysqli ) )
+                 || ( empty( $this->dbh ) || ! ( $this->dbh instanceof mysqli ) ) ) {
+                       return;
+               }
+
+               if ( 'utf8' === $this->charset && $this->has_cap( 'utf8mb4' ) ) {
+                       $this->charset = 'utf8mb4';
+               }
+
+               if ( 'utf8mb4' === $this->charset && ( ! $this->collate || stripos( $this->collate, 'utf8_' ) === 0 ) ) {
+                       $this->collate = 'utf8mb4_unicode_ci';
+               }
        }
 
        /**
@@ -1376,7 +1389,7 @@ class wpdb {
                        while ( mysqli_more_results( $this->dbh ) ) {
                                mysqli_next_result( $this->dbh );
                        }
-               } else if ( is_resource( $this->result ) ) {
+               } elseif ( is_resource( $this->result ) ) {
                        mysql_free_result( $this->result );
                }
        }
@@ -1445,9 +1458,9 @@ class wpdb {
 
                                if ( $this->has_connected ) {
                                        $attempt_fallback = false;
-                               } else if ( defined( 'WP_USE_EXT_MYSQL' ) && ! WP_USE_EXT_MYSQL ) {
+                               } elseif ( defined( 'WP_USE_EXT_MYSQL' ) && ! WP_USE_EXT_MYSQL ) {
                                        $attempt_fallback = false;
-                               } else if ( ! function_exists( 'mysql_connect' ) ) {
+                               } elseif ( ! function_exists( 'mysql_connect' ) ) {
                                        $attempt_fallback = false;
                                }
 
@@ -1485,11 +1498,17 @@ class wpdb {
 " ), htmlspecialchars( $this->dbhost, ENT_QUOTES ) ), 'db_connect_fail' );
 
                        return false;
-               } else if ( $this->dbh ) {
+               } elseif ( $this->dbh ) {
+                       if ( ! $this->has_connected ) {
+                               $this->init_charset();
+                       }
+
                        $this->has_connected = true;
+
                        $this->set_charset( $this->dbh );
-                       $this->set_sql_mode();
+
                        $this->ready = true;
+                       $this->set_sql_mode();
                        $this->select( $this->dbname, $this->dbh );
 
                        return true;
@@ -1620,6 +1639,7 @@ class wpdb {
                }
 
                $this->check_current_query = true;
+
                // Keep track of the last query for debug..
                $this->last_query = $query;
 
@@ -1685,7 +1705,7 @@ class wpdb {
                                        $this->last_result[$num_rows] = $row;
                                        $num_rows++;
                                }
-                       } else if ( is_resource( $this->result ) ) {
+                       } elseif ( is_resource( $this->result ) ) {
                                while ( $row = @mysql_fetch_object( $this->result ) ) {
                                        $this->last_result[$num_rows] = $row;
                                        $num_rows++;
@@ -1986,12 +2006,12 @@ class wpdb {
 
        /**
         * Adds field charsets to field/value/format arrays generated by
-        * the {@see wpdb::process_field_formats()} method.
+        * the wpdb::process_field_formats() method.
         *
         * @since 4.2.0
         * @access protected
         *
-        * @param array  $data  As it comes from the {@see wpdb::process_field_formats()} method.
+        * @param array  $data  As it comes from the wpdb::process_field_formats() method.
         * @param string $table Table name.
         * @return The same array as $data with additional 'charset' keys.
         */
@@ -2044,7 +2064,7 @@ class wpdb {
                                }
                        }
 
-                       if ( false !== $value['length'] && strlen( $value['value'] ) > $value['length'] ) {
+                       if ( false !== $value['length'] && mb_strlen( $value['value'] ) > $value['length'] ) {
                                return false;
                        }
 
@@ -2229,7 +2249,7 @@ class wpdb {
         * @access protected
         *
         * @param string $table Table name.
-        * @return string|WP_Error Table character set, {@see WP_Error} object if it couldn't be found.
+        * @return string|WP_Error Table character set, WP_Error object if it couldn't be found.
         */
        protected function get_table_charset( $table ) {
                $tablekey = strtolower( $table );
@@ -2269,6 +2289,12 @@ class wpdb {
                foreach ( $columns as $column ) {
                        if ( ! empty( $column->Collation ) ) {
                                list( $charset ) = explode( '_', $column->Collation );
+
+                               // If the current connection can't support utf8mb4 characters, let's only send 3-byte utf8 characters.
+                               if ( 'utf8mb4' === $charset && ! $this->has_cap( 'utf8mb4' ) ) {
+                                       $charset = 'utf8';
+                               }
+
                                $charsets[ strtolower( $charset ) ] = true;
                        }
 
@@ -2323,7 +2349,7 @@ class wpdb {
         * @param string $table  Table name.
         * @param string $column Column name.
         * @return mixed Column character set as a string. False if the column has no
-        *               character set. {@see WP_Error} object if there was an error.
+        *               character set. WP_Error object if there was an error.
         */
        public function get_col_charset( $table, $column ) {
                $tablekey = strtolower( $table );
@@ -2543,9 +2569,8 @@ class wpdb {
         * @return array|WP_Error The $data parameter, with invalid characters removed from
         *                        each value. This works as a passthrough: any additional keys
         *                        such as 'field' are retained in each value array. If we cannot
-        *                        remove invalid characters, a {@see WP_Error} object is returned.
+        *                        remove invalid characters, a WP_Error object is returned.
         */
-               // If any of the columns don't have one of these collations, it needs more sanity checking.
        protected function strip_invalid_text( $data ) {
                // Some multibyte character sets that we can check in PHP.
                $mb_charsets = array(
@@ -2678,7 +2703,7 @@ class wpdb {
         * @access protected
         *
         * @param string $query Query to convert.
-        * @return string|WP_Error The converted query, or a {@see WP_Error} object if the conversion fails.
+        * @return string|WP_Error The converted query, or a WP_Error object if the conversion fails.
         */
        protected function strip_invalid_text_from_query( $query ) {
                $table = $this->get_table_from_query( $query );
@@ -2719,7 +2744,7 @@ class wpdb {
         * @param string $table  Table name.
         * @param string $column Column name.
         * @param string $value  The text to check.
-        * @return string|WP_Error The converted string, or a `WP_Error` object if the conversion fails.
+        * @return string|WP_Error The converted string, or a WP_Error object if the conversion fails.
         */
        public function strip_invalid_text_for_column( $table, $column, $value ) {
                if ( ! is_string( $value ) || $this->check_ascii( $value ) ) {
@@ -2982,7 +3007,25 @@ class wpdb {
                        case 'set_charset' :
                                return version_compare( $version, '5.0.7', '>=' );
                        case 'utf8mb4' :      // @since 4.1.0
-                               return version_compare( $version, '5.5.3', '>=' );
+                               if ( version_compare( $version, '5.5.3', '<' ) ) {
+                                       return false;
+                               }
+                               if ( $this->use_mysqli ) {
+                                       $client_version = mysqli_get_client_info();
+                               } else {
+                                       $client_version = mysql_get_client_info();
+                               }
+
+                               /*
+                                * libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server.
+                                * mysqlnd has supported utf8mb4 since 5.0.9.
+                                */
+                               if ( false !== strpos( $client_version, 'mysqlnd' ) ) {
+                                       $client_version = preg_replace( '/^\D+([\d.]+).*/', '$1', $client_version );
+                                       return version_compare( $client_version, '5.0.9', '>=' );
+                               } else {
+                                       return version_compare( $client_version, '5.5.3', '>=' );
+                               }
                }
 
                return false;