CI 묻고 답하기

제목 특정 메뉴로 들어가면 무한 로딩 현상이발생하네요 ㅜㅜ
카테고리 CI 2, 3
글쓴이 정수리 작성시각 2016/09/13 11:24:17
댓글 : 27 추천 : 0 스크랩 : 0 조회수 : 20221   RSS

8개월차 신입니다 ㅜㅜ

 

회사프로젝트를 진행중인데 혼자 코딩을 하고있습니다 ㅜㅜ

 

ci로 프로젝트를 만들고 있는데  특정 메뉴로 들어가서 일정시간동안 버튼을 클릭하고 기능을 시험해보면

 

무한로딩이 걸리네요 ㅜㅜ 파폭만 그러는줄 알았는데 다른 브라우저들로 들어가서 확인 해보니 

 

잘되다가 시간이 좀지나면 무한로딩이 걸려버리네요 ㅜㅜ

 

파이어버그로 확인할려고해도 무한로딩이 걸려버리니 아무것도 안뜨고 참 난감하네요 물어볼 사수분도 없으셔서 

 

혼자 해결해야 하는데 ㅜㅜ  이런 경우는 어디서 부터 확인을 해야할지도 모르겠고 그래서 포럼에 글을 올리게 되었습니다.

 

특정 메뉴의 경우 일정관리라는 메뉴인데 DB의 경우 외부서버에 있는 DB와 연결되어 데이터를 등록,수정,삭제를 하고 있습니다.

 

어떤부분에서 어떤현상이 일어난다고 구체적으로 말씀드리고 싶지만 ㅜㅜ 무한로딩때문에 아무것도 안떠서 알려드릴수 있는 정보는

제가 작성한 코드밖에 없네요 ㅜㅜ 

$pg_pk = $this->uri->segment(5,0);
$gginfo['gg_no'] =기관 넘버
$gginfo['gg_name'] =기관이름
$chkurl=base_url().'index.php/gigwan_c/check_info/'.$gginfo['gg_no'].'/'.$gginfo['gg_name'];

$pg_pk = 프로그램 기본키값
<li><a href="<?= $chkurl?>/<?= $pg_pk ?>">점검&일정관리</a></li>

점검&일정관리 클릭시
function check_info(){//처음 진입시 일정관리 관련 데이터를 리스트로 출력
 $no =  $this->uri->segment(3);//기관pk
				
  $gg_name = $this->uri->segment(4);//기관명
  $this->load->model('Check_m'); 	
 $date['list'] = $this->Check_m->ck_list($no);
 $date['gginfo'] = array('gg_no' =>$no, 'gg_name' =>$gg_name);
  $this->load->view('gigwan/gg_check_v', $date);
}
--컨트롤러--
function ck_regit(){//일정관리 등록
			
			$this->load->model('Check_m');
			
			$data = array();
			foreach($this->input->post(null, true) as $key => $val) $data["{$key}"]= $val;

			$result = $this->Check_m->ck_regit($data);

			if($result){
				echo "
					<meta http-equiv='Content-type' content='text/html; charset=utf-8'>
					<script>alert('등록되었습니다');
					window.opener.parent.location.reload();
						window.close();
					</script>";
			}
		}

function ck_detail(){//1개의 일정관리 클릭 시 ajax통신을 통해 클릭한 일정관리 밑으로 데이터 출력
			
			$this->load->model('Check_m');

			$ck_pk = $this->input->post('ck_pk', true);

			$result  = $this->Check_m->ck_detail($ck_pk);

			echo json_encode($result);
		}

function check_md_popup(){//일정관리 수정
			$this->load->model('Check_m');
			
			$ck_pk =  $this->input->get('data', true);

			$data['list'] = $this->Check_m->ck_md_info($ck_pk);

			$this->load->view('gigwan/check_md_v', $data);
		}

--모델--

