Make WordPress Core


Ignore:
Timestamp:
11/20/2014 01:45:10 AM (10 years ago)
Author:
pento
Message:

WPDB: Force STRICT_ALL_TABLES to be enabled as soon as we connect to the MySQL server.

This improves data integrity when inserting and updating rows in the database, particularly when trying to insert emoji into posts stored with character sets that don't support emoji.

See #21212.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/wp-db.php

    r30375 r30400  
    567567     * @var array
    568568     */
    569     protected $incompatible_modes = array( 'NO_ZERO_DATE', 'ONLY_FULL_GROUP_BY',
    570         'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'TRADITIONAL' );
     569    protected $incompatible_modes = array( 'NO_ZERO_DATE', 'ONLY_FULL_GROUP_BY', 'TRADITIONAL' );
     570
     571    /**
     572     * A list of required SQL modes.
     573     *
     574     * @since 4.1.0
     575     * @access protected
     576     * @var array
     577     */
     578    protected $required_modes = array( 'STRICT_ALL_TABLES' );
    571579
    572580    /**
     
    779787    public function set_sql_mode( $modes = array() ) {
    780788        if ( empty( $modes ) ) {
    781             if ( $this->use_mysqli ) {
    782                 $res = mysqli_query( $this->dbh, 'SELECT @@SESSION.sql_mode' );
     789            $modes = $this->get_var( "SELECT @@SESSION.sql_mode" );
     790            if ( $modes ) {
     791                $modes = $original_modes = explode( ',', $modes );
    783792            } else {
    784                 $res = mysql_query( 'SELECT @@SESSION.sql_mode', $this->dbh );
    785             }
    786 
    787             if ( empty( $res ) ) {
    788                 return;
    789             }
    790 
    791             if ( $this->use_mysqli ) {
    792                 $modes_array = mysqli_fetch_array( $res );
    793                 if ( empty( $modes_array[0] ) ) {
    794                     return;
    795                 }
    796                 $modes_str = $modes_array[0];
    797             } else {
    798                 $modes_str = mysql_result( $res, 0 );
    799             }
    800 
    801             if ( empty( $modes_str ) ) {
    802                 return;
    803             }
    804 
    805             $modes = explode( ',', $modes_str );
     793                $modes = $original_modes = array();
     794            }
    806795        }
    807796
     
    813802         * @since 3.9.0
    814803         *
    815          * @see wpdb::$incompatible_modes
    816          *
    817804         * @param array $incompatible_modes An array of incompatible modes.
    818805         */
    819806        $incompatible_modes = (array) apply_filters( 'incompatible_sql_modes', $this->incompatible_modes );
    820807
    821         foreach( $modes as $i => $mode ) {
    822             if ( in_array( $mode, $incompatible_modes ) ) {
    823                 unset( $modes[ $i ] );
     808        /**
     809         * Filter the list of required SQL modes to include.
     810         *
     811         * @since 4.1.0
     812         *
     813         * @param array $required_modes An array of required modes.
     814         */
     815        $required_modes = (array) apply_filters( 'required_sql_modes', $this->required_modes );
     816
     817        $modes = array_diff( $modes, $incompatible_modes );
     818        $modes = array_unique( array_merge( $modes, $required_modes ) );
     819
     820        // Don't run SET SESSION if we have nothing to change.
     821        if ( isset( $original_modes ) ) {
     822            sort( $original_modes );
     823            sort( $modes );
     824            if ( $original_modes === $modes ) {
     825                return;
    824826            }
    825827        }
     
    827829        $modes_str = implode( ',', $modes );
    828830
    829         if ( $this->use_mysqli ) {
    830             mysqli_query( $this->dbh, "SET SESSION sql_mode='$modes_str'" );
    831         } else {
    832             mysql_query( "SET SESSION sql_mode='$modes_str'", $this->dbh );
     831        $this->query( "SET SESSION sql_mode='$modes_str'" );
     832        if ( $this->last_error ) {
     833            dead_db();
    833834        }
    834835    }
     
    14831484            $this->has_connected = true;
    14841485            $this->set_charset( $this->dbh );
     1486            $this->ready = true;
    14851487            $this->set_sql_mode();
    1486             $this->ready = true;
    14871488            $this->select( $this->dbname, $this->dbh );
    14881489
Note: See TracChangeset for help on using the changeset viewer.