CI 묻고 답하기

제목 update관련 질문 입니다. 꾸벅~~
글쓴이 꾸숑 작성시각 2013/05/06 09:53:27
댓글 : 10 추천 : 0 스크랩 : 0 조회수 : 15005   RSS
현재 회원가입폼을 가변적으로 제작 하고 있습니다.
폼의 출력여부와 필수입력 여부를 관리자가 제어 합니다.
현재 view페이지등 회원가입폼과 폼검증은 이런 형태에 맞춰서 가변적으로 적용 제작하여 제대로 작동 됩니다.
관리자 페이지도 같은 방식으로 작업이 되었고요.

테스트 과정에서 문제가 발견 되었습니다.
최초에 모든 폼을 출력 하도록 설정하여 회원가입을 받은후에
나중에 일부 폼이 출력 되지 않게 설정한 후 회원정보 수정시
기존에 입력된 값중 나중에 입력하지 않은 값이(폼이 출력되지 않은  값) 0 즉 FALSE가 필드에 update 되는것입니다.

제가 원하는것은 입력값이 없을시에 FALSE가 입력되는것이 아니라 무시? 하여 기존값이 유지 되는것 입니다.

아래는 model 참고 소스 입니다.
  $data3 = array(
   'nickname' => $this->input->post('nickname', TRUE) ,
   'email' => $this->input->post('email', TRUE) ,
   'kname' => $this->input->post('kname', TRUE) ,
   'mobile' => $this->input->post('mobile', TRUE) ,
   'telephone' => $this->input->post('telephone', TRUE) ,
   'zipcode1' => $this->input->post('zipcode1', TRUE) ,
   'zipcode2' => $this->input->post('zipcode2', TRUE) ,
   'address1' => $this->input->post('address1', TRUE) ,
   'address2' => $this->input->post('address2', TRUE) ,
   'homepage' => $this->input->post('homepage', TRUE) ,
   'birthday' => $this->input->post('birthday', TRUE) ,
   'sex' => $this->input->post('sex', TRUE) ,
   'job' => $this->input->post('job', TRUE) ,
   'level' => $this->input->post('level', TRUE) ,
   'activated' => $this->input->post('activated', TRUE) ,
   'banned' => $this->input->post('banned', TRUE) ,
   'ban_reason' => $this->input->post('ban_reason', TRUE) ,
   'users_out' => $this->input->post('users_out', TRUE) ,
   'out_reason' => $this->input->post('out_reason', TRUE) ,
   'file1' => $uploadfile,
   'memo' => $this->input->post('memo', TRUE)
  );
  $this->db->where('id', $this->id);
  $this->db->update($this->table, $data3);
태그 update,array
 다음글 download helper로 다운로드시 한글깨짐 (3)
 이전글 CI 를 IIS 에서 구동시 <?=$var... (2)

댓글

변종원(웅파) / 2013/05/06 10:10:54 / 추천 0
$this->input->post('id',TRUE) 가 전송된 id값이 없으면 false를 반환합니다.

그런데 해당 필드가 int라면 0이 들어갈겁니다.

저렇게 하시는 것보다는 관리자 제어항목에 따라

'job' => $this->input->post('job', TRUE) ,    이런 항목들도 if 처리해주는 것이 맞습니다.
꾸숑 / 2013/05/06 10:29:34 / 추천 0
웅파//
답변 감사합니다.
필드 타입에 관계 없이 0 가 update 되는군요...

폼검증, 폼 등을 if문으로 처리 했는데요
이것도 if문으로 처리 해야 하겠군요..
웬~쥐 간단 처리 방법이 있을것도 같은데요 ㅎ

뭐 하나 만들라면 고려해야 할 사항이 무지 많네요 ㅎㅎㅎ

