Extra Form
PHP PHP 7.1
CMS XpressEngine

어제 로그인회원 식별 관련해서 오래된 애드온을 한번 살펴보는데 이상하게 쿼리가 반영이 안되어 이것 저것 해보다가 결국

use_prepared_statements = 'Y';

 

use_prepared_statements = 'N';

로 해야 쿼리가 정상 반영 되는 것을 확인했습니다.

 

질문1.

애드온에서 테이블을 생성한 것이고 현재는 innodb를 사용합니다.

원래 애드온에서 테이블을 생성한 것은 현재 상황에서는 use_prepared_statements = 'N'; 로 해야 쿼리가 정상 작동하나요?

 

 

질문2.

1이 아니오 라면..

 

<table name="login_check">
    <column name="member_srl" type="number" size="11" notnull="notnull" primary_key="primary_key" />
    <column name="login_time" type="date"  />
</table>

 

애드온에서 테이블을 처음 만들때 위와 같은 스키마를 통해 테이블을 생성했습니다.

 

여기에 오류가 있어 지금 상황이 발생된건가요??

 

 

질문3.

use_prepared_statements = 'N'; 로 운영시 문제가 되는 부분이 있나요?

현재는  https://xetown.com/tips/905406 이 팁을 보고 일단 애드온에서 해당 쿼리 직전 바꾸고 다시 쿼리 후 원래대로 돌려 놓게 해서 테스트 중입니다.

 

 

  • profile
    어떤메세지의 오류가 뜨던가요? 쿼리시 에러메세지 debugPrint나 print_r으로 확인해서 남겨주시면 좋을것 같아요
  • profile profile
    제가 debug 는 익숙치 않아 방법을 잘 모르겠습니다. db에 값이 insert,update 되는 결과를 보고 원인을 찾은 건데요. 아주 오래전에는 정상 동작했던 부분인데..

    innodb로 바뀐 후 아마 쿼리가 반영이 안되는 것 같아 본문에 자료의 정보는 거의 대부분 적었습니다. 쿼리 직후 어떤 메시지가 어떻게 나오는지는 제가 확인을 못했습니다.
  • profile profile
    정보 하나가 누락되었군요.

    쿼리 할때

    <query id="insertLoginTime" action="insert">
    <tables>
    <table name="login_check" />
    </tables>
    <columns>
    <column name="member_srl" var="member_srl" filter="number" notnull="notnull" />
    <column name="login_time" var="login_time" default="curdate()" />
    </columns>
    </query>

    이 파일을 가지고 합니다.
  • profile profile

    use_prepared_statements = 'N';

    로 했을 경우 잘 되니 이부분이 궁금해져서 질문을 하게 된 것이고 질문 내용은 1,2,3으로 나눠서 올려 봤습니다.

  • profile

    use_prepared_statements = Y로 설정하면 쿼리 문법과 테이블 스키마가 서로 맞아야 합니다. 훨씬 엄격하게 체크하기 때문에 약간이라도 어긋나면 에러가 날 수 있습니다. 주로 꽤 오래된 모듈이나 애드온에서 발생하는 문제인데, 단지 애드온이라는 이유만으로 안 되지는 않습니다. 현재 테이블 스키마 파일을 제대로 인식하지 못하고 있거나, 테이블 스키마 파일에 지정된 구조와 실제 테이블 구조가 다를 가능성이 높습니다.

  • profile profile
    스키마파일은 애드온에서
    $oDB = DB::getInstance();
    if(!$oDB->isTableExists('login_check')) {
    $oDB->createTableByXmlFile('./addons/login_check/schemas/login_check.xml');
    }


    이렇게 처음 생성할때 참조해서 생성이 되었습니다. 굉장히 오래전에 생성이 된 테이블이며 이때는 아마도 innodb를 사용하지 않았을 수 도 있구요. 스키마 내용은 본문에 있습니다.
  • profile profile
    네, 그게 문제인 것 같네요. 생성 당시에 자동으로 인식해서 관리자 대시보드를 통해 생성한 테이블이 아니라서... 혹시 스키마 파일을 복사해서 modules/member/schemas 폴더에 넣어보시면 어떨까요?
  • profile profile
    아.. 모듈 쪽에 있어야 하는거군요. 일단 그냥 애드온에서 쿼리할때 잠시 use_prepared_statements = 'N'; 로 했다가 다시 바꿔주는 것도 나쁘지는 않을 것 같습니다.
  • profile profile

    코어 설정을 수시로 바꾸는 것보다는 스키마 파일을 복사하는 것이 더 안정적인 솔루션일 듯 합니다. 애드온에서 쿼리를 쓰는 것만으로는 문제가 되지 않지만, 애드온에서 임의로 테이블을 만들면 인식하지 못하는 것 같군요.

  • profile profile
    네. 스키마 파일을 복사하는 것을 한번 고려해서 해보겠습니다.
  • profile profile
    멤버모듈 쪽으로 복사를 해봤는데 문제가 계속 되는 것 같네요. 그냥 지금 처럼 운영하는게 최선 일 것 같습니다.
  • ?
    mariadb 설정파일에서 디비 호환성 뭐를 켜줘야 할걸요.
  • ? profile
    서버세팅은 기진곰님께서 꼼꼼하게 해주셔서 서버의 문제는 아닌것 같습니다.
  • profile ?
    찾아보니 sql mode 에 관한 내용은 기진곰님이 쓰신 글이네요.