웹마스터 팁

1. 상황


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


[schemas/items.xml]


1
2
3
4
<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]


1
2
3
4
5
6
7
8
<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 함수를 통해 만들어 집니다.


정상)


1
2
3
4
5
6
${'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');


비정상)

1
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

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

제목 글쓴이 날짜
영등포오피 영등포오피 ⦑오피.CLUB⦒ 영등포OP 영등포스파 영등포오피 koykoyah 2025.02.20
제주도오피 ⦑오피쓰.COM⦒ 제주도마사지 제주도오피 제주도오피 제주도OP koykoyah 2025.02.20
안양오피 ⦑오피사이트.NET⦒ 안양OP 안양오피 안양출장샵 안양오피 koykoyah 2025.02.20
제주오피 ⦑오피쓰주소.COM⦒ 제주오피 제주OP 제주건마 제주오피 koykoyah 2025.02.20
신도림오피 ⦑오피사이트.NET⦒ 신도림오피 신도림OP 신도림건마 신도림오피 koykoyah 2025.02.20
일산오피 ⦑오피쓰주소.COM⦒ 일산마사지 일산오피 일산오피 일산OP koykoyah 2025.02.20
동두천오피 ⦑오피쓰.COM⦒ 동두천오피 동두천출장마사지 동두천오피 동두천OP koykoyah 2025.02.20
평택오피 ⦑오피쓰.COM⦒ 평택오피 평택출장마사지 평택오피 평택OP koykoyah 2025.02.20
건대오피 ⦑출장안마사이트.COM⦒ 건대마사지 건대오피 건대오피 건대OP koykoyah 2025.02.20
부산오피 ⦑출장마사지안내.COM⦒ 부산오피 부산출장마사지 부산오피 부산OP koykoyah 2025.02.20
대전오피 ⦑출장안마사이트.COM⦒ 대전OP 대전오피 대전출장샵 대전오피 koykoyah 2025.02.20
연신내오피 ⦑오피쓰.COM⦒ 연신내오피 연신내OP 연신내건마 연신내오피 koykoyah 2025.02.20
부산오피 ⦑오피.CLUB⦒ 부산오피 부산OP 부산건마 부산오피 koykoyah 2025.02.20
선릉오피 선릉출장안마 ⦑오피사이트.NET⦒ 선릉OP 선릉오피 선릉오피 koykoyah 2025.02.20
신천오피 ⦑출장마사지안내.COM⦒ 신천오피 신천OP 신천건마 신천오피 koykoyah 2025.02.20
연신내오피 ⦑오피.CLUB⦒ 연신내오피 연신내출장마사지 연신내오피 연신내OP koykoyah 2025.02.20
판교오피 ⦑출장마사지안내.COM⦒ 판교OP 판교오피 판교출장샵 판교오피 koykoyah 2025.02.20
용인오피 ⦑오피사이트.NET⦒ 용인오피 용인OP 용인건마 용인오피 koykoyah 2025.02.20
부산오피 ⦑오피쓰.COM⦒ 부산OP 부산오피 부산출장샵 부산오피 koykoyah 2025.02.20
수원오피 수원OP ⦑오피쓰.COM⦒ 수원휴게텔 수원오피 수원오피 koykoyah 2025.02.20