Merge pull request #8005 from MrPetovan/bug/7992-empty-in-clause
Add support for empty values array in Database\DBA
This commit is contained in:
		
				commit
				
					
						221746bff3
					
				
			
		
					 1 changed files with 29 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -543,33 +543,38 @@ class DBA extends BaseObject
 | 
			
		|||
						$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;
 | 
			
		||||
						if (count($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;
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
							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 .= self::quoteIdentifier($field) . " IN (" . $placeholders . ")";
 | 
			
		||||
							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 .= self::quoteIdentifier($field) . " IN (" . $placeholders . ")";
 | 
			
		||||
						} else {
 | 
			
		||||
							// Empty value array isn't supported by IN and is logically equivalent to no match
 | 
			
		||||
							$condition_string .= "FALSE";
 | 
			
		||||
						}
 | 
			
		||||
					} elseif (is_null($value)) {
 | 
			
		||||
						$condition_string .= self::quoteIdentifier($field) . " IS NULL";
 | 
			
		||||
					} else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue