개요
크롤링 모니터링 페이지를 만들다가 결국 완성해서 이렇게 적어본다.
php랑 db랑 카테고리를 어디로 할까 하다가 ㅇㅅㅇ.. db가 좀더 핵심적인 부분같아서 db카테고리에 넣었따
오늘의 주제
핵심 과정이었던 여러개의 테이블에서 값 참조하는 것.
사실 알고나면 별로 안어렵다. 내가 몰랐던 거라 어려웠음
참고
https://lightblog.tistory.com/84
진행 과정
1. 테이블 구조 파악하기
먼저 주어진 테이블은 총 3개가 있다.
1. LogItemState
크롤링 된 데이터가 갱신되어 로그를 쌓는 테이블이다.
logitemStateIdx = 로그 인덱스
itemIdx = 아이템 인덱스, 이놈을 가지고 다른 테이블에 가서 찾아야됨
status = 물품의 상태, 입고, 품절, 삭제 가 있다.
registDate = 갱신된 시간
2. Item
크롤링한 모든 상품이 쌓이는 테이블이다. 가로가 너무 길어서 스샷은 간단하게 찍었음. 여기서 필요한건 4가지임
itemIdx = 위에서 찾은 아이템 인덱스로 얘를 가져온다.
rssSiteIdx = 해당 상품을 가지고 있는 사이트의 인덱스를 가지고 있는 놈이다.
linkUrl = 상품 링크임
tag = 쇼핑몰에서 제공하는 상품의 카테고리 명
3. rssSite
크롤링 대상이 된 쇼핑몰들의 리스트가 죽 나열되어있다. 총 46개임 여기서 필요한 정보는 2가지.
rssSiteIdx = Item 테이블에서 가져온 rssSiteIdx와 비교할것이다.
content = 쇼핑몰 이름
2. php문 짜기
일단 내가 원하고자 하는 이미지는 이런것이다. UI는 한참전에 구현해놨음
이렇게 쭉 내려오다가 갱신된 상품 갯수만 출력해주도록 한다.
<div class="crawling_test">
<div class="card card-statistics h-100">
<div class="card-body">
<table class="table table-striped">
<thead>
<tr>
<th> 구분 </th> <!-- 신규, 삭제, 품절, 입고 !-->
<th> 상품명 </th> <!-- 상품 이름 !-->
<th> 쇼핑몰명 </th> <!-- 쇼핑몰명 !-->
<th> 태그(카테고리) </th> <!-- 카테고리 !-->
<th> 갱신 시간 </th> <!-- 갱신 시간 !-->
</tr>
</thead>
<tbody>
<?
crawling_print();
?>
</tbody>
</table>
갱신된 상품이 <span style="color:red"><strong> '<? echo $updatedItemCount ?>' </strong></span> 개 있습니다.
</div>
</div>
</div>
코드는 이렇다.
<?php
$updatedItemCount = 0; //갱신된 상품의 갯수를 저장할 전역변수 선언
function crawling_print() {
$mysql_host = '블라블라';
$mysql_user = '블라블라';
$mysql_pwd = '블라블라';
$mysql_db = '블라블라';
$con = mysqli_connect($mysql_host, $mysql_user, $mysql_pwd, $mysql_db) or die("서버 접속에 실패 했습니다. 계정 또는 패스워드를 확인하세요.");
mysqli_select_db($con, $mysql_db) or die("DB 연결에 실패 했습니다. 데이터베이스명을 확인하세요.");
mysqli_set_charset($con,"utf8");
//위에서부터 여기까지는 그냥 db연결하는 곳이다. 신경쓰지말자
//여기서 위의 참조 링크를 보면서 이해하는게 더 빠를거임
$db_query = "SELECT L.status, L.registDate, I.linkUrl, I.title, I.tag, R.content FROM LogItemState AS L LEFT JOIN Item AS I ON L.itemIdx = I.itemIdx LEFT JOIN RssSite AS R ON I.rssSiteIdx = R.rssSiteIdx ORDER BY L.registDate DESC";
//간단하게 말하자면, LogItemState를 L로, Item을 I로, RssSite를 R로 별칭지정하고, 거기서 필요한 정보만 select문에서 가져온다
//그다음, LEFT JOIN을 써서 내가 원하는 조건인 다른 테이블에 있는 속성들만 가져오도록 한다. 마지막엔 갱신시간 내림차순으로 정렬함.
$db_result = mysqli_query($con, $db_query);
//여기도 db연결하는곳
//여기는 쿼리문 결과를 배열로 만들어서 인덱스0부터 끝까지 while문 돌린거다.
while( $db_row = mysqli_fetch_array($db_result) ){
//이부분이 좀 복잡한데, html문과 섞어써야되서 그렇다. "랑 ' 가 많아서 눈이 아픈데..ㅠㅠ 이렇게 하는 수밖에없다..
echo '<tr><td>' . $db_row[ 'status' ] . '</td><td> <a href="' . $db_row[ 'linkUrl' ] . '"target="_blank">'. $db_row[ 'title' ] . '</a></td><td>' . $db_row[ 'content' ] . '</td><td>' . $db_row[ 'tag' ] . '</td><td>' . $db_row[ 'registDate' ] .'</td></tr>';
//위에서 선언한 갱신 상품 갯수 ++ 해주기
global $updatedItemCount;
$updatedItemCount++;
}
}
?>
주석에 앵간한 설명 다써놨다.
혹시 잘 이해안가는 부분있으시면 댓글 달아주십쇼
결과
이렇게 업데이트 될때마다 업뎃된당
'Backend > DB' 카테고리의 다른 글
[Oracle] date 타입 컬럼 String으로 가져오기 (0) | 2020.07.30 |
---|---|
[DBeaver] 설치하기 및 DB연결 (0) | 2020.07.21 |
[에러] Oracle ORA-01747 열명을 올바르게 지정해 주십시오 (0) | 2020.07.20 |
[에러] Oracle ORA-00904: 부적합한 식별자 (0) | 2020.07.16 |
[Mysql] 문자열 붙이기, 문자열 자르기, 문자열 추가하기 (0) | 2020.02.13 |