Ticket #32165: 32165.3.diff
File 32165.3.diff, 3.7 KB (added by , 10 years ago) |
---|
-
src/wp-includes/wp-db.php
2710 2710 $queries = array(); 2711 2711 foreach ( $data as $col => $value ) { 2712 2712 if ( ! empty( $value['db'] ) ) { 2713 if ( ! isset( $queries[ $value['charset'] ] ) ) {2714 $queries[ $value['charset'] ] = array();2715 }2716 2717 2713 // We're going to need to truncate by characters or bytes, depending on the length value we have. 2718 2714 if ( 'byte' === $value['length']['type'] ) { 2719 2715 // Split the CONVERT() calls by charset, so we can make sure the connection is right 2720 $queries[ $ value['charset'] ][ $col ] = $this->prepare( "CONVERT( LEFT( CONVERT( %s USING binary ), %.0f ) USING {$value['charset']} )", $value['value'], $value['length']['length'] );2716 $queries[ $col ] = $this->prepare( "CONVERT( LEFT( CONVERT( %s USING binary ), %.0f ) USING {$value['charset']} )", $value['value'], $value['length']['length'] ); 2721 2717 } else { 2722 $queries[ $ value['charset'] ][ $col ] = $this->prepare( "LEFT( CONVERT( %s USING {$value['charset']} ), %.0f )", $value['value'], $value['length']['length'] );2718 $queries[ $col ] = $this->prepare( "LEFT( CONVERT( %s USING {$value['charset']} ), %.0f )", $value['value'], $value['length']['length'] ); 2723 2719 } 2724 2720 2725 2721 unset( $data[ $col ]['db'] ); … … 2726 2722 } 2727 2723 } 2728 2724 2729 $connection_charset = $this->charset; 2730 foreach ( $queries as $charset => $query ) { 2725 $this->check_current_query = false; 2726 2727 $sql = array(); 2728 foreach ( $queries as $column => $query ) { 2731 2729 if ( ! $query ) { 2732 2730 continue; 2733 2731 } 2734 2732 2735 // Change the charset to match the string(s) we're converting 2736 if ( $charset !== $connection_charset ) { 2737 $connection_charset = $charset; 2738 $this->set_charset( $this->dbh, $charset ); 2739 } 2733 $sql[] = $query . " AS x_$column"; 2734 } 2740 2735 2741 $this->check_current_query = false; 2742 2743 $sql = array(); 2744 foreach ( $query as $column => $column_query ) { 2745 $sql[] = $column_query . " AS x_$column"; 2746 } 2747 2748 $row = $this->get_row( "SELECT " . implode( ', ', $sql ), ARRAY_A ); 2749 if ( ! $row ) { 2750 $this->set_charset( $this->dbh, $connection_charset ); 2751 return new WP_Error( 'wpdb_strip_invalid_text_failure' ); 2752 } 2753 2754 foreach ( array_keys( $query ) as $column ) { 2755 $data[ $column ]['value'] = $row["x_$column"]; 2756 } 2736 $row = $this->get_row( "SELECT " . implode( ', ', $sql ), ARRAY_A ); 2737 if ( ! $row ) { 2738 return new WP_Error( 'wpdb_strip_invalid_text_failure' ); 2757 2739 } 2758 2740 2759 // Don't forget to change the charset back! 2760 if ( $connection_charset !== $this->charset ) { 2761 $this->set_charset( $this->dbh ); 2741 foreach ( array_keys( $data ) as $column ) { 2742 $data[ $column ]['value'] = $row["x_$column"]; 2762 2743 } 2763 2744 } 2764 2745 -
tests/phpunit/tests/db/charset.php
303 303 $data_provider[] = array( $data, $expected, $test_case ); 304 304 } 305 305 306 // Time for our test of multiple fields at once.307 $data_provider[] = array( $multiple, $multiple_expected, 'multiple fields/charsets' );308 309 306 return $data_provider; 310 307 } 311 308 … … 318 315 $this->markTestSkipped( 'This test fails in PHP 5.2 on Windows. See https://core.trac.wordpress.org/ticket/31262' ); 319 316 } 320 317 318 $charset = self::$_wpdb->charset; 319 self::$_wpdb->set_charset( self::$_wpdb->dbh, $data[0]['charset'] ); 320 321 321 $actual = self::$_wpdb->strip_invalid_text( $data ); 322 323 self::$_wpdb->set_charset( self::$_wpdb->dbh, $charset ); 324 322 325 $this->assertSame( $expected, $actual, $message ); 323 326 } 324 327