function ck_regit($data){//일정관리 등록

		$ck = $this->load->database('ck', true);
	    $sql = 'insert into jds_check(gg_pk, ck_gg_da, ck_pur, ck_ct, ck_result, ck_da, ck_de_ct, ck_backup, ck_cpu, ck_update, ck_memory, ck_memo, ck_up_da, ck_up_name, ck_pc_name) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
		
		$result = $ck->query($sql, array($data['gg_pk'], $data['ck_gg_da'], $data['ck_pur'], $data['ck_ct'], $data['ck_result'], $data['ck_da'], $data['ck_de_ct'], $data['ck_backup'], $data['ck_cpu'], $data['ck_memory'], $data['ck_update'], $data['ck_memo'], $data['ck_up_da'], $data['ck_up_name'], $data['ck_pc_name']));
		
		return $result;
	}

	function ck_list($data){//일정관리 전체 데이터 출력
	
		$ck = $this->load->database('ck', true);
		
		$sql = 'select ck_pk, ck_gg_da, ck_pur, ck_ct, ck_result from jds_check where gg_pk = ? order by ck_gg_da  desc';

		$query = $ck->query($sql, $data);

		$result = $query->result();

		return $result;
	}

	function ck_detail($data){//클릭한 일정관리 상세데이터 출력
		
		$ck = $this->load->database('ck', true);

		$sql ='select ck_pk, ck_up_da, ck_da, ck_de_ct, ck_backup, ck_cpu, ck_memory, ck_update, ck_memo, ck_up_name, ck_pc_name from jds_check where ck_pk=?';

		$query = $ck->query($sql, $data);

		$result = $query->row();
		
		return $result;
		
	}

	function ck_md_info($data){//수정할 일정관리의 상세정보 출력
		
		$ck = $this->load->database('ck', true);
		
		$sql = 'select ck_pk, ck_gg_da, ck_pur, ck_ct, ck_result, ck_da, ck_de_ct, ck_backup, ck_cpu, ck_memory, ck_update, ck_memo, ck_up_da, ck_up_name, ck_pc_name from jds_check where ck_pk=?';

		$query = $ck->query($sql, $data);

		$result = $query->row();

		return $result;

	}

--jquery--

$('.ck_info').click(function(){//1개의 일정관리 클릭시 jquery ajax통신하는 곳
		var ck_pk = $(this).parents('tr').find('input[name="ck_pk"]').val();

		var no = $(this).parents('tr').attr('id');
			 no = no.split("_")[1];

			 if($('#hd_'+no).css('display') == 'none'){	
				
				$("[id^='hd_']").css("display", "none");
				$('#hd_'+no).css("display", "table-row");

				$.ajax({
					type:'post',
					url:'http://172.19.93.9/jds/index.php/gigwan_c/ck_detail',
					dataType:'json',
					data:{
						ck_pk: ck_pk
					},
					success:function(data){
							var output='<table>';
							output +='<tr>';
							output +='<input type="hidden" name="ck_pk" value="'+data.ck_pk+'" />';
							output +='<td>등록일자</td>';
							output +='<td>'+data.ck_up_da+'</td>';
							output +='<td>처리일자</td>';
							output +='<td>'+data.ck_da+'</td>';
							output +='</tr>';
							output +='<tr>';
							output +='<td>세부내용</td>';
							output +='<td>'+data.ck_de_ct+'</td>';
							output +='<td>백업상태</td>';
							if(data.ck_backup == 0){						
							output +='<td>점검</td>';
							}else{
							output +='<td>확인</td>';
							}
							output +='</tr>';
							output +='<tr>';
							output +='<td>CPU사용량</td>';
							output +='<td>'+data.ck_cpu+'</td>';
							output +='<td>메모리사용량</td>';
							output +='<td>'+data.ck_memory+'</td>';
							output +='</tr>';
							output +='<tr>';
							output +='<td>os업데이트</td>';
							if(data.ck_update == 0){
							output +='<td>N</td>';
							}else{
							output +='<td>Y</td>';
							}
							output +='<td>메모</td>';
							output +='<td>'+data.ck_memo+'</td>';
							output +='</tr>';
							output +='<tr>';
							output +='<td>등록자</td>';
							output +='<td>'+data.ck_up_name+'</td>';
							output +='<td>처리자</td>';
							output +='<td>'+data.ck_pc_name+'</td>';
							output +='</tr>';
							output +='</table>';
							output  +='<input type="button" name="check_modify" value="수정">';
							$('#hd_'+no+' .test').empty();
							$('#hd_'+no+' .test').append(output);
	
						},
					error:function(status, request, error){
					alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error"+error);
					}
				});//ajax
			 
			 }else{
					$('#hd_'+no).hide();

			 }//if			
	});

