제목 | Update에 대한 $this->db->affected_rows() 결과..... mysql 과 CI는 다르다? | ||
---|---|---|---|
카테고리 | CI 2, 3 | ||
글쓴이 | 질문학생 | 작성시각 | 2019/05/03 16:35:05 |
|
|||
안녕하세요. 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
|
kaido
/
2019/05/03 17:56:59 /
추천
0
저도 해당 부분을 뜯어봐야 정확하긴 하겠지만... 기본적으로 CI는 쿼리 캐싱을 합니다. mysql 쿼리캐싱의 기본은 동일한 쿼리가 날아올경우 오브젝트로 가지고있다가 필요하면 오브젝트만 리턴합니다 DML 도 마찬가지로 알고 있습니다. mysql이 하는 이 캐싱을 CI 드라이버 내부에서 기본적으로 합니다. 동일한 쿼리이고 변경된것이 없다면 캐싱된걸 가져다가 비교해서 보내주고 있을것 같네요. 더욱이 CI 2.x 버전의 DB 드라이버와 3.X의 드라이버의 수준 차이가 넘사벽 입니다 ( ..) 역으로 말해서 2.x 버전이 미흡한편 이고, 기존에 메뉴얼 유지도 약간 조악한 편이라서 한번 내부를 뜯어보시고 원하는 부분이 있다면 해당 부분을 수정 하시는게 좋을것 같습니다. |
네. 적용 된 행(row) 수만 나오고 에러 구분은 안되더라고요.