WordPress.org

Make WordPress Core

Ticket #15158: wpdb_prepare_null.15158.patch

File wpdb_prepare_null.15158.patch, 1.5 KB (added by jbutkus, 16 months ago)

Patching wpdb::prepare() to support NULL handling

  • wp-includes/wp-db.php

    diff --git a/wp-includes/wp-db.php b/wp-includes/wp-db.php
    index 391cfa4..0235c1d 100644
    a b class wpdb { 
    10001000                $query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting 
    10011001                $query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware 
    10021002                $query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s 
     1003 
     1004                // START replace NULLs 
     1005                preg_match_all( 
     1006                        '|\'?%(?:(\d+)\$)?[dfs]\'?|', 
     1007                        $query, 
     1008                        $positions, 
     1009                        PREG_OFFSET_CAPTURE 
     1010                ); 
     1011                if ( ! empty( $positions ) ) { 
     1012                        $values     = array_values( $args ); 
     1013                        $index      = 0; 
     1014                        $str_offset = 0; 
     1015                        foreach ( $positions[0] as $ref => $pattern ) { 
     1016                                $loc_index = 0; 
     1017                                if ( ! empty( $positions[1][$ref] ) ) { 
     1018                                        $loc_index = ( (int)$positions[1][$ref][0] ) - 1; 
     1019                                } else { 
     1020                                        $loc_index = $index++; 
     1021                                } 
     1022                                if ( ! isset( $values[$loc_index] ) ) { 
     1023                                        unset( $values[$loc_index] ); // NULL is not set, but present 
     1024                                        $format_length = strlen( $pattern[0] ); 
     1025                                        $query = substr( 
     1026                                                $query, 
     1027                                                0, 
     1028                                                $pattern[1] + $str_offset 
     1029                                                ) . ' NULL ' . 
     1030                                                substr( 
     1031                                                        $query, 
     1032                                                        $pattern[1] + $format_length + $str_offset 
     1033                                                ); 
     1034                                        if ( $format_length != 6 ) { 
     1035                                                $str_offset += 6 - $format_length; 
     1036                                        } 
     1037                                } 
     1038                        } 
     1039                        $args = array_values( $values ); 
     1040                } 
     1041                // END replace NULLs 
     1042 
    10031043                array_walk( $args, array( $this, 'escape_by_ref' ) ); 
    10041044                return @vsprintf( $query, $args ); 
    10051045        }