2011-11-10 2 views
1

나는 통과 할 수있는 곳에서 반복적으로 호출되는 함수를 가지고있다. 매개 변수가 "실제"(int/float) 숫자 인 경우 (즉, MySQL 쿼리에 전달 될 때 아무런 조작이나 따옴표를 추가하지 않음) 변수와 함수는 다르게 작동합니다. 현재 내 코드는 이중 유형 검사를 수행하지만 더 좋은 방법이 있습니까?숫자가 "실제"숫자 (int/float)인지 문자열 ("1"/ "1.2")인지 확인하는 가장 좋은 방법

$a = 1; 
$b = '1'; 
$is_num = (is_numeric($a) && !is_string($a)); //true 
$is_num = (is_numeric($b) && !is_string($b)); //false 

더 빠른 방법이 있습니까? 예를 들어

(매우 단순화 된 버전) : 전화 번호는 정수가 항상 경우

$query = 'SELECT * FROM `table` WHERE '; 
$field = 'id'; 
$operator = '='; 
$value = 2; 

$query .= '`'.$field.'`'.$operator; 
$is_num = (is_numeric($value) && !is_string($value)); 
if($is_num){ 
    $query .=$value; 
}else{ 
    $query .='"'.mysql_real_escape_string((string)$value).'"'; 
} 
$query .=';'; 
+2

원하는 동작이 무엇인지 더 명확하게 설명 할 수 있습니까? 'if-then'을하려고하는 것입니까? 문자열 일 경우 한 가지만하고, 다른 경우는 int 일뿐입니다. – julio

+0

왜 필요하면 숫자가되도록 강제하지 않는 것이 좋을까요? (또는 문자열이 선호되는 경우?) – Amber

+0

은 쿼리 빌더입니다. 실제 숫자를 전달하면 문자열을 전달할 경우 (심지어 숫자 문자열) 따옴표를 추가해야합니다. 예를 들어'field = "1"로 된 쿼리가'field '의 타입에 따라'field = 1'을 가진 쿼리와 다르다면 – Fabrizio

답변

2

, 다음 is_int를 사용할 수 있습니다. 거기는 소수 소수점 수있을 가능성이 있고 당신이 그 $is_num == true을 반환 할 경우 아니, 당신은 당신이로 확인을하거나 is_numeric의 특정 목적에있다 is_int($a) || is_float($a)

와 두 유형을 확인해야 "숫자 또는 숫자 문자열"이고 "모든 숫자 유형"catch-all이 없는지 확인하십시오.

그러나 검색어 작성자를위한 의견이라고 말씀하시면 is_string 인 경우 따옴표를 추가하지 않으시겠습니까?

+0

이 있습니다. 다른 조작을 쿼리 이외에 적용한 경우, 예제는 간단합니다. 두 번 함수를 캐스팅하거나 적용하지 않고 "형식"검사를 수행하는 가장 좋은 방법은 무엇인지 알아야합니다. – Fabrizio

1

정수 만 사용하는 경우 is_int($a)이 작동합니다. 당신이 너무 수레를 처리하는 경우 그 필드 유형 인 경우 SQL은 INT/float로 캐스팅 때문에, 문자열로 캐스팅하는 것이 좋습니다

is_int($a) || is_float($a) 
+0

하나의 함수 호출로 처리하려고 시도합니다. – Fabrizio

0
function is_number($input) 
{ 
    if (! is_int($input) AND is_numeric($input)) 
    { 
     return (float) $input === $input; 
    } 
    else 
    { 
     return (int) $input === $input; 
    } 
} 

echo is_number('1.23')? 'true': 'false'; # false 
echo is_number(1.23)? 'true': 'false'; # true 
echo is_number(1)? 'true': 'false'; # true 
echo is_number('1')? 'true': 'false'; # false 

사용합니다.

+0

나는 return (is_numeric ($ 입력) &&! is_string ($ input)); ' – Fabrizio

+0

인덱스의 이점을 상실하기 때문에 항상 캐스트하지 않으려합니다. 플러스 때로는 정수로 캐스팅 할 수도 있습니다. – Fabrizio

관련 문제