조금 새로운것 해볼라면 머리가 멍해지네요..
방금것도 조금더 생각해보니 뭐 간단한 것이었는데요 ~~~
꾸숑 / 2013/05/06 11:34:55 / 추천 0
웅파//
나름대로 뭔가 하나 배워 볼라고 이리 저리 머리 굴리다 보니 좋은 방법을 찾아 냈네요 ㅎㅎㅎ
아래 소스 적용하니 원하는것이 이루어 졌습니다.

'kname'=> $this->input->post('kname', TRUE)==TRUE? $this->input->post('kname', TRUE) : $data['kname'] ,


소설쓰다가 현실이 되는 순간이네요 ㅋ
알려 주신 if문을 조금 응용해 봤습니다.^^
/ 2013/05/06 17:31:31 / 추천 0
보다가 저도 궁금한 것도 있고 아이디어도 조금 있어서 적어봅니다.

추가 업데이트가 필요하지 않은 값들은 input을 hidden으로 처리하면

if문을 계속 쓰지 않고 그냥 써주면 될 것이고...


위방법을 사용하지 않고 해당 값을 받아 왔는지를 체크해주고 싶으시다면
isset을 이용하여 해당 변수가 전달되어 왔는지를 보면 될 것 같은데...


$data를 이용한다는 것은 기존 자료를 한번 불러오니

불필요한 쿼리를 써야 하는 것 같고 if문도 변수별로 모두 동작해야하니 뭔가 비효율적이다?;
라는 느낌이 듭니다.


꾸숑 / 2013/05/07 03:23:45 / 추천 0

키//

 'kname'=> $this->input->post('kname', TRUE)==TRUE? $this->input->post('kname', TRUE) : $data['kname'] ,

제가 사용하는 위의 소스는 아래의 소스와 같은 내용이라고 볼수 있습니다.
즉 post값이 없으면 $data['']는 불러오지 않습니다.  저는 그렇게 알고 있습니다.^^
그리고 첨부하지 않은 소스내용상 어짜피 레코드를 불러 와야 하는 상황입니다.

if ( 조건 ) {
변수 = A;
} else {
변수 = B;
}

변수 = 조건 ? A : B;

그리고 아이디어 있으면 공유해요~~

방금 게시판 본문에 글작성시 이미지를 삽입하고
삽입된 이미지들을 게시글 삭제할때 같이 삭제되는 소스를 완성 했습니다.
별도의 테이블이나 필드를 사용하지 않고도 말이지요 ㅎㅎㅎ
알면 알수록 php의 세계는 경외롭군요~~~~

/ 2013/05/07 14:06:05 / 추천 0
 아..

저는 $data 를 쓰는것에서 안써도 될 쿼리를 

해당 업데이트를 위해 굳이 불러온다고 생각했습니다.

저도 CI를 사용한지 얼마 되지 않아서 

개념상으로 몇가지 생각했던 것은 

$update=$this->input->post();

로 $_POST 내용을 전부 받아온 후

$this->db->where('idx',$update['idx']);
$this->db->update('table',$update);


이렇게 해버린다면 굳이 전달 받지 않은 변수들을 if문을 써가면서 지정을 해줄 필요가 없지 않을까
생각했습니다.

물론 전체 소스를 보지 않은 상태라 post로 받아오는 값들이 어떤식으로 되어있고

db에 등록되어야 하는게 아닌 다른 값들이 있는지는 잘 모르겠지만
(컬럼명이 맞지 않거나 없는 경우는 당연히 오류가 납니다)

저렇게 하면 더 간단하지 않을까 생각됩니다.

꾸숑 / 2013/05/07 19:01:38 / 추천 0
키//
제가 올린 소스는 뭐라 할까 일반적인 상황은 아니고요
가변폼 이라고 해야 할까요?

폼이 관리자 설정에 따라 출력될수도 안될수도 있고 출력 되더라도 필수입력 선택입력등의 옵션이 있어요
또한 단지 post로 데이터를 받아서 처리하는것도 있지만 파일업로드같이 추가적인 내용들도 있고요....

위에 게시글에 나름 설명 해 놓았는데요....
/ 2013/05/08 00:43:54 / 추천 0
 아....

