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

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

QA

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

본문

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

 

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

 


<?php
$mydata = array(
'A' => array ( 'D' => 1 ),
'B' => array ( 'D' => 2 ),
'C' => array ( 'D' => 2 )
);
// ok now hit the api...
$basePublicAPI = 'https://api';
$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);
}
?>

이 질문에 댓글 쓰기 :

답변 2

일단 print_r($Data); 하셔서

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

그렇다면 해당 배열 키 인덱스 키를 체크 하시고
where 절을 주셔야 합니다.

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

update g5_data set no.......  where name = '".$Data[$xx]['name']."' 이런식으로 이름을 조건절에 주시던가 no 를 조건절에 주시던지요..

추가 하자면 넘어오는 데이터가 기존에 있으면 업데이트를 하고 없으면 인서트 해야 하는 걸로 보이는데요....
기존 데이터가 모두 들어가 있고 업데이트만 해야 한는 경우라면 몰라도요

no 가 변하지 않는 고유의 키값이라면 where no=~~ 하시고
no 를 기준으로 디비에 있으면 업데이트 없으면 인서트 이렇게 하셔야 모든 데이터가 들어가지요

기존 저 소스는 데이터가 10개가 와도 마지막에 업데이트 되므로 한개만 업데이트 되는것 처럼 보이는 겁니다.
즉 g5_data 데이터가 100개가 있어도 마지막 값이 모두 들어간다는 말입니다.

감사합니다. 변하지 않는 값은 A, B, C 이름은 항상 똑 같고, 나머지 넘어오는 값은 계속 변해요.

이렇게 DB에 저장하려고 하는 이유는 api로 받아서 홈페이지에 뿌려주니, 로딩 시간이 너무 오래 걸려서요.

그렇다면 이름을 기준으로 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']."' " );

이렇게 하시면 이름을 기준으로 없으면 인서트 있으면 업데이트 합니다.
그게 아니라면 테이블을 비우시고 인서트 하셔야 겠지요.

죄송합니다. 제가 이해를 못해서요. 그 말씀은 아래와 같이 고치면 된다는 말씀인가요?

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']."' " );

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']."' " );

네 변하지 않은 값이 이름이라면요

말씀하신데로 해도 데이터가 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); 
}

답변을 작성하시기 전에 로그인 해주세요.
전체 123,674 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT