while문 내 for문 문의
글쓴이: skrkek58 / 작성시간: 금, 2019/09/20 - 2:10오후
현재 공공기관에서 제공하는 날씨 api로 개발 중에 있습니다.
DB내로 데이터를 저장하고 원하는 시점에 날씨정보를 받아보고 싶어서 DB에 넣는 코드를 짜는 중,
모르는 사항이 있어서 작성하였습니다.
작성언어는 php 입니다.
$serviceKey 의 경우, 개인꺼라 우선은 지우고 나머지 코드 올렸습니다.
public function Start(){ $host = "http://newsky2.kma.go.kr/service/VilageFrcstDspthDocInfoService/WidOverlandForecast?"; $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 = "®Id=" . $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; // 하늘상태 } $this->decho("while end"); } $this->decho("Weather insert process end."); }
리눅스로 크론 설정으로 해당 클래스파일이 작동하도록 하였습니다.
while문으로 regId 값을 조회하여 api를 호출하도록 작성하였습니다.
문제는 while문이 1번만 돈다는 것입니다.
while($rows = $this->db->getRow()){ $region_code = "®Id=" . $rows['region_code']; $this->decho("region_code = " . $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++; } }
하단에 for문이 없을경우, regId가 정상적으로 174건이 조회되나 for문을 넣게되면 단 한번만 돕니다.
원래라면 while문이 174번, for문이 5번 해서 총 870번으로 돌아 데이터를 저장해야되나 현재는 5번만 돌고있습니다.
어디서 문제가 되는지 조언 부탁드립니다.
Forums:
그럼 for문내에서 죽나 보죠
그럼 for문내에서 죽나 보죠
while문 안에 for문이 있는경우, for문이
while문 안에 for문이 있는경우, for문이 끝나면 자동으로 while문이 다시 돌아야하는거 아닌가요?
while문 조건은 계속 충족되어있는거같은데
네.
아니 스크립터 잖아요 그죠? 인터프리터죠?
아니 스크립터 잖아요 그죠? 인터프리터죠?
그럼 for문 돌다가 syntax 에러등에 의해 죽나보죠
그럼 while 문 안돌고 끝나겟죠
뻔히 원인이 보이는데 ...
뻔히 원인이 보이는데 ...
이유를 물으시면 안되죠
개발자에게 디버깅도 경험이고 실력입니다.
따끔한 말씀 감사합니다. 주의깊게 확인하겠습니다.
따끔한 말씀 감사합니다.
주의깊게 확인하겠습니다.
네.
1
1
올려주신 코드에서는 for 문의 중괄호가 제대로 안 닫힌 것 같습니다.
2
while 루프가 한 번만 돈다면,
$this->db->getRow() 가 두 번째 호출되었을 때 null이나 false 등의 값을 리턴하거나,
첫번째 루프 도중에 Start() 함수가 리턴 되었거나, 프로그램이 종료된 상태일 것입니다.
$this->db->getRow()의 리턴값 확인 및, 코드 실행이 어느 라인까지 되는지 확인해보세요.
1. 올린 코드가 잘못되었네요. 재 수정하였습니다.
1. 올린 코드가 잘못되었네요. 재 수정하였습니다.
2. 해당 부분 확인해보겠습니다.
답변 감사드립니다.
네.
감사합니다.
감사합니다.
getRow() 부분이 죽어서 발생했네요.
중복체크하면서 db 재접속하면서 while문이 끊긴것같습니다.
조언 감사드립니다.
네.
댓글 달기