웹마스터 팁

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

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

제목 글쓴이 날짜
한국 ip list 범위 체크 및 데이터 갱신 마루디자인 2015.03.30
APACHE 2.4.9이상 버전에서 응답속도 향상 nikestudio 2015.03.28
확장 컴포넌트 아이콘 출력 하기 [2] file 귀머거리하늘 2013.10.18
서버의 인코딩(캐릭터셋) 환경 세팅 개념. encoding, charset, characterset, unicode, utf-8, 유니코드 마루디자인 2015.03.23
php 업그레이드 후 mb_strcut 에러 문제 콜롬보. 2015.03.21
타임라인 모듈 회원 작성글/저장글 버그 오류 수정 [7] socialskyo 2015.03.20
누리고 쇼핑몰 - 배송비가 표시 안되는 경우에 [7] garnecia 2015.01.31
누리고 Ncart V1.6.1 주문페이지에서 총구매금액에 배송비가 선결제, 착불과 상관없이 무조건 포함되어 표시되는 문제 수정방법 [2] XE템플릿 2015.03.12
게시판 가로사이즈 조절과 가운데 정렬 [1] Filmfx 2013.11.02
CentOS 에서 iptables 편집후 실행이 안될때 마루디자인 2015.03.17
[SocialXE] 트위터 로그인시 프로필 사진이 표시되지 않는 문제 해결하기 [3] file TUW 2013.02.03
카카오 API로 로그인창 만들어 봤어요~~ ^^ [6] file 컴박살 2015.02.12
싸이트 도메인 주소 뒤에 XE 디렉도리 없애기 [2] 리차드조 2015.03.09
회원정보보기를 팝업으로 띄우는 방법 콜롬보. 2015.03.13
인증메일이 안올경우 - 팁이라고 해야할지...소개라고 해야할짐 모르지만 [2] socialskyo 2015.03.07
input number 숫자만 입력받기 아이폰 예외처리 wnrtnsdl2 2015.03.12
아마존 상품API 소스中 상품정보 가져오는 소스 키스투엑스이 2015.03.10
[모듈 개발] 테이블 스키마 파일 이름은 테이블명과 동일하게 [3] 산하2 2014.05.12
css table generator Ansi™ 2015.03.04
Market 모듈에서 대표사진 필수 없애기 [3] garnecia 2015.03.03