asdf0904
40
2019-09-20 15:49:15 작성 2019-09-20 15:51:13 수정됨
5
533

while문 내 for문 질문


안녕하세요. 현재 공공기관에서 제공하는 api로 날씨정보 개발을 하고 있습니다.

다름이 아니라 현재 DB에 제공되는 데이터를 저장하려하는데, 반복문이 제대로 돌지않아서 막혀있어 질문드립니다.

아래는 해당 코드입니다. 언어는 php로 리눅스 crontab으로 해당 코드를 돌려서 DB내에 저장하려고합니다.


public function Start(){
		$host = "http://newsky2.kma.go.kr/service/VilageFrcstDspthDocInfoService/WidOverlandForecast?";
		$service_key = "";

		$sql = "SELECT		region_code
					FROM		T_REGION
					WHERE		seperate is NOT NULL";
		$this->db->que = $sql;
		$this->db->query();

		while($rows = $this->db->getRow()){
			$region_code = "&regId=" . $rows['region_code'];

			$this->decho("region_code = " . $rows['region_code']);

			$url = $host . $service_key . $region_code;
			$url_data = file_get_contents($url);
			$xml = simplexml_load_string($url_data, 'SimpleXMLElement', LIBXML_NOCDATA);					//날씨 방식

			$k = 0;
			$api_ar = array();
			foreach($xml->body->items->item as $value){
				$api_ar[$k] = $value;
				$k++;
			}
			
			$result_ar = array();
			
			$result = json_encode($api_ar);
			$result_ar = $result;

			for($i = 0; $i < count($api_ar); $i++){
				//중복체크
				if($i ==0){
					$chk = $this->dataCheck($api_ar[$i]->regId);
				}
				$this->decho("regId = " . $api_ar[$i]->regId . " / " . "reg_dt = " . $api_ar[$i]->announceTime . " / chk = " . $chk . " / dataCheck = " . $this->dataCheck($api_ar[$i]->regId));

				$d['reg_dt'] = $api_ar[$i]->announceTime;	// 발표시간
				$d['numEf'] = $api_ar[$i]->numEf;				// 발표번호
				$d['regId'] = $api_ar[$i]->regId;					// 지역코드
				$d['rain_per'] = $api_ar[$i]->rnSt;				// 강수 확률
				$d['rain_type'] = $api_ar[$i]->rnYn;				// 강수 타입
				$d['temperature'] = $api_ar[$i]->ta;				// 온도
				$d['wind_direction'] = $api_ar[$i]->wd1;		// 풍향
				$d['wind_direction2'] = $api_ar[$i]->wd2;	// 풍향2
				$d['wind_power'] = $api_ar[$i]->wsIt;			// 바람 세기
				$d['weather'] = $api_ar[$i]->wf;					// 날씨
				$d['sky'] = $api_ar[$i]->wfCd;						// 하늘상태

				if($d['reg_dt'] == $chk){
					$this->decho("dataCheck > if");
					break;
				}
				else{
					$this->decho("else");
					$this->db->insert("T_WEATHER", $d);
				}
			}
		}
		$this->decho("Weather insert process end.");
}

DB에서 지역코드를 가져와 while문에서 파싱하여 for문으로 데이터 확인하고 중복체크 후 저장하는 구조입니다. while문안에 for($i = 0; $i < count($api_ar); $i++){} 해당부분 코드가 없을경우, 정상적으로 regId를 가져오나 있는경우 그렇게 되지않고 있습니다.

DB등록 부분을 별도로 빼서 함수 호출하는 식으로 변경하여도 단 하나만 찍히고 첫번째 지역만 확인 후 종료됩니다.

정상적으로 된다면 while문이 174번, for문에서 5번씩하여 총 870번 돌며 데이터 등록을 해야하는데 그렇게 되지가 않습니다. 처음부터 다시 고민하며 점검해도 무슨 이유인지 잘 모르겠습니다.

서비스키 부분은 개인이 신청한거라 지우고 코드 올렸습니다.

조언 부탁드리겠습니다.


0
  • 답변 5

  • 유리세계
    3k
    2019-09-20 15:54:56

    while 조건이 재대로 먹히는지 확인해보시고

    while문 전체에 try catch로 에러가 감지 되는지도 확인해보세요

    가장 확실한건 디버그로 한 줄 한 줄 따라가보는거죠

  • asdf0904
    40
    2019-09-20 15:58:01

    while문 내 for문을 주석처리 후 테스트했을때는 정상적으로 regId 값을 가져오고 있습니다.

    다만 for문이 추가되면 한번 이후로 돌지않아서... 

    for문의 조건도 제대로 충족되고 있구요.. 

    try, catch로 한번 더 확인해보겠습니다.

    답변 감사드립니다.


  • bayleys
    1k
    2019-09-20 17:28:44
    count($api_ar)


    count(api_ar)의 값이 0일듯요.

  • asdf0904
    40
    2019-09-20 17:35:42

    count($api_ar) 값은 5로 정상적으로 나오고 있습니다.

    계속 디버깅해보니, 중복체크 부분이 돌고 난 후 for문이 끝나면 while문이 멈추네요...

    답변 감사드립니다.


  • asdf0904
    40
    2019-09-20 17:51:38

    해결되었습니다.

    while문 내에서 db 접속하여 데이터를 저장했는데, 중복체크 때 db 재접속으로 while문 조건이 깨져 발생했습니다.

    답변 모두 감사드립니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.