2016-06-21 3 views
0

확실하지 문자열과 정수를 비교할 때 잘못된 결과를 반환하지만 간단한 id 검증을뭔가 또는 무엇을 확인할 수 없습니다 경우

$id = '2s2'; 

var_dump($id); 
var_dump($id*1); 
if ($id != ($id*1) || $id <= 0) { 
    die('wrong id'); 
} 
die('here?'); 

결과가있는 경우 :

string '2s2' (length=3) 
int 2 
here? 

이 검사를 id이 값이 0 이하이면 id multiplied by 1또는과 같습니다. 따라서 $id = '2s2;의 값은 같지 않습니다 (덤프에서 볼 수있는 것처럼).

왜 울리지 않습니까? wrong id?

+1

가 왜 문자열을 곱하여됩니다 또한 $id 정수의 경우 테스트하기 훨씬 쉬운 방법이

? BTW는 1을 곱한 모든 것이 그 자체입니다. 그렇지 않습니까? –

+0

문자열에 1을 곱하면 int로 변환됩니다. 이유를 이해하려고 노력 중입니다. – Phiter

+1

@PhiterFernandes 오, 알았어, 매우 더러운 소리. –

답변

6

$id이 숫자인지 확인하기 위해 1을 곱한 것 같습니다. 이 경우 당신은 단순히 수 :

if (!is_numeric($id) || $id <= 0) { 
    die('wrong id'); 
} 
+0

가 실수로 실수를 저질렀다고 믿을 수 없습니다! 나를위한 절호의 날. – Albzi

0

서로 다른 유형의 두 변수를 비교 (일부 다른 작업을 할) PHP는 Type Juggling라는 작업을 수행합니다. 기본적으로 두 피연산자를 조작하기 전에 두 피연산자를 같은 유형으로 변환하려고 시도합니다.

다소 반 직관적으로 PHP는 두 피연산자를 모두 정수로 변환합니다. converting a string to integer의 규칙은 기본적으로 "문자열 시작 부분부터 숫자가 아닌 부분까지 문자를 가져 와서 나머지는 무시합니다"입니다.

따라서 왼손 $id은 실제로 "2s2"이며 비 정수 부분에서 "2"으로 제거 된 다음 오른쪽 피연산자와 비교됩니다. 오른쪽 피연산자 ($id*1)은 본질적으로 동일한 프로세스를 통과합니다. 수학적 맥락에서 PHP는 문자열을 정수처럼 취급해야합니다.

엄밀한 비교 연산자 if ($id !== ($id*1))을 사용할 수 있습니다. PHP에서 타입 저글링을 원하지 않는다고 말하면 결과는 예상대로입니다. is_int()is_numeric()

관련 문제