테스트 사이트 - 개발 중인 베타 버전입니다

api 데이터를 주기적으로 db에 저장 및 업데이트 2번째 질문입니다. 채택완료

강산몽 6년 전 조회 3,081

@유진아빠님 도움으로 아래 코드 업데이트는 되는데, 문제는 단발성이 아닌 주기적 업데이트 하려고 합니다. 

 

아래 실행하면, 마지막 레코드인 C만 실행되어요. A와 B도 불러와 업데이트하려면 어떻게 수정해야 하나요? 

 

</p>

<p><?php

$mydata = array(

'A' => array ( 'D' => 1 ),

'B' => array ( 'D' => 2 ),</p>

<p>'C' => array ( 'D' => 2 )

);

// ok now hit the api...

$basePublicAPI = '<a href="https://api';" target="_blank" rel="noopener noreferrer">https://api';</a>

$Data = file_get_contents($basePublicAPI);

$Data = json_decode($Data, true);

$numbases = sizeof ($Data);

$portfolioValue = 0;

for ( $xx=0; $xx<$numbases; $xx++) {

$thisname = $Data[$xx]['name'];

$Held = array_key_exists($thisname, $mydata);

if ( !$Held ) { continue; }

        $sql = " update g5_data

                    set no = '"."$Data[$xx]['no']."',

                    name = '".$Data[$xx]['name']."' ";

        sql_query($sql);

}

?></p>

<p>

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
유찬아빠

일단 print_r($Data); 하셔서

데어터가 몇개가 오는지 부터 확인하셔야 할듯합니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 13개

강산몽
6년 전
현재 데이터는 C만 오는데요, 향후 D, E, F가 추가 될 수 도 있고, 경우에 따라서는 A만 올 경우도 있어요. 필요에 때라 A, B, C와 추가 D, E, F 등 정의하려고 합니다.
유찬아빠
6년 전
그렇다면 해당 배열 키 인덱스 키를 체크 하시고
where 절을 주셔야 합니다.

인서트 할게 아니고 업데이트 만 하신다면요

update g5_data set no....... where name = '".$Data[$xx]['name']."' 이런식으로 이름을 조건절에 주시던가 no 를 조건절에 주시던지요..
유찬아빠
6년 전
추가 하자면 넘어오는 데이터가 기존에 있으면 업데이트를 하고 없으면 인서트 해야 하는 걸로 보이는데요....
기존 데이터가 모두 들어가 있고 업데이트만 해야 한는 경우라면 몰라도요
유찬아빠
6년 전
no 가 변하지 않는 고유의 키값이라면 where no=~~ 하시고
no 를 기준으로 디비에 있으면 업데이트 없으면 인서트 이렇게 하셔야 모든 데이터가 들어가지요
유찬아빠
6년 전
기존 저 소스는 데이터가 10개가 와도 마지막에 업데이트 되므로 한개만 업데이트 되는것 처럼 보이는 겁니다.
즉 g5_data 데이터가 100개가 있어도 마지막 값이 모두 들어간다는 말입니다.
강산몽
6년 전
감사합니다. 이렇게 하면 어떨까요? 먼저 테이블에 있는 모든 데이터 delete하고 다시 insert 그리고 또 15분후 모든 데이터 delete하고 다시 insert하면 될 것 같아서요. ㅠ
유찬아빠
6년 전
그렇게 하셔도 되지만..
넘어오는 값중에 변하지 않는 값이 없나요?
유찬아빠
6년 전
추후에 데이터양이 많아지면 별로 추천드리고 싶지 않습니다.
강산몽
6년 전
감사합니다. 변하지 않는 값은 A, B, C 이름은 항상 똑 같고, 나머지 넘어오는 값은 계속 변해요.

이렇게 DB에 저장하려고 하는 이유는 api로 받아서 홈페이지에 뿌려주니, 로딩 시간이 너무 오래 걸려서요.
유찬아빠
6년 전
그렇다면 이름을 기준으로 no 가 달라지거나 없데이트 된다는 말씀이군요...

sql_query("insert into g5_data ( no, name ) values ( '".$Data[$xx]['no']."' , '".$Data[$xx]['name']."' ) ON DUPLICATE KEY UPDATE name= '".$Data[$xx]['name']."' ,no = '".$Data[$xx]['no']."' " );

이렇게 하시면 이름을 기준으로 없으면 인서트 있으면 업데이트 합니다.
그게 아니라면 테이블을 비우시고 인서트 하셔야 겠지요.
강산몽
6년 전
죄송합니다. 제가 이해를 못해서요. 그 말씀은 아래와 같이 고치면 된다는 말씀인가요?

if ( !$Held ) { continue; }
$sql = " update g5_data
set no = '"."$Data[$xx]['no']."',
name = '".$Data[$xx]['name']."' ";
sql_query("insert into g5_data ( no, name ) values ( '".$Data[$xx]['no']."' , '".$Data[$xx]['name']."' ) ON DUPLICATE KEY UPDATE name= '".$Data[$xx]['name']."' ,no = '".$Data[$xx]['no']."' " );
유찬아빠
6년 전
if ( !$Held ) { continue; }
sql_query("insert into g5_data ( no, name ) values ( '".$Data[$xx]['no']."' , '".$Data[$xx]['name']."' ) ON DUPLICATE KEY UPDATE name= '".$Data[$xx]['name']."' , no = '".$Data[$xx]['no']."' " );

네 변하지 않은 값이 이름이라면요
강산몽
6년 전
말씀하신데로 해도 데이터가 update 되지 않네요. 일단은 주기적으로 데이터 삭제 후 insert하려고요. 그런데도 아래와 같이 해도 delete가 되지 않아요. 어떻게 변경하면 될까요?

아래 코드를 15분마다 돌리게 하려고 하는데, 원하는데로 삭제 => 삽입이 되지 않아요. ㅠ

if ( !$Held ) { continue; }
$sql = "truncate g5_data";
$sql = " insert into g5_data
set no = '"."$Data[$xx]['no']."',
name = '".$Data[$xx]['name']."' ";
sql_query($sql);
}

댓글을 작성하려면 로그인이 필요합니다.

유찬아빠

if ( !$Held ) { continue; }          $sql = "truncate g5_data"; 

        sql_query($sql); 

        $sql = " insert into g5_data                      set no = '"."$Data[$xx]['no']."',                      name = '".$Data[$xx]['name']."' ";          sql_query($sql);  }

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인