웹마스터 팁

1. 상황


모듈 개발 중 테이블 스키마와 쿼리를 아래처럼 만들고 excecuteQuery를 때렸습니다.


[schemas/items.xml]


<table name="test_items">
<column name="item_srl" type="number" size="11" notnull="notnull" auto_increment="auto_increment" primary_key="primary_key	" /> 
<column name="display_name" type="varchar" size="50" />
</table>


[queries/insertItem.xml]


<query id="insertItem" action="insert">
    <tables>
        <table name="test_items" />
    </tables>
    <columns>
        <column name="display_name" var="display_name" maxlength="50"/>
    </columns>
</query>


당연히 insert가 되었을 줄 알았지만 에러가 났습니다.


error: Unknown column 'xxx' in 'field-list'


헐... 'xxx'는 값인데 컬럼이라니.


쿼리문을 찍어 봤습니다.


INSERT  INTO `xe_test_items`  (`display_name`)  VALUES (`xxx`)


값에 `(어퍼스트로피)가 씌워져 있는 것이 문제의 원인이었습니다.


2. 추적


끊질긴 추적 끝에 쿼리 캐쉬 파일(files/cache/queries/)이 다른 것들과 차이가 있음을 발견했습니다.

* 쿼리 캐쉬 파일은 DB.class.php의 checkQueryCacheFile 함수를 통해 만들어 집니다.


정상)


${'document_srl206_argument'} = new Argument('document_srl', $args->{'document_srl'});
${'document_srl206_argument'}->checkFilter('number');
${'document_srl206_argument'}->checkNotNull();
if(!${'document_srl206_argument'}->isValid()) return ${'document_srl206_argument'}->getErrorMessage();

if(${'document_srl206_argument'} !== null) ${'document_srl206_argument'}->setColumnType('number');


비정상)

if(isset($args->display_name)) {${'display_name14_argument'} = new Argument('display_name', $args->{'display_name'});if(!${'display_name14_argument'}->isValid()) return ${'display_name14_argument'}->getErrorMessage();} else

정상과 달리 setColumnType이 누락되어 있었습니다.

다시 쿼리 캐쉬 파일을 만들어 내는 부분을 추적해봤습니다.
QueryTag.class.php 클래스의 setTableColumnTypes 함수에서 QueryParser::getTableInfo 함수를 통해 가져온 테이블 정보가 비어 있었습니다.

QueryParser::getTableInfo는 다음 과정을 통해 테이블 스키마 파일을 찾아 냅니다.

1) 인자로 넘어 온 $query_id 문자열을 .(도트) 문자로 분리.

2개로 분리되면 
target : 'modules'
module : $id_args[0]
query id : $id_args[1]

3개로 분리되면
target : $id_args[0] ( modules or addons or widgets )
module : $id_args[1]
query id : $id_args[2]

2) 위 정보를 토대로 modules 디렉토리 아래에 있는 module 디렉토리로부터  인자로 들어온 테이블 이름에 해당하는 스키마 파일을 가져 옵니다.

3) 없으면, modules 디렉토리의 하위 디렉토리들의 shemeas 폴더를 순회하면서 일치하는 것이 있는지 검사합니다.

3. 원인

테이블 이름은 test_items이지만 스키마 파일 이름은 items.xml이다보니,

modules 하위 디렉토리 순회 과정에서 스키마 파일을 찾지 못해 결과적으로 setColumnType 코드를 쿼리 캐쉬 파일에 기록하지 못한 것이었습니다.

스키마 파일을 못 찾았을 때 에러를 출력해주면 좋았을텐데 TT

시간을 좀 낭비했지만 덕분에 매뉴얼에도 없는 소중한 정보들을 몇가지 알게 되어 공유합니다. ^^

제목 글쓴이 날짜
제가 쓰는 자동링크 (스킨수정) [4] okiz 2014.04.29
PHP 5.4 대응 코딩(1) - stdClass YJSoft 2014.04.29
추천수로 제목에 효과주기 [15] こさき! 2014.04.29
CentOS 6.5 웹로그 모니터링 awstats 설치하기 [1] lililiillililiil 2014.04.29
CentOS 6.5 rrdtool 사용하는 Collectd 설치 lililiillililiil 2014.04.29
CentOS 6.5 MRTG 설치 lililiillililiil 2014.04.29
폰갭 제작시 자바스크립트로 get 변수 전달 받기 웹빌드 2014.04.30
*LI-NA님의 큰 선물* SKETCHBOOK5 (최신버전)에서 특정 확장변수를 추천하는 사람에게만 공개하도록 하는 방법 [4] file 큰성565 2014.04.30
사용 언어별로 다른 내용 출력하기 [5] elancer 2014.05.01
갑자기 사이트 세팅을하던도중 DB line 674 에러 대처법 xe공부중44 2014.05.01
게시판 글쓰기 폼은 없이 확장변수만 표시할 수 있는 게시판 만들기 (for sketchbook5 최신버전 기준) [2] 큰성565 2014.05.02
XE 알림센터&새글알림애드온 위치 조정하는 법 [2] XE힘들당휴 2014.05.04
출석부 모바일에서 출석이 혹시 안될경우. [6] BJ람보 2014.05.06
비회원 GPS 정보 처리 웹빌드ver2 2014.05.09
이메일 주소로 계정 찾기시 잘못된 계정 인증요청이라고 뜰때 임시 대처법 file 루비스코 2014.05.10
푸시윙 댓글푸쉬서비스 소셜댓글 모드도 추가하기 [2] file XE힘들당휴 2014.05.11
[모듈 개발] 테이블 스키마 파일 이름은 테이블명과 동일하게 [3] 산하2 2014.05.12
프로필 사진 저장시 잘려서 저장되는 경우 [11] YJSoft 2014.05.15
스케치북 추천+등록을 활용한 비추천+등록 버튼 만들기 [2] file oscarmike 2014.05.16
xe_documents DB 테이블이 깨져서 게시판이 엉망이 됄경우 file 지으니 2014.05.17