db에 값이 없는 경우와 nl2br 두가지의 질문
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.2 |
질문에 회원메모를 해 놓은 경우 따로 목록으로 확인했으면 한다고 하는 질문이 있어 마침 저도 그게 필요하구나 라는 생각에 위젯으로 적용해 보고 있는데요.
한가지 의문사항이 생겼습니다.
db에 회원메모(description)가 공란이 아닐경우를 조회하기 위해
operation="notequal" column="description" var="value"
위와 같이 작성하고 value 에
value = '공백없이';
이렇게 해주어야 할 것으로 예상하고 했더니 모든 회원이 조회되버리더라구요.
그래서
value = '공백';
이렇게 한칸 공백으로 해서 하니까 메모가 있는 회원 그러니까 공란이 아닌회원이 조회가 되어 원하는 목록을 구할 수 있었습니다.
필드에 아무것도 입력하지 않은 기본상태가 공백 하나가 들어가 있는 상태인건가요??
debug를 해서 보면
SELECT * FROM `rx_member` AS `member` WHERE `description` != ?
이렇게 조회되는 것으로 나옵니다.
그리고 2번째 질문입니다.
메모에 해 놓은 것을 이벤트마다 구분하기 위해 한줄에 이벤트 // 날짜 이런식으로 줄바꿈을 해서 기록합니다.
예전에 스킨에 출력을 할때 줄바꿈 그대로 출력하기 위해 해보니
nl2br(); 을 사용하니 목적대로 이벤트마다 한줄씩 구분되게 잘 출력되더라구요.
이게 제가 제대로 사용한건지 아니면 다른 것을 쓰는게 더 좋은게 있는지 궁금합니다.
댓글 7
notequal 의 기준을 정확하게 이해하셔야 할 것 같습니다.
notequal 은 notnull이 아니라 a와 같지 않은 으로 인식됩니다.
해당 값을 빈값으로 넘겨준다 하더라도 실제로 쿼리에서 잘못인식할 수 있어요.
쿼리에 쓰이는 항목은 이 이미지를 참고하세요.
notnull으로 설정해보시면 나올지도 모르겠네요
null 값을 가지지 않은 회원도 많아서요.(아마도 해당 필드를 수정하거나 했던 이력이 있다면...)
제가 같지 않다를 이해하지 못한건 아닌데요.
다른 의미가 있는지 설명해 주신거로도 아직 이해가 안가네요.
'' 와 같지 않은 경우 를 조회하려고 한건데요. 이게 공란을 의미하는게 아닌가 해서요.
' ' 와 같지 않은 경우를 조회하면 의도대로 됩니다. 한칸 공백이 들어간 경우 정상적으로 메모가 기록된 회원들이 조회가 되어서요.
PHP에서 ''을 null으로도 인식하기도 합니다.
PHP에서 타입을 지정하지 않기에 되게 유하게 생각하는 경우가 많아요.
var_dump( 0 == '' );
var_dump( 0 == NULL );
var_dump( 0 == false );
var_dump( '' == NULL );
var_dump( '' == false );
var_dump( NULL == false );
위의 모든 값은 true 를 반환합니다. 즉, 같은 값으로 생각하고 쿼리를 담당하는 pdo나 라이믹스의 경우에도 이러한 빈문자열 인식에 의해서 오히려 빈문자열로 인식하지 않고 null으로 넘어갔을 가능성도 배재할 수 없겟지요.
상당수 대부분의 쿼리를 담당하는 부분 if else 으로 처리된 구간이 많은데 이러한 부분에서 if 문법이 잘못 인식하는 경우가 될 수 있거든요.
따라서 or절을 이용하여 두개를 and으로 묶은 쿼리를 이용해보세요.
<group pipe="and">
<condition operation="notnull" ~~~ pipe="or">
<condition operation="notequal" ~~~ pipe="or">
</group>
이게 정상적인건지 버그인건지 궁금합니다.
회원메모에 아무것도 없는 회원들은
'공백' notequal 로 조회하면 나오지 않고 무언가 들어가 있는 회원들만 나옵니다.
결과적으로는 제가 하려는 notequal 의 값으로는 '공백' 이 유효 했습니다.
db에 아무 값도 없는데 공백하나가 들어간 경우와 일치하지 않는 대상에서 제외되는게 이상해서요.
라이믹스 팀에서 이를 어떻게 처리 할지 모르겠지만 일반적으로 공백으로 넘기면 빈문자열로 변경시켜 쿼리에 적용시키므로 문제가 없거든요.
즉 있으나 없으나 여부 상관없이 정상적인 작동으로 보셔도 문제 없을 것 같습니다.
저는 처음에 공백 없이 '' 이게 빈 값일 것이라 추측 했거든요.
공백을 넣어야 하는게 아직 이해가 살짝 안갑니다.
notequal 을 PHP에서 XML처리 할때는 좀 다른 시선으로 바라보셔야 할 것 같아요.
이게 실제 쿼리문을 직접 날리는 경우에는 문제가 없지만 이걸 PHP에서 처리하는 방식으로 넘어가면 좀 이야기가 달라지거든요.
그렇다고 그걸 다시 허용한다면 또 보안취약점 이슈가 발생되고요.
즉 안되는 것이 더 낫습니다.
xml에서 notequal 쿼리를 처리할때는 항상 값을 넣어 사용하는 경우에만 이용한다 라고 생각하시고 빈문자열의 경우에는 빈 공백하나를 추가한다 라고 생각하시는게 도움될 것 같습니다.