CI 묻고 답하기

제목 Update에 대한 $this->db->affected_rows() 결과..... mysql 과 CI는 다르다?
카테고리 일반
글쓴이 질문학생 작성시각 2019/05/03 16:35:05
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 248   RSS

안녕하세요.

https://codeigniter-kr.org/user_guide_2.1.0/database/helpers.html 에보면

$this->db->affected_rows()

insert, update등 뭔가를 쓰는 형태의 쿼리를 수행할때 적용된 결과 열수를 리턴합니다.

주의: MySQL 에서 "DELETE FROM TABLE" 쿼리에 이함수를 사용하면 0을 리턴하는 경우가 있습니다. 데이터베이스 클래스는 제대로된 열수를 리턴하는 방법을 핵(Hack)의 형태로 제공합니다. 기본값은 이 핵이 활성화된 상태이나 , 데이터베이스 드라이버파일에서 비활성으로 바꿀 수 있습니다.

 

라고 적혀있습니다.

 

그러나 실질적으로 sqlgate 쿼리에서 UPDATE `support_faq` SET `order_no` = 5WHERE `idx` = '66' 를 계속 실행하면 

fail이 아니라 1행이 변경됐다고 계속 뜹니다. 그러나 CI 에서는  $this->db->affected_rows() 로 가지고 올때  변경인 이뤄지지 않으면 0을 내려주는것같습니다.

 

mssql 툴에서는 변경됐다고 뜨는데 말이죠...

 

 

즉 insert, update등 뭔가를 쓰는 형태의 쿼리를 수행할때 적용된 결과 열수를 리턴합니다.

는 즉 바뀐것이 없다면 false 를 떨어트리네요

 

 

$this->db->affected_rows() 로는 

 

쿼리에서 에러났을때와  변경이 안생겼을때와를 구분을 못하는건가요 ?

 다음글 CI + Smarty로 개발설정을 하고싶습니다. (1)
 이전글 쿼리를 반복해서 날리고 싶은데 그 방법을 도저히 모르겠... (2)

댓글

가리비 / 2019/05/03 16:58:57 / 추천 0

네. 적용 된 행(row) 수만 나오고 에러 구분은 안되더라고요.

kaido / 2019/05/03 17:56:59 / 추천 0

저도 해당 부분을 뜯어봐야 정확하긴 하겠지만...

기본적으로 CI는 쿼리 캐싱을 합니다. 

mysql 쿼리캐싱의 기본은 동일한 쿼리가 날아올경우 오브젝트로 가지고있다가 필요하면 오브젝트만 리턴합니다

DML 도 마찬가지로 알고 있습니다.

mysql이 하는 이 캐싱을 CI 드라이버 내부에서 기본적으로 합니다.

동일한 쿼리이고 변경된것이 없다면 캐싱된걸 가져다가 비교해서 보내주고 있을것 같네요.

더욱이 CI 2.x 버전의 DB 드라이버와 3.X의 드라이버의 수준 차이가 넘사벽 입니다 ( ..)

역으로 말해서 2.x 버전이 미흡한편 이고, 기존에 메뉴얼 유지도 약간 조악한 편이라서 한번 내부를 뜯어보시고 원하는 부분이 있다면 해당 부분을 수정 하시는게 좋을것 같습니다.