수정할 일정관리 클릭시 수정팝업을 띄움
$(document).on('click', 'input[name="check_modify"]', function(){
			alert( $(this).parents('tr').find('input[name="ck_pk"]').val());
			var ck_pk = $(this).parents('tr').find('input[name="ck_pk"]').val();
			var popUrl ="http://172.19.93.9/jds/index.php/gigwan_c/check_md_popup/?data="+ck_pk;
		//var popUrl ="http://localhost/jds/index.php/gigwan_c/check_ad_popup/?data="+ck_pk;
		var popoption = "width=1200, height=800, resizable=no, scrollbars=no, status=no;";
		window.open(popUrl,"",popoption);
	});

 

 

 

 

 

 다음글 1.72 버전에서 사용중인 소스를 2.1에서 사용할 ... (1)
 이전글 테이블 데이터가져오기 하나의 모델에서 처리가능한지? (5)

댓글

한대승(불의회상) / 2016/09/13 12:26:34 / 추천 0

특정 메뉴의 URL이 어떻게 되나요?

정수리 / 2016/09/13 12:30:40 / 추천 0
한대승(불의회상) / 2016/09/13 12:34:33 / 추천 0

올려주신 소스코드중 function check_info() 부분에 디버깅 코드를 집어 넣어 단계별로 확인 해보세요.

var_dump()함수를 사용 하셔도 되고 CI 프로파일러를 살펴 보셔도 됩니다.

정수리 / 2016/09/13 12:59:06 / 추천 0

@한대승

답변감사합니다

프로파일러를 사용하라고 말씀하시는 이유가

무한로딩시점에서 어느부분에서 로딩이 걸리는지 확인하기위해서 적용하라고 하신건가요?

배강민 / 2016/09/13 14:04:29 / 추천 0

특정 메뉴로 들어가서 일정시간동안 버튼을 클릭하고 기능을 시험이란게

예제 코드로 본다면 메뉴에서 점검&일정관리에 들어가서, 뭔가를 눌러서 ck_regit()에 가는데, 무한으로 "등록되었습니다." 가 뜨다가 브라우저가 죽는다는 건가요?

 

배강민 / 2016/09/13 14:05:52 / 추천 0

아니면, 메뉴을 들어가면 뜨질 않고 계속 새로고침되다가 죽는다는건가?

무한반복되는 증상부터 명확히 알려주세요

정수리 / 2016/09/13 14:06:12 / 추천 0

@배강민

등록은 아니구요

점검&일정관리에 들어가서 

하나의 리스트를 클릭하면 ajax를 통해 해당 리스트 밑으로 상세정보가 출력하거나

메뉴를 옮겨다닐때 

그 페이지 이동이 너무 오래 걸리네요..

한대승님이 말씀하신 것처럼 코드에 프로파일러를 넣어 보았지만

무한로딩이 걸린 이후 프로파일러에 걸린시간이나 그런게 나와야하는데;

실제 걸린시간보다 훨씬 짧은 시간으로 측정이되네요

 

배강민 / 2016/09/13 14:11:48 / 추천 0

리스트의 row 마다 ck_info 클래스를 가지고 있고, 그걸 누르면 ajax를 통해서 key값을 ck_detail에 던져서, 등록일자, 처리일자 등을 나오게 하는데, 무한루프가 돈다는건가요?

계속 껌뻑이면서 그 row의 상세정보를 가져오다가 죽는건가요?

정수리 / 2016/09/13 14:13:17 / 추천 0

