접속경로 링크 출력 > 강의(과거자료)

본문 바로가기

강의(과거자료)

접속경로 링크 출력

페이지 정보

작성자 BiHon 댓글 0건 조회 17,556회 작성일 01-12-18 23:54

본문

▶ 접속경로 링크 출력

"접속경로 기록하기" 강의글에 실린 예제에서 접속경로가 referer.cgi 파일에 저장이
됩니다. 그때 다룬 예제에서 방문횟수와 접속경로가 그대로 출력이 되었는데 자동으로
링크를 거는 방법과 그 횟수 기준으로 출력하는 방법에 대해 문의가 여러번
있었습니다.

때문에 이번 글에선 그 문제를 처리해보도록 하겠습니다.


기존의 파일 내용 일부는 다음과 같습니다. (referer.cgi)

57 Bookmark or Typing Moving<br>
1133 http://nzeo.com/bbs/zboard.php?id=p_bihon&page=1&category=1&sn=of...
299 http://nzeo.com/bbs/zboard.php?id=p_bihon&no=41<br>
252 http://www.nzeo.com/bbs/zboard.php?id=p_bihon&page=1&category=1&s...

앞에서 11칸은 카운트 횟수로, 그 다음부터 접속 경로와 <br> 태그 형식으로 기록이
되었죠. ^^


처리 순서를 살펴볼까요? (순서대로 스스로 코딩을 해보세요.)

1. 먼저 파일의 내용을 읽습니다.
2. 한줄씩 방문횟수와 접속경로를 분리해 출력합니다.

앗! 너무 간단하죠...? 조금 늘려볼까요...?


1. 파일의 내용을 읽습니다.
2. 정렬을 합니다.
3. 방문횟수와 접속경로를 출력합니다.

그래도 간단하네요. 네~ 그렇습니다. 오늘 다룰 코드는 사실 너무나 간단합니다.


먼저 아래의 소스를 보세요.


▷ link.php
--------------------------------------------------------------------------------
<?

$filename = "referer.cgi"; // 파일명 지정

$fp = fopen($filename,"r"); // 읽기 모드로 열기
$temp = fread($fp,filesize($filename)); // 크기만큼 읽기
fclose($fp); // 닫기

$temp = str_replace("<br>","",$temp); // <br> 태그 제거
$data = explode("\n",$temp); // 줄 기준으로 분리
rsort($data); // 역순정렬

$size = sizeof($data)-1; // 배열의 크기 구함

echo "<style>
<!--
a:link { color:#666666; text-decoration:none; }
a:active { color:#666666; text-decoration:none; }
a:visited { color:#666666; text-decoration:none; }
a:hover { color:#666666; text-decoration:underline; }
-->
</style>\n";

echo "<pre>▷ 어디에서 왔을까... (총:$size)\n";
for ($i=0; $i<$size; $i++) { // 배열의 크기만큼 반복
$data[$i] = trim($data[$i]); // 앞뒤 여백 제거
list($count, $link) = explode(" ",$data[$i]); // 공백 기준으로 분리
if ($link=="Bookmark") continue;
printf("%4d ",$count); // 4자리 정수 출력
echo "<a href=$link target=_blank>$link</a>\n"; // 링크 출력
}
echo "</pre>";

?>
--------------------------------------------------------------------------------


파일 이름을 지정해 파일의 내용을 모두 읽었습니다.

$filename = "referer.cgi"; // 파일명 지정
$fp = fopen($filename,"r"); // 읽기 모드로 열기
$temp = fread($fp,filesize($filename)); // 크기만큼 읽기
fclose($fp); // 닫기


그 다음 <br> 태그를 제거했죠.

$temp = str_replace("<br>","",$temp); // <br> 태그 제거


그 다음 줄 단위로 분리해 배열로 저장했습니다.

$data = explode("\n",$temp); // 줄 기준으로 분리


여기까지의 과정을 보다 편하게 하는 방법이 있습니다.

$data = file("referer.cgi");

이렇게 한줄만 쓰면 referer.cgi 파일의 내용이 줄 단위로 $data 변수에 저장되죠.
어떤 방법을 사용하건 원하는 결과에 도달하기만 하면 됩니다. 이왕이면 사용하기
쉽고, 속도가 빠른 방법을 사용하는게 좋겠죠? 위 2가지 방법 중 file() 함수를
이용하는게 느립니다. (파일의 내용이 크면 클수록 느림)


그 다음 역순정렬을 했습니다.

rsort($data); // 역순정렬


공백이 있기 때문에 그 뒤의 문자열은 무시하고 앞의 숫자값만을 가지고 정렬을 한
것입니다. 방문횟수가 높은 값이 제일 처음으로 오겠죠?


배열의 크기를 구합니다.

$size = sizeof($data)-1; // 배열의 크기 구함


HTML 태그를 출력합니다.

echo "<style>
<!--
a:link { color:#666666; text-decoration:none; }
a:active { color:#666666; text-decoration:none; }
a:visited { color:#666666; text-decoration:none; }
a:hover { color:#666666; text-decoration:underline; }
-->
</style>\n";

링크의 기본 색상은 흐린 검은색(딱히 표현할 말이 없군요)이고, 마우스를 올려뒀을때
밑줄이 짠 하고 나타나는 스타일을 정의해뒀습니다.


이제 배열의 크기만큼 반복을 해야겠죠?

for ($i=0; $i<$size; $i++) { // 배열의 크기만큼 반복
...
}


for 문의 블럭({,}) 안에서 배열의 값(한줄 한줄)에 대한 처리를 해줘야합니다.

chop() 함수는 문자열 뒤쪽의 공백을 제거해주고, ltrim() 함수는 문자열 앞쪽의
공백을 제거, trim() 함수는 문자열 앞과 뒤의 공백을 제거해주는 역할을 합니다.

$data[$i] = trim($data[$i]); // 앞뒤 여백 제거


그렇게 한 다음 공백을 기준으로 분리를 해야겠죠?

list($count, $link) = explode(" ",$data[$i]); // 공백 기준으로 분리

list() 함수를 몰랐다면,

$t = explode(" ",$data[$i]);
$count = $t[0];
$link = $t[1];

이렇게 길게 표현을 했어야했는데 참 간편하죠?


이렇게 구해진 값을 출력해줘야합니다. 방문횟수를 4자리에 맞춰 출력해주고,
접속경로에 링크를 걸어 출력해주면 끝입니다.

printf("%4d ",$count); // 4자리 정수 출력
echo "<a href=$link target=_blank>$link</a>\n"; // 링크 출력


여기서 만약 $link의 값이 Bookmark일 경우엔 그냥 넘어가야 하기 때문에 (링크를 걸
필요가 없는) continue 명령을 씁니다.

if ($link=="Bookmark") continue;


이렇게 해서 손쉽게 링크를 걸어보았습니다. ^^


- 미리보기 : http://dreamphp.com/study2/referer2/link.php
- referer.cgi 파일내용보기 : http://dreamphp.com/study2/referer2/referer.phps
- link.php 소스보기 : http://dreamphp.com/study2/referer2/link.phps


...

dreamphp.com과 www.dreamphp.com은 같습니다. 물론 설정이 안된 웹서버도 있겠지만
이런 경우 www.를 제거한 다음 앞의 도메인값만 가지고 해당 주소로부터의 방문횟수를
따로 구하는 것도 가능하겠죠? ^^

댓글목록

등록된 댓글이 없습니다.

회원로그인


Copyright © 1998~2019 DreamPHP.com All rights reserved.