[php] ‘==’와 ‘strcmp ()’를 사용한 문자열 비교

PHP ===연산자는 대소 문자를 구분 하는 것 같습니다 . 사용할 이유가 strcmp()있습니까?

다음과 같은 일을하는 것이 안전합니까?

if ($password === $password2) { ... }



답변

그것을 사용하는 이유는 strcmp

str1이 str2보다 작 으면 <0을 리턴합니다. str1이 str2보다 크면 0이고, 같으면 0입니다.

===true또는 만 반환 false하며 “더 큰”문자열을 알려주지 않습니다.


답변

==문자열 비교에 사용해서는 안됩니다 . ===괜찮습니다.

$something = 0;
echo ('password123' == $something) ? 'true' : 'false';

위의 코드를 실행하면 이유를 알 수 있습니다.

$something = 0;
echo ('password123' === $something) ? 'true' : 'false';

이제는 조금 나아졌습니다.


답변

==PHP 에서는 사용하지 마십시오 . 그것은 당신이 기대하는 것을하지 않을 것입니다. 문자열을 문자열과 비교하더라도 PHP는 암시 적으로 부동 소수점으로 캐스트하고 숫자로 표시되면 숫자를 비교합니다.

예를 들어 '1e3' == '1000'true 를 반환합니다. ===대신 사용해야 합니다.


답변

PHP 버그 리포트에 따르면 0wn을 얻을 수도 있습니다.

<?php
    $pass = isset($_GET['pass']) ? $_GET['pass'] : '';
    // Query /?pass[]= will authorize user
    //strcmp and strcasecmp both are prone to this hack
    if ( strcasecmp( $pass, '123456' ) == 0 ){
      echo 'You successfully logged in.';
    }
 ?>

경고가 표시되지만 여전히 비교를 무시하십시오. @postfuturist가 제안한대로
해야합니다 ===.


답변

문자열을 비교할 때는 항상 ===연산자가 아닌 == 연산자 ( 엄격한 비교) 를 사용해야합니다 (느슨한 비교).


답변

모든 답변을 요약 :

  • ==문자열 비교 에는 나쁜 생각 입니다.

    그것은 많은 경우에 “놀라운”결과를 줄 것입니다. 그것을 믿지 마십시오.

  • === 괜찮아 최고의 성능을 제공합니다.

  • strcmp() 일반적으로 정렬 작업에 “더 큰”문자열을 결정해야하는 경우 사용해야합니다.


답변

사용하면 ==위험 할 수 있습니다.

변수가 다른 경우 변수를 다른 데이터 유형으로 캐스트합니다.

예 :

  • echo (1 == '1') ? 'true' : 'false';
  • echo (1 == true) ? 'true' : 'false';

보시다시피,이 두 가지 유형은 다르지만 결과는 true입니다. 코드가 기대하지 않을 수도 있습니다.

사용 ===하지만, 그것은 조금보다 더 빨리하다고 테스트 쇼로 추천 strcmp()하고 대소 문자를 구별 대안 strcasecmp().

빠른 인터넷 검색으로이 속도 비교를합니다. http://snipplr.com/view/758/