본문 바로가기
IT tech Coding/php

PHP select 태그에서 대소문자 구분 없이 selected 처리하는 방법

by Coding Life 2025. 5. 28.

 

HTML <select> 요소를 PHP로 동적으로 생성할 때, 데이터베이스에 저장된 값과 옵션 값을 비교하여 selected를 지정해 주는 작업은 아주 흔합니다.
그런데 여기서 의외로 자주 겪는 문제가 하나 있습니다.

 


😵 문제 상황: 값은 같은데 선택이 안 돼요!

예를 들어, 데이터베이스에는 'ea'로 저장되어 있고, select 옵션에는 'EA'로 되어 있다면 다음과 같은 코드는 어떻게 될까요?

<option value="<?=$unit?>" <?=($row['unit'] == $unit) ? 'selected' : ''?>><?=$unit?></option>

겉보기엔 'ea'와 'EA'가 같아 보여도, PHP는 대소문자를 구분해서 비교하기 때문에 "selected"가 적용되지 않습니다.


✅ 해결 방법: strcasecmp() 함수 사용

PHP에는 문자열을 대소문자 구분 없이 비교하는 아주 좋은 함수가 있습니다. 바로 strcasecmp() 입니다.

다음과 같이 == 대신 strcasecmp()를 사용해보세요:

<option 
  value="<?= htmlspecialchars($unit) ?>" 
  <?= (strcasecmp($row['unit'], $unit) === 0) ? 'selected' : '' ?>
>
  <?= htmlspecialchars($unit) ?>
</option>

strcasecmp()는 두 문자열이 같으면 0을 반환합니다. 즉, 'ea'와 'EA', 'Ea', 'eA' 등 어떤 조합이든 무조건 같다고 판단해 줍니다.


💡 또 다른 방법: strtolower()로 강제 소문자화

PHP 8 이상을 사용한다면 이렇게 해도 괜찮습니다:

<?= (strtolower($row['unit']) === strtolower($unit)) ? 'selected' : '' ?>

두 값을 모두 소문자로 바꿔서 비교하는 방식입니다. 물론 strtoupper()로 대문자로 통일해도 됩니다.


🧪 정리

비교 방식 대소문자 구분 추천 여부

== or === O (구분함)
strcasecmp() ❌ (구분 안함)
strtolower() + 비교

👀 마무리

이처럼 아주 작은 차이 때문에 selected가 안 먹히는 경우가 많습니다.
혹시 select 태그에서 값이 저장되어 있는데 선택이 안 된다면, 대소문자 문제를 꼭 의심해 보세요!

누군가의 삽질 시간을 줄이길 바라며 😊
공감되셨다면 댓글이나 공유 부탁드립니다!


 

반응형