while문 내 for문 문의

skrkek58의 이미지

현재 공공기관에서 제공하는 날씨 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 = "&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;						// 하늘상태
		        }
			$this->decho("while end");
		}
		$this->decho("Weather insert process end.");
	}

리눅스로 크론 설정으로 해당 클래스파일이 작동하도록 하였습니다.

while문으로 regId 값을 조회하여 api를 호출하도록 작성하였습니다.

문제는 while문이 1번만 돈다는 것입니다.

while($rows = $this->db->getRow()){
	$region_code = "&regId=" . $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번만 돌고있습니다.
어디서 문제가 되는지 조언 부탁드립니다.
간단하잖아의 이미지

그럼 for문내에서 죽나 보죠

skrkek58의 이미지

while문 안에 for문이 있는경우, for문이 끝나면 자동으로 while문이 다시 돌아야하는거 아닌가요?

while문 조건은 계속 충족되어있는거같은데

네.

another level의 이미지

아니 스크립터 잖아요 그죠? 인터프리터죠?
그럼 for문 돌다가 syntax 에러등에 의해 죽나보죠
그럼 while 문 안돌고 끝나겟죠

amazing linux의 이미지

뻔히 원인이 보이는데 ...
이유를 물으시면 안되죠
개발자에게 디버깅도 경험이고 실력입니다.

skrkek58의 이미지

따끔한 말씀 감사합니다.
주의깊게 확인하겠습니다.

네.

peecky의 이미지

1
올려주신 코드에서는 for 문의 중괄호가 제대로 안 닫힌 것 같습니다.

2
while 루프가 한 번만 돈다면,
$this->db->getRow() 가 두 번째 호출되었을 때 null이나 false 등의 값을 리턴하거나,
첫번째 루프 도중에 Start() 함수가 리턴 되었거나, 프로그램이 종료된 상태일 것입니다.

$this->db->getRow()의 리턴값 확인 및, 코드 실행이 어느 라인까지 되는지 확인해보세요.

skrkek58의 이미지

1. 올린 코드가 잘못되었네요. 재 수정하였습니다.
2. 해당 부분 확인해보겠습니다.
답변 감사드립니다.

네.

skrkek58의 이미지

감사합니다.

getRow() 부분이 죽어서 발생했네요.
중복체크하면서 db 재접속하면서 while문이 끊긴것같습니다.
조언 감사드립니다.

네.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.