Ensure IN() Conditions Never Mix Data Types

This commit is contained in:
miqrogroove 2018-06-21 23:56:19 -04:00 committed by GitHub
parent 47ab72352e
commit 150989ba99
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1299,37 +1299,29 @@ class dba {
$condition_string .= " AND "; $condition_string .= " AND ";
} }
if (is_array($value)) { 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_int = false;
$is_float = false;
$is_alpha = false; $is_alpha = false;
foreach ($value as $single_value) { foreach ($value as $single_value) {
if (is_int($single_value)) { if (is_int($single_value)) {
$is_int = true; $is_int = true;
} } else {
// 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)) {
$is_alpha = true; $is_alpha = true;
} }
} }
// Cast them all in an unique method if ($is_int && $is_alpha) {
if ($is_int) { foreach ($value as &$ref) {
$casted = []; if (is_int($ref)) {
foreach ($value as $single_value) { $ref = (string)$ref;
if (!$is_alpha && !$is_float) {
$casted[] = (int)$single_value;
} else {
$casted[] = (string)$single_value;
} }
} }
$value = $casted; unset($ref); //Prevent accidental re-use.
} }
$new_values = array_merge($new_values, array_values($value)); $new_values = array_merge($new_values, array_values($value));