+ $new_values = [];
+ $condition_string = "";
+ foreach ($condition as $field => $value) {
+ if ($condition_string != "") {
+ $condition_string .= " AND ";
+ }
+ if (is_array($value)) {
+ /* 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_alpha = false;
+ foreach ($value as $single_value) {
+ if (is_int($single_value)) {
+ $is_int = true;
+ } else {
+ $is_alpha = true;
+ }
+ }
+
+ if ($is_int && $is_alpha) {
+ foreach ($value as &$ref) {
+ if (is_int($ref)) {
+ $ref = (string)$ref;
+ }
+ }
+ unset($ref); //Prevent accidental re-use.
+ }
+
+ $new_values = array_merge($new_values, array_values($value));
+ $placeholders = substr(str_repeat("?, ", count($value)), 0, -2);
+ $condition_string .= "`" . $field . "` IN (" . $placeholders . ")";
+ } else {
+ $new_values[$field] = $value;
+ $condition_string .= "`" . $field . "` = ?";
+ }
+ }
+ $condition_string = " WHERE (" . $condition_string . ")";
+ $condition = $new_values;