use_prepared_statements = 'N'; 로 운영시 문제가 되는 게 있나요?
CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 7.1 |
어제 로그인회원 식별 관련해서 오래된 애드온을 한번 살펴보는데 이상하게 쿼리가 반영이 안되어 이것 저것 해보다가 결국
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 이 팁을 보고 일단 애드온에서 해당 쿼리 직전 바꾸고 다시 쿼리 후 원래대로 돌려 놓게 해서 테스트 중입니다.
댓글 14
innodb로 바뀐 후 아마 쿼리가 반영이 안되는 것 같아 본문에 자료의 정보는 거의 대부분 적었습니다. 쿼리 직후 어떤 메시지가 어떻게 나오는지는 제가 확인을 못했습니다.
쿼리 할때
<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>
이 파일을 가지고 합니다.
use_prepared_statements = 'N';
로 했을 경우 잘 되니 이부분이 궁금해져서 질문을 하게 된 것이고 질문 내용은 1,2,3으로 나눠서 올려 봤습니다.
use_prepared_statements = Y로 설정하면 쿼리 문법과 테이블 스키마가 서로 맞아야 합니다. 훨씬 엄격하게 체크하기 때문에 약간이라도 어긋나면 에러가 날 수 있습니다. 주로 꽤 오래된 모듈이나 애드온에서 발생하는 문제인데, 단지 애드온이라는 이유만으로 안 되지는 않습니다. 현재 테이블 스키마 파일을 제대로 인식하지 못하고 있거나, 테이블 스키마 파일에 지정된 구조와 실제 테이블 구조가 다를 가능성이 높습니다.
$oDB = DB::getInstance();
if(!$oDB->isTableExists('login_check')) {
$oDB->createTableByXmlFile('./addons/login_check/schemas/login_check.xml');
}
이렇게 처음 생성할때 참조해서 생성이 되었습니다. 굉장히 오래전에 생성이 된 테이블이며 이때는 아마도 innodb를 사용하지 않았을 수 도 있구요. 스키마 내용은 본문에 있습니다.
코어 설정을 수시로 바꾸는 것보다는 스키마 파일을 복사하는 것이 더 안정적인 솔루션일 듯 합니다. 애드온에서 쿼리를 쓰는 것만으로는 문제가 되지 않지만, 애드온에서 임의로 테이블을 만들면 인식하지 못하는 것 같군요.