@@ -252,6 +252,7 @@ public static function insert_multiple_rows( $table, $request, $return_ids = fal
252252 * Otherwise the clause would be `WHERE column_name = 'value'`
253253 *
254254 * @since 3.0.0
255+ * @since 3.9.7 added prepared statement for value.
255256 *
256257 * @param array $where The where clause array. e.g. array( 'id', 'IN', array(1, 2, 3) ) or array( 'id', '=', 1 ).
257258 *
@@ -261,8 +262,16 @@ public static function make_clause( array $where ) {
261262 list ( $ field , $ operator , $ value ) = $ where ;
262263
263264 $ upper_operator = strtoupper ( $ operator );
265+
264266 if ( in_array ( $ upper_operator , array ( 'IN ' , 'NOT IN ' ), true ) ) {
265267 $ value = '( ' . self ::prepare_in_clause ( $ value ) . ') ' ;
268+ } elseif ( in_array ( $ upper_operator , array ( 'BETWEEN ' , 'NOT BETWEEN ' ), true ) ) {
269+ $ value = array_map ( fn ( $ val ) => self ::prepare_value ( $ val ), $ value );
270+ $ value = implode ( ' AND ' , $ value );
271+ } elseif ( strtoupper ( $ value ) === 'NULL ' ) {
272+ $ value = 'NULL ' ;
273+ } else {
274+ $ value = self ::prepare_value ( $ value );
266275 }
267276
268277 return "{$ field } {$ upper_operator } {$ value }" ;
@@ -346,15 +355,13 @@ public static function prepare_where_clause( array $where ) {
346355 case 'BETWEEN ' :
347356 case 'NOT BETWEEN ' :
348357 if ( is_array ( $ val ) && count ( $ val ) === 2 ) {
349- $ val1 = is_numeric ( $ val [0 ] ) ? $ val [0 ] : "' " . $ val [0 ] . "' " ;
350- $ val2 = is_numeric ( $ val [1 ] ) ? $ val [1 ] : "' " . $ val [1 ] . "' " ;
351- $ clause = array ( $ field , $ operator , "{$ val1 } AND {$ val2 }" );
358+ $ clause = array ( $ field , $ operator , $ val );
352359 }
353360 break ;
354361
355362 case 'IS ' :
356363 case 'IS NOT ' :
357- $ val = strtoupper ( $ val ) === 'NULL ' ? 'NULL ' : " ' " . $ val . " ' " ;
364+ $ val = strtoupper ( $ val ) === 'NULL ' ? 'NULL ' : $ val ;
358365 $ clause = array ( $ field , $ operator , $ val );
359366 break ;
360367 case 'RAW ' :
@@ -365,16 +372,14 @@ public static function prepare_where_clause( array $where ) {
365372 $ clause = $ final_query ;
366373 break ;
367374 default : // =, !=, <, >, <=, >=, LIKE, NOT LIKE, <>
368- $ val = is_numeric ( $ val ) ? $ val : "' " . $ val . "' " ;
369375 $ clause = array ( $ field , $ operator , $ val );
370376 break ;
371377 }
372378 } elseif ( is_array ( $ value ) ) {
373379 $ clause = array ( $ field , 'IN ' , $ value );
374380 } elseif ( 'null ' === strtolower ( $ value ) ) {
375- $ clause = array ( $ field , 'IS ' , 'NULL ' );
381+ $ clause = array ( $ field , 'IS ' , 'NULL ' );
376382 } else {
377- $ value = is_numeric ( $ value ) ? $ value : "' " . $ value . "' " ;
378383 $ clause = array ( $ field , '= ' , $ value );
379384 }
380385
@@ -910,32 +915,41 @@ public static function prepare_set_clause( array $data ) {
910915 return rtrim ( $ set , ', ' );
911916 }
912917
918+ /**
919+ * Prepare value before using in query.
920+ *
921+ * @since 3.9.7
922+ *
923+ * @param string|int|float $value the value to prepare.
924+ *
925+ * @return mixed
926+ */
927+ public static function prepare_value ( $ value ) {
928+ global $ wpdb ;
929+ $ escaped_value = null ;
930+ if ( is_int ( $ value ) ) {
931+ $ escaped_value = $ wpdb ->prepare ( '%d ' , $ value );
932+ } elseif ( is_float ( $ value ) ) {
933+ list ( $ whole , $ decimal ) = explode ( '. ' , $ value );
934+ $ expression = '%. ' . strlen ( $ decimal ) . 'f ' ;
935+ $ escaped_value = $ wpdb ->prepare ( $ expression , $ value );
936+ } else {
937+ $ escaped_value = $ wpdb ->prepare ( '%s ' , $ value );
938+ }
939+ return $ escaped_value ;
940+ }
941+
913942 /**
914943 * Make sanitized SQL IN clause value from an array
915944 *
945+ * @since 2.1.1
946+ *
916947 * @param array $arr a sequential array.
948+ *
917949 * @return string
918- * @since 2.1.1
919950 */
920951 public static function prepare_in_clause ( array $ arr ) {
921- $ escaped = array_map (
922- function ( $ value ) {
923- global $ wpdb ;
924- $ escaped_value = null ;
925- if ( is_int ( $ value ) ) {
926- $ escaped_value = $ wpdb ->prepare ( '%d ' , $ value );
927- } else if ( is_float ( $ value ) ) {
928- list ( $ whole , $ decimal ) = explode ( '. ' , $ value );
929- $ expression = '%. ' . strlen ( $ decimal ) . 'f ' ;
930- $ escaped_value = $ wpdb ->prepare ( $ expression , $ value );
931- } else {
932- $ escaped_value = $ wpdb ->prepare ( '%s ' , $ value );
933- }
934- return $ escaped_value ;
935- },
936- $ arr
937- );
938-
952+ $ escaped = array_map ( fn ( $ value ) => self ::prepare_value ( $ value ), $ arr );
939953 return implode ( ', ' , $ escaped );
940954 }
941955
0 commit comments