웹마스터 팁

머리말: 이 게시물은 퍼가셔도 됩니다. 하지만 머리말과 작성자는 꼭 명시해주셨으면 합니다.
===================================================================================

트랙백 구현하기 - 4. PHP로 트랙백 핑 받기

Download #1에 풀소스가 첨부되어 있습니다.

보내는 부분은 완료되었으니 이제는 반대로 트랙백을 받는 부분을 알아보도록 하겠습니다. 보내는 것보다 훨씬 쉽습니다. 이번에도 개요를 보도록 하지요.

1. POST로 url,title,blog_name,excerpt변수를 GET이나 POST로 해당 글에 관련된 정보(게시판 ID나 글번호)를 받는다.
2. 위의 변수들이 모두 존재하는지 검사하고, 그렇지 않으면 에러 출력 후 작동을 끝낸다.
3. 해당 변수가 모두 정상적인지를 확인하고 그렇지 않으면 에러 출력 후 작동을 끝낸다.
4. 위 과정을 모두 통과했을 경우 DB에 트랙백의 내용을 저장하고 에러 없음을 리턴한다.

이제 풀소스를 보죠.

tb_07.gif
그림이 찌그러져 보일 경우에는 클릭해서 새창으로 띄워 보세요.

이번에는 함수화가 아니라 단일 파일로 회신할 것입니다. 보낼 때와는 다르게 6개의 변수를 받아야 하는데, 트랙백의 기본인 $url,$title,$blog_name,$excerpt와 트랙백을 받는 글의 정보를 나타내는 변수, 이렇게 최소한 5개의 변수가 필요합니다. 저의 경우는 글의 정보를 나타내는 변수로 $id와 $no 두개를 사용했습니다.

여기서 트랙백을 받을 때 달랑 트랙백을 받는 파일만을 만들어두면 안되겠지요. 트랙백을 보낼 수 있는 주소를 알려주어야 합니다. 1편의 그림 2를 다시 보겠습니다.

tb_02.gif그림 2: 트랙백 과정 - 1

이처럼 글 하단에 적절한 주소를 알려주어야 합니다. 여기에서 글의 정보를 나타내는 변수를 알려주는 것입니다. 보시다시피 GET방식으로 변수를 나열하고 있습니다. 이 그림에서는 $bid와 $id가 그것이 될 것입니다. 이 주소로 트랙백을 보내면 $url,$title,$blog_name,$excerpt는 POST로, $bid,$id는 GET으로 전달되어 오겠지요.

응답을 회신할 때의 규칙도 다시금 회상해 봅시다. 2편의 내용을 다시 끄집어내 보겠습니다.

에러가 없을 때에는

<?xml version="1.0" encoding="euc-kr(혹은 iso-8859-1)"?>
<response>
    <error>0</error>
</response>

의 내용을, 에러가 있을 시에는

<?xml version="1.0" encoding="euc-kr(혹은 iso-8859-1)"?>
<response>
    <error>1</error>
    <message>에러의 내용</message>
</response>

를 출력해줍니다.

위 형식에 맞게 회신해 주어야겠죠.

응답 후 자료를 DB에 넣어야겠지요. 여기서 에러가 나면 또 이것을 반환해야 합니다. DB에 정상적으로 자료를 입력했다 해도 끝이 아닙니다. 사용자가 해당 글을 읽을 때 코멘트가 달린 것처럼 어느 곳에서 트랙백이 왔는지 알 수 있도록 내용을 출력해주어야 합니다.

글로 써보니 복잡하기 이를 데 없군요. 준비는 여기까지로 그만두고, 소스를 뜯어보며 자세한 방법을 알아봅시다.


header("Content-Type: text/xml");
echo("<?xml version="1.0" encoding="euc-kr"?>n<response>n");

당연히 XML이라는 사실을 알려주어야겠지요. 회신 규칙에 따라 <response>택까지 출력합니다.


