CI 묻고 답하기

제목 database update query 중에 date 부분 질문입니다
글쓴이 ryuppp 작성시각 2012/12/14 12:03:56
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 14361   RSS
자바만 하다가 이제 막 CI 시작한 초보입니다. db업뎃에 관해 질문드립니다. 
제가 model의 function에서 date_deadline 이라는 DATE 형태의 자료를 update하려고 합니다. 
아래와 같은 코드로 작성했는데요, 주어진 name과 part로 where에 따라 테이블 안의 자료 위치도 잘 찾아서 업뎃을 하긴 하는데 
그 값이 0000-00-00 (yyyy-mm-dd)식으로 모두 0으로만 업데이트됩니다. 에러메세지는 없구요. 
원래 $new_due_date은 받아올때 Dec 25 2012 식으로 되어 있어서 아래처럼 strtotime을 사용해서 2012-12-25 식으로 
바꿨습니다.
도움될만한 조언을 부탁드립니다.
(참고로 맨 아래 주석처리한 echo는 해보면 new_due_date도 2012-12-25 이런식으로 잘 나옵니다. name, part도 물론 정확하구요, 상황은 테이블이 총 3개인데 첫번째에서 id를 가져와서 두번째에서 그걸 써서 다시  다른id를 찾아서 마지막 테이블의 한 부분을 업뎃하는 경우입니다.)

public function update_new_due_date ($new_due_date = null, $name = null, $part = null) 
    {
    if($new_due_date === null || $name === null || $part === null)
    {
    throw new Exception("No new_due_date given");
    }
    $program_emphasis_id = $this->db->select('id')
    ->from('program_emphasis')
    ->where('name', $name)
    ->get()->result_array();
 
    $conceptual_application_term_id = $this->db->select('id')
      ->from('conceptual_application_term')
      ->where('program_emphasis_id', $program_emphasis_id[0]['id'])
      ->get()->result_array();
 
    $this->db->set('date_deadline', date('Y-m-d', strtotime($new_due_date)), FALSE); //여기가 문제인듯 합니다.
    $this->db->where('conceptual_application_term_id', $conceptual_application_term_id[0]['id']);
    $this->db->where('part', $part);
$this->db->update('conceptual_application_part_deadline');    
 //   echo date('Y-m-d', strtotime($new_due_date));
 //   echo $name;
 //     echo $part;
    }

감사합니다. 
 다음글 [초보] JOIN문 질문이요 (4)
 이전글 파일 업로드 mime 문제 (2)

댓글

milosz / 2012/12/14 12:10:07 / 추천 0
$this->db->set('date_deadline', date('Y-m-d', strtotime($new_due_date)), FALSE);
false 
빼면 어떤 결과가 나오나요?
ryuppp / 2012/12/14 12:13:10 / 추천 0
 아!!! milosz님, 감사합니다. 되는데요!! 제가 아무 생각없이 검색하다가 자연스레 FALSE를 넣었는데...
저도 좀 더 공부해보겠습니다만, 혹시 왜 그부분이 문제인지 간단하게라도 알려주실수 있을까요?
감사드립니다. ^^


milosz / 2012/12/14 12:34:37 / 추천 0
액티브레코드에서 보안을 위해서 따옴표 등을 escape하기도 하고 `으로 자동으로 감싸기도 하는 등 착한짓(?)을 하도록 되어 있는데 false를 지정해야 하는 경우가 종종 있습니다. 가령 다른 필드값을 이용할 때에는 문자열이 되면 안되니까요.
 
예를 들면 date_deadline 필드의 값을 created_date 필드 값을 이용하고 싶을 때
$this->db->set('date_deadline', 'created_date');
로 입력하면 `date_deadline` = 'created_date' 가 되어 문자열로 저장을 하려 할겁니다. 이런 경우에 사용하죠.
$this->db->set('date_deadline', 'created_date', false);
일반적인 경우는 코드이그나이터가 알아서 잘 하는데 가끔 특수한 경우가 있습니다.
위 예시는 false 안해도 정상 동작할지도 모릅니다... 안써서 가물가물 하네요 -_;
ryuppp / 2012/12/15 04:24:19 / 추천 0
 친절하게 알려주셔서 감사합니다, milosz님.
 메뉴얼만 보다가 이렇게 보니 훨씬 더 와닿게 이해가 되는군요.