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 태그에서 값이 저장되어 있는데 선택이 안 된다면, 대소문자 문제를 꼭 의심해 보세요!
누군가의 삽질 시간을 줄이길 바라며 😊
공감되셨다면 댓글이나 공유 부탁드립니다!
반응형
'IT tech Coding > php' 카테고리의 다른 글
방화셔터회사 비인정제품 거래명세표 제작하기 (0) | 2025.05.31 |
---|---|
PHP 경고 메시지 "A non well formed numeric value encountered" 해결 방법 (0) | 2025.03.25 |
PHP에서 JSON 데이터를 활용해 각 항목의 상태를 자동으로 판정하는 방법 (0) | 2025.03.23 |
수입검사 품목에 대한 통계자료 작성 코드 (0) | 2025.03.13 |
json형태로 가이드레일 형태의 정보 및 이미지 저장하는 로직개발 (0) | 2025.03.10 |