질문/조언질답게시판
Extra Form
PHP PHP 7.2
CMS Rhymix 2.x

질문에 회원메모를 해 놓은 경우 따로 목록으로 확인했으면 한다고 하는 질문이 있어 마침 저도 그게 필요하구나 라는 생각에 위젯으로 적용해 보고 있는데요.

 

한가지 의문사항이 생겼습니다.

 

db에 회원메모(description)가 공란이 아닐경우를 조회하기 위해 

 

operation="notequal" column="description" var="value"

 

위와 같이 작성하고 value 에 

 

value = '공백없이';

 

이렇게 해주어야 할 것으로 예상하고 했더니 모든 회원이 조회되버리더라구요.

 

그래서

 

value = '공백';

이렇게 한칸 공백으로 해서 하니까 메모가 있는 회원 그러니까 공란이 아닌회원이 조회가 되어 원하는 목록을 구할 수 있었습니다.

 

필드에 아무것도 입력하지 않은 기본상태가 공백 하나가 들어가 있는 상태인건가요??

debug를 해서 보면

SELECT * FROM `rx_member` AS `member` WHERE `description` != ?

이렇게 조회되는 것으로 나옵니다.

 

 

그리고 2번째 질문입니다.

메모에 해 놓은 것을 이벤트마다 구분하기 위해 한줄에 이벤트 // 날짜 이런식으로 줄바꿈을 해서 기록합니다.

 

예전에 스킨에 출력을 할때 줄바꿈 그대로 출력하기 위해 해보니

nl2br(); 을 사용하니 목적대로 이벤트마다 한줄씩 구분되게 잘 출력되더라구요.

 

이게 제가 제대로 사용한건지 아니면 다른 것을 쓰는게 더 좋은게 있는지 궁금합니다.

 

  • profile

    notequal 의 기준을 정확하게 이해하셔야 할 것 같습니다.

    notequal 은 notnull이 아니라 a와 같지 않은 으로 인식됩니다.

    해당 값을 빈값으로 넘겨준다 하더라도 실제로 쿼리에서 잘못인식할 수 있어요.

     

    붙여넣은_이미지_2021_6_8_오후_6_39.png

     

    쿼리에 쓰이는 항목은 이 이미지를 참고하세요.

     

    notnull으로 설정해보시면 나올지도 모르겠네요 

     

     

  • profile profile

    null 값을 가지지 않은 회원도 많아서요.(아마도 해당 필드를 수정하거나 했던 이력이 있다면...)

    제가 같지 않다를 이해하지 못한건 아닌데요.
    다른 의미가 있는지 설명해 주신거로도 아직 이해가 안가네요.

    '' 와 같지 않은 경우 를 조회하려고 한건데요. 이게 공란을 의미하는게 아닌가 해서요.
    ' ' 와 같지 않은 경우를 조회하면 의도대로 됩니다. 한칸 공백이 들어간 경우 정상적으로 메모가 기록된 회원들이 조회가 되어서요.

  • profile profile

    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>

  • profile profile
    '공백' 이게 회원메모에 아무것도 없는 회원과 일치 한다는게 궁금한 부분인데요.
    이게 정상적인건지 버그인건지 궁금합니다.

    회원메모에 아무것도 없는 회원들은
    '공백' notequal 로 조회하면 나오지 않고 무언가 들어가 있는 회원들만 나옵니다.
    결과적으로는 제가 하려는 notequal 의 값으로는 '공백' 이 유효 했습니다.

    db에 아무 값도 없는데 공백하나가 들어간 경우와 일치하지 않는 대상에서 제외되는게 이상해서요.
  • profile profile
    한편으로는 버그이지만 한편으로는 맞는 설정이 될지도 모르겠네요.

    라이믹스 팀에서 이를 어떻게 처리 할지 모르겠지만 일반적으로 공백으로 넘기면 빈문자열로 변경시켜 쿼리에 적용시키므로 문제가 없거든요.

    즉 있으나 없으나 여부 상관없이 정상적인 작동으로 보셔도 문제 없을 것 같습니다.
  • profile profile
    그럼 '' 을 notequal 로 했을때 는 메모 여부와 상관 없이 모든 회원이 출력되는 것도 정상인가요?
    저는 처음에 공백 없이 '' 이게 빈 값일 것이라 추측 했거든요.

    공백을 넣어야 하는게 아직 이해가 살짝 안갑니다.
  • profile profile

    notequal 을 PHP에서 XML처리 할때는 좀 다른 시선으로 바라보셔야 할 것 같아요.

    이게 실제 쿼리문을 직접 날리는 경우에는 문제가 없지만 이걸 PHP에서 처리하는 방식으로 넘어가면 좀 이야기가 달라지거든요.

    그렇다고 그걸 다시 허용한다면 또 보안취약점 이슈가 발생되고요.

    즉 안되는 것이 더 낫습니다.

     

    xml에서 notequal 쿼리를 처리할때는 항상 값을 넣어 사용하는 경우에만 이용한다 라고 생각하시고 빈문자열의 경우에는 빈 공백하나를 추가한다 라고 생각하시는게 도움될 것 같습니다.