CI 묻고 답하기

제목 액티브 레코드 update에서 테이블과 컬럼이름에 공백이 있는 경우 에러납니다.
카테고리 CI 2, 3
글쓴이 IamMonk 작성시각 2017/11/02 02:39:17
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 13148   RSS

항상 눈팅으로만 도움만 받다가 이렇게 도움을 요청합니다.

액티브 레코드로 update 사용시 (MS-SQL Server) 테이블 이름과 컬럼이름에 공백이 있는 경우 에러가 발생합니다.

그래서 SQL Server Profiler로 해당 퀘리를 보니 CI에서 이름 사이의 공백을 분리 문자로 보고 [ ]로 감싸서 보내더군요.

예를 들면,

 $this->db->where('ID',$itemID);
 $updateTest = $this->db->update('[Payable Detail_Dev]',$itemArray);

이렇게 보내면 SQL Server Profiler에는 

UPDATE [Payable] [Detail_Dev] SET [Voucher] [No] = 0, [Code] [No] = '145', [Amount] = '2309.33', [Invoice] [No] = '1709121-01', [Invoice] [Date] = '9/21/2017', [Invoice Recv] [Date] = '9/21/2017', [FC] [Amount] = '0', [Ex] [Rate] = '1', [Company] = '9', [UpdateUser] = 'lee', [Updated] = '11/01/2017 13:50:26'
WHERE [ID] = '199591'

이런식으로 공백 앞뒤 단어에 브라켓으로 감싸서 넘어옵니다.  15년이상 사용해온 액세스 데이터를 DTS (Data Transfer Service)로 정기적으로 SQL Server로 옮겨오는 거라 기존 테이블 Structure 바꾸지 못하는 상황입니다 (이거 손대면 Accounting System전체가 멈추어버리는...). 현재 그냥 SQL UPDATE 날코딩으로 올리면 문제없습니다만 액티브 레코드로 쓸 수 있는 방법이 있으면 아직 갈길이 먼 코딩이 좀 수월해질듯 한데 방법이 없을까요?

구글로 돌려봐도 해결책은 없어 보입니다만, 쿨럭~.

사용중인 시스템은,

FreeBSD 10.3,  Apache 2.4.27, PHP 5.6.31, CI 3.1.5

DB는 Windows Server 2012 R2, MS-SQL 2008R2 입니다.

 

 다음글 view에서 ajax호출시 생성자 중복 호출 관련 문제 (2)
 이전글 HMVC에서 class 생성 후 호출 (1)

댓글

한대승(불의회상) / 2017/11/02 07:46:20 / 추천 0

날쿼리를 던지는 방법밖에 없을것 같습니다.

쿼리빌더(액티브레코드)는 SQL인젝션 공격을 방어하기 위해 컬럼명과 테이블명을 검사하는 기능이 있습니다.

테이블명과 컬럼명에 한글이나 공백이 있을 경우 SQL인젝션 공격으로 인지하고 임의의 절차를 거치게 됩니다.

이 과정에서 문제가 생긴것 같습니다.

IamMonk / 2017/11/02 22:29:58 / 추천 0
@한대승(불의화상)님 답변 감사합니다. 날쿼리로 쓰는 방법밖에 없군요. 시스템 자체가 안되는 것은 아니니까 날 코딩을 위한 손가락 근육을 단련하는 수 밖에 없을 듯 합니다 ㅠㅠ...