if(!$id or !$no or !$_POST[url] or !$_POST[title] or !$_POST[blog_name] or !$_POST[excerpt]) {
    $msg = "";

위에서 말했듯이 저는 $url,$title,$blog_name,$excerpt와 글의 정보인 $id,$no를 전달받을 것입니다. $url,$title,$blog_name,$excerpt는 POST방식으로 전달되고 $id,$no는 GET으로 전달됩니다(단 $id와 $no는 어떤 방식이라고 규정하지 않고 그냥 받아올 것입니다). 그러므로 저 6개의 변수가 모두 존재해야 합니다. 하나라도 빠져 있는 경우에 에러를 내야겠죠.

    if(!$id) $msg .= " id";
    if(!$no) $msg .= " no";
    if(!$_POST[url]) $msg .= " url";
    if(!$_POST[title]) $msg .= " title";
    if(!$_POST[blog_name]) $msg .= " blog_name";
    if(!$_POST[excerpt]) $msg .= " excerpt";

부족한 6개의 변수 중 정확이 어느 것이 빠졌는지를 검사해 $msg에 넣습니다. 사실 이럴 필요 없이 에러문에 그냥 어떤 "변수 부족"이라고만 써도 됩니다만 친절하게(?) 빠진 변수를 설명해주기로 했습니다.

    die("<error>1</error>n<message>Missing Parameter(s) :".$msg."</message>n</response>");
}

무엇이 빠졌는지를 출력하며 PHP 실행을 끝내버립니다. 여기서 변수 부족 에러는 완전히 걸러집니다.

if($id != "정상적인 ID") die("<error>1</error>n<message>Wrong Parameter : id</message>n</response>");
if($no != "정상적인 글번호") die("<error>1</error>n<message>Wrong Parameter : no</message>n</response>");

이제 변수가 올바른지를 검사해야 합니다. 글의 정보와 관련된 2개의 변수만 검사하면 되겠지요. 이 부분은 각자 자신에 맞게 고쳐주어야 합니다. 전체적인 맥락은 해당 포스트가 존재하는지를 검사해서 잘못되었을 경우 에러를 낸다는 것입니다. 제로보드를 예로 들어 볼까요.

$ti = @mysql_fetch_row(mysql_query("select count(*) from zetyx_admin_table where id = '$id'"));
if(!$ti[0]) die("생략");
$tn = @mysql_fetch_row(mysql_query("select count(*) from zetyx_board_$id where no = '$no'"));
if(!$tn[0]) die("생략");

거듭 말씀드리지만 자신에 맞게 고치셔야 합니다.

mysql_query("insert into 트랙백테이블 values ('','$id'+ ','$no','$url','$title','$blog_name','$excerpt','UNIX_TIMESTAMP()','')")
                or die("<error>1</error>n<message>DB Query error</message>n</response>");

위 과정을 모두 거친 완벽한 트랙백 핑에 한해서 DB에 해당 내용을 삽입합니다. 이 역시 자신에 맞게 고쳐주시면 됩니다. 역시 핵심은 DB에 해당하는 모든 자료를 넣되, 자료를 넣는데 실패했을 경우 에러와 함께 프로그램을 종료시키는 것입니다.

echo("<error>0</error>n</response>");

이제 트랙백 핑의 긴 여정도 끝입니다. 최종적으로 무사통과라는 회신을 돌려줍니다.

핑의 일은 끝입니다만 앞에서 말씀드렸듯이 해당하는 글 하단에 트랙백 정보를 알려주어야 합니다. 이건 이 시리즈에서는 생략하겠습니다. 단순히 자료를 뽑아오는 것 뿐이니 충분히 쉽게 할 수 있으리라 생각됩니다.

지금까지 비교적 최신 기술인 트랙백을 보내고 받는 과정을 알아봤습니다. 게시판이나 블로그에 응용해 보세요. 그리고 성공하신 분들은 http://micsland.com/mblog/tb.php?id=test&no=3 에 트랙백을 한번 보내주시면 감사하겠습니다 :D