웹마스터 팁

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

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

제목 글쓴이 날짜
관리자 로그인시 원하는걸 보여주자 [5] 빽짱구 2008.04.15
수정,삭제 버튼을 "이 게시물을.."에 넣기 [1] hangoon 2008.04.16
엑소버드 음악 제로보드XE에 구겨넣기... [8] artlab 2008.04.17
ARTLAB님 팁을 참고하여 약간 변형 & 쫄쫄이 스토커 해상도에 상관없이 달기 [3] 탑심 2008.04.18
글 순서 바꾸기 임시방편 [6] 장운주 2008.04.18
댓글창에서 프로필이미지가 없는 경우 기본이미지 출력하기 [8] file 카카달려 2008.04.19
zbxe 기본글꼴(폰트) 바꾸는 방법 [9] file 핸디지 2008.04.22
디버그모드 변경하는 간단한 파이썬 스크립트 [4] mmx900 2008.04.23
제로보드XE에 배경음악 달기 [4] Dr.Mabin 2008.04.26
졸졸이 스토커 가두어보기 2탄(보드우측에 포함된 것처럼) [1] file 갯가 2008.04.26
제로보드에 BGM 달기 (대폭 수정;;) [5] Dr.Mabin 2008.04.27
각 페이지에 쓸 수 있는 변수명들 찾기 [6] lainfox 2008.04.29
링크가 걸린 글의 색을 무지개색으로 나타내기 재미니님 2008.04.29
홈페이지에 이미지블릿 대신 특수문자로 표현해 보기 file 팔공산 2008.04.29
windows Live writer로 게시글 쓰기 [3] file tindrum 2008.04.29
최근글 - 본문 내용 뽑아내기 [9] 夜飛 2008.05.01
상단에 PHP 오류구문이 출력될시 [6] sbshs77 2008.05.01
제한된 시간 안에 글을 또 등록할 때 IP 금지 기능(스팸필터) 해제하기 [3] 비나무 2008.05.03
메인메뉴에서 2차메뉴가 1차메뉴를 따라다니는 롤오버 메뉴로 만들기 [13] 우야노 2008.05.03
주문형게시판 만들기 [22] file 팔공산 2008.05.04