@배강민

네 방금 답변달아주시는 것도 포함이되요

배강민 / 2016/09/13 14:23:49 / 추천 0

<table>

<tr>

<td>

<input type="hidden" name="ck_pk" value="1" />

<a class="ck_info">aaa 상세보기</a>

<div id="hd_1" class="test"></div>

</td>

</tr>

<tr>

<td>

<input type="hidden" name="ck_pk" value="2" />

<a class="ck_info">bbb 상세보기</a>

<div id="hd_2" class="test"></div>

</td>

</tr>

</table>

 

대략 이렇게 생긴 테이블에서 상세보기를 누르면 그 아래 hd_* 에 상세정보 테이블을 넣는게 맞나요?

정수리 / 2016/09/13 14:27:01 / 추천 0
넵 대략적으로 그런형태 입니다. 제가 작성한 뷰페이지 중 하단에 출력되는 부분입니다.
                        <tr id="tr_<?=$a?>">
			<input type="hidden" name="ck_pk" value="<?= $ck->ck_pk?>" />
			<td><p class="ck_info"><?= $date ?></p></td>
			<td><p class="ck_info"><?=$test ?></p></td>
			<td><p class="ck_info"><?=$ck->ck_ct ?></p></td>
			</tr>
                        </tr>
		        <tr id="hd_<?=$a?>" style="display:none;">
		        <td class="tdst03"></td>
		        <td colspan="8" class="tdst05"><div class="test"></div></td>
		        </tr>

 

배강민 / 2016/09/13 14:35:02 / 추천 0
7라인의 </tr>은 소스코드에도 있는건가요? 댓글쓰면서 잘못 쓰신건가요?
정수리 / 2016/09/13 14:36:09 / 추천 0

@배강민

댓글 작성하면 잘못쓴거에요;; 죄송합니다

배강민 / 2016/09/13 14:39:51 / 추천 0

일단 이때문인지는 모르겠으나 로직적으로 잘못된 부분은

만약 리스트를 여러개를 다다닥 눌렀다 쳤을때, 비동기적으로 처리하셨기때문에 어떤 통신이 먼저 끝날지 알 수 없습니다.

그런데, 상세정보를 넣는 부분을 캐치하기 위해서 ajax 전에 선언한 no 이란 변수를 사용합니다.

이상황에서 여러 리턴이 오게되면 어떤 상세정보 영역을 교체해야하는지 알아낼 수 없는 구조입니다.

일단 이렇게 하려면, ajax 통신할때에 no도 넘겨서, 리턴때에 그 no도 넘겨서 그 no에 해당하는 부분을 교체해야합니다.

아니면 no을 쓰는 자리에도 ck_pk와 동일한 숫자를 넣고 그를 조작하시던가요.

정수리 / 2016/09/13 14:54:20 / 추천 0

@배강민

현재 다시 확인을 해보니

무한로딩이 걸렸다 안걸렸다 그러네요

무한로딩이 걸리는 부분

1.점검&일정관리에서 하나의 리스트를 누르면 상세정보 출력을 할때 무한로딩

2.점검&일정관리에서 다른 메뉴로 넘어갈때 무한로딩

무한로딩이라기 보다는 페이지를 넘어가는 시간이 너무 오래 걸린다고 해야 할것같네요ㅜ.ㅜ

달아주신 답변중에 이해가 안되는 부분이 있는데

여러 리턴이 오게되면 어떤 상세정보 영역을 교체해야 하는지 알수 없는 구조라고 하셨는데

뷰페이지의 반복문에 $a=1라는 변수를 정해주고

tr id="tr_<?=$a?>

tr id="hd_<?=$a?>

이렇게 해줌으로써 jquery로 tr_<?=$a?>의 pk값을 가져오며 tr id="hd_<?=$a?>의 경우 동일한 $a값을가지고 있으므로 <div></div>사이에 출력을 하도록 하였습니다.

$a를 통해 어떤 상세정보영역을 교체해야하는지 알려줄수 있도록 하였습니다;