웹마스터 팁

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

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

제목 글쓴이 날짜
검색엔진 네이버 사이트 순위 SEO 검색엔진 최적화 작업해도 안 올라간다면.. [1] file CJM 2022.05.16
여러가지 프로토타이핑 툴 [1] 드래그홈 2014.03.26
불법광고 댓글 greentown 2021.05.18
RSS를 활용한 HelloMaster 홈페이지 새글 알리미 설정하기 [3] file 퍼니온 2009.08.16
content 위젯에서 태그로 글 뽑기 날아올라 2021.02.07
[PHP] 이름 및 연락처 마스킹 처리 [1] ppumweb 2018.05.21
Windows10 에서 IIS + mysql + PHP 설치 [10] file HSJI 2014.07.21
코드 이미지 생성해주는 사이트 [2] file reactux 2019.10.06
XE를 다른디렉토리에 설치후 리다이렉트하기 디자인플렉스 2020.04.24
게시판 글 엑셀로 출력하기(확장변수 포함) [15] 한이73 2014.07.17
관리자 아이디/비번을 잃어버렸을때, 관리자페이지 접속을 못할 때 TIP [1] file 플레이웹 2019.08.13
커뮤니션 쪽지 보내기 기능을 모바일 에서 실행시 로그인 풀림 현상 인천한량 2020.04.14
nginx 에서 서브도메인 사용시 로그인유지방법 [3] garnecia 2014.02.26
IIS에서 HTTPS를 사용하기 위한 SSL설정 (letsencrypt 인증서 설치, 갱신) file ehii 2016.04.13
AI 개발에 적합한 5가지 프로그래밍 언어 ppumweb 2020.01.06
날씨배너 600종류 입니다.(지역별75종X색상별8종) file 푸른커튼 2008.01.30
대부분 쉬운설치로 인해 홈페이지 빈 페이지가 뜨는 에러는.. CJM 2019.10.24
xe 기본회원가입품 연락처항목 공백&숫자 유효성검사 질문입니다. 해운거사2 2019.08.25
[주옥시리즈] 내글 모니터링, 작성글 앞으로 뺴기 [6] socialskyo 2013.10.18
회원가입품 연락처항목 공백잇을시 질문입니다. 해운거사2 2019.08.16