From 150989ba998ba4da6a824b1d05d66b782043579d Mon Sep 17 00:00:00 2001 From: miqrogroove Date: Thu, 21 Jun 2018 23:56:19 -0400 Subject: [PATCH] Ensure IN() Conditions Never Mix Data Types --- include/dba.php | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/include/dba.php b/include/dba.php index bad8ef5e72..cfe31af51d 100644 --- a/include/dba.php +++ b/include/dba.php @@ -1299,37 +1299,29 @@ class dba { $condition_string .= " AND "; } if (is_array($value)) { - // Check if there are integer values in the parameters + /** + * Workaround for MySQL Bug #64791. + * Never mix data types inside any IN() condition. + * In case of mixed types, cast all as string. + * Logic needs to be consistent with dba::p() data types. + */ $is_int = false; - $is_float = false; $is_alpha = false; foreach ($value as $single_value) { if (is_int($single_value)) { $is_int = true; - } - - // To prevent to round floats we look for them - if (round($single_value) != (float)$single_value) { - $is_float = true; - } - - // Is any non numeric value present? - if (!is_numeric($single_value)) { + } else { $is_alpha = true; } } - - // Cast them all in an unique method - if ($is_int) { - $casted = []; - foreach ($value as $single_value) { - if (!$is_alpha && !$is_float) { - $casted[] = (int)$single_value; - } else { - $casted[] = (string)$single_value; + + if ($is_int && $is_alpha) { + foreach ($value as &$ref) { + if (is_int($ref)) { + $ref = (string)$ref; } } - $value = $casted; + unset($ref); //Prevent accidental re-use. } $new_values = array_merge($new_values, array_values($value));