장황하게 제가 의도한 바를 새로 작성해두었는데... 글이 날아갔네요...

그것도 입력을 누름과 동시에...

일단 제가 쓴 글에 대해 설명이 부족했다거나 이로인해 기분이 상하셨다면 죄송합니다. 



상당히 긴글이 날아가서 또 자세히 적으려니 힘드네요 ㅠㅠ

일단은 제 설명이 조금 부족했던 것 같아서 몇줄 추가로 적습니다.



$update=$this->input->post();

로 post의 내용을 전부 받아온 후

$update['file1']=$uploadfile;

로 파일 항목 추가.

아마 파일 입력항목이 있는 것으로 봐서

기존에 전달되어진 파일 변수가 있을 것 같은데

이부분은 업데이트 쿼리에 들어갈 경우 오류가 발생 할 수 있으니

unset($update['file_name']); 으로 배열에서 제거.

이후 업데이트

$this->db->where('idx',$update['idx']);
$this->db->update('table',$update);




위 소스를 설명 제거 하고 작성하면

$update=$this->input->post();

$update['file1']=$uploadfile;
unset($update['file_name']); 
$this->db->where('idx',$update['idx']);
$this->db->update('table',$update);


(사실 이렇게 적긴했지만 file변수가 ci 의 post에 값이 전달되어져 오는지는 테스트 못했습니다. 
값이 전달 안된다면 unset은 필요없는 구문이 됩니다. 이땐 삭제하면 됩니다.)

이렇게 하면 기존 폼이 가변이든 아니든
어짜피 폼에서 작성된 변수만 업데이트를 할 것 이기 때문에
관계없이 업데이트가 됩니다.

물론 가변이라서 폼에 생성되지 않았던 값들은 update 변수에 배열이 생성되어 있지 않기 때문에
업데이트 sql에서 해당 내용이 없으니 당연히 기본 값을 유지할 것이구요

만약 폼에서 전송되어져 온 값들이 여러개의 테이블에 나눠져서 입력되어져야 하는 값들이라면
위 소스로는 오히려 불필요한 값들을 제거 하는 작업이 더 많아져
더 불편한 소스가 될 것이구요


제가 생각하는 방법이
현재 사이트 구조나 기획에서 의도하신 바와 부합하는 것인지는 잘 모르겠지만
좀더 간단한 방법을 찾으시는 것 같아서 작성해봅니다.
수고하세요
한대승(불의회상) / 2013/05/08 09:44:57 / 추천 0
저는 타이핑이 귀찮아서... 아래 처럼 합니다.

$pdata = $this->input->post();

$fname = array(
 'name' => 'user_name',
 'desc' => 'desc'
);
  
foreach ($fname as $key => $pkey) {
 isset($pdata[$pkey]) ? $data[$key] = $pdata[$pkey] : FALSE;
}
  
$this->db->insert($table, $data);

UPDATE 는 잘 응용하셔서 하셔요.. ^^
꾸숑 / 2013/05/08 21:22:06 / 추천 0
키//
^^ 별말씀을요 답변 달아 주신걸로도 감사할 뿐입니다.
제글이 부정적으로 보였다면 사과할게요^^
나름 이렇게 php에 대해서 대화를 할수 있다는것이 제 자신은 신기할 따름 입니다.
불과 몇개월전만 해도 상상 할수 없었던 일이거든요..~~~
이렇게 대화 하다 보면 새로운 방법을 익힐수 있어 너무 좋아요....
제안하신 소스가 제 소스보더 훨신 좋아 보여요...
적용해야 겠어요~~

불의회상//
소스를 보아하니 획기적으로 소스 길이를 줄일수가 있을것 같네요^^
역시 고수의 포스가 느껴지네요^^
최소 타이핑으로 최대 효과를 가져 올수 있는 foreach문...

적용하면 소스 길이 도 많이 줄일 수 있고 웬~쮜 있어 보이는 소스네요~~~~
바로 응용 적용하여 사용할게요^^