====== DB 스키마 ========================================
CREATE TABLE autopost (
num int(6) NOT NULL auto_increment,
title varchar(250) NOT NULL default '', // 사이트 이름
type varchar(30) default NULL, // 전송방법 (formdata, urlencoded)
site varchar(250) NOT NULL default '', // 리스트 페이지 주소
port int(5) default '80', // 접속 포트 (기본 80)
referer varchar(250) NOT NULL default '', // 글쓰기폼 페이지 주소
cookie text, // 글쓰기폼에서의 쿠키값
method varchar(4) default 'POST', // 전송방법 (POST,GET)
target varchar(250) NOT NULL default '', // 글쓰기 페이지의 주소
ff_name varchar(40) NOT NULL default '', // 작성자 필드 이름
ff_password varchar(40) NOT NULL default '', // 비밀번호 필드 이름
ff_email varchar(40) default NULL, // 이메일 필드 이름
ff_homepage varchar(40) default NULL, // 홈페이지 필드 이름
ff_subject varchar(40) NOT NULL default '', // 제목 필드 이름
ff_content varchar(40) NOT NULL default '', // 내용 필드 이름
ff_etc text NOT NULL, // 추가변수
count int(4) NOT NULL default '0', // 전송횟수
date datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (num)
) TYPE=MyISAM;
$sbh란 객체를 만들고 게시판에 입력할 이름,비밀번호,제목,내용,이메일 등등의 값을 설정합니다.
그런 다음 DB에 내용을 읽어 $sbh->setData($row)로 넘겨줍니다.
그런 다음 $result로 결과값을 받아옵니다.
응답 코드가 200인 것에 대해서 성공으로 처리합니다.
이것은 웹서버에서 별다른 에러없이 처리했다는 메세지이지 게시물의 등록이 성공적으로 되었다는 것을 의미하지는 않습니다.
====== write.php 파일 소스 ==============================
include("send_board.inc");
$sbh = new sendBoard($name,$password,$email,$subject,$content,$homepage);
$i = 0;
$total_success = 0;
$total_fail = 0;
$sql_order = " order by num desc";
$query = mysql_query("select * from autopost where $sql_where $sql_order");
while($row = mysql_fetch_array($query)){
// 1이면 요청헤더와 응답헤더만 보여주고 데이타를 전송은 안함
// 2이면 요청헤어돠 응답헤더를 보여주고 데이타를 전송함
$sbh->setDebug(2);
$result = $sbh->setData($row);
$print_num[$i] = $row[num];
$print_title[$i] = $row[title];
$print_site[$i] = $row[site];
$print_message[$i] = $sbh->getHttpStatusName($result[code]);
====== send_board.inc 파일 소스 =========================
<?
class sendBoard{
var $time_out = 60;
var $debug_level;
var $row;
var $data_name;
var $data_password;
var $data_email;
var $data_subject;
var $data_content;
var $data_homepage;
// 디버그 레벨을 설정함
//{{{ function setDebug($debug_level=1);
function setDebug($debug_level=1){
$this->debug_level = $debug_level;
}
//}}}
// 기본 게시판 설정 정보를 가공하여 설정하고 그 정보를 바탕으로 요청헤더를 만들어
// sendData()함수에 넘겨서 전송작업을 하고 결과를 받아서 리턴함
//{{{ function setData($row)
function setData($row){
$server = parse_url($row[site]);
$row[server] = $server[host];
if(!$row[referer]) $row[referer] = "http://".$server[host]."/";
// 소켓을 이용하여 가공된 요청헤더를 보내고 결과를 리턴하는 함수
//{{{ function sendData($server,$port,$time_out,$request_header)
function sendData($server,$port,$time_out,$request_header){
## 소켓 요청 연결
$socket = @fsockopen($server,$port,$errno,$errstr,$time_out);
## 소켓 연결이 성공했을 때
if($socket){
fwrite($socket,$request_header);
## response header 를 읽어옴
do $header .= fread($socket,1); while (!preg_match('/\\r\\n\\r\\n$/',$header));
## chunked encoding 검사
if (preg_match('/Transfer\\-Encoding:\\s+chunked\\r\\n/',$header))
do {
$byte = "";
$chunk_size="";
do {
$chunk_size.=$byte;
$byte=fread($socket,1);
} while ($byte!="\\r");
fread($socket, 1);
$chunk_size = hexdec($chunk_size);
$result .= fread($socket,$chunk_size);
fread($socket,2);
} while ($chunk_size);
else {
## content length 가 정의 되었는지 검사
if(preg_match('/Content\\-Length:\\s+([0-9]*)\\r\\n/',$header,$matches)) {
$result = fread($socket,$matches[1]);
}else{
while (!feof($socket)) $result .= fread($socket, 4096);
}
}
## 소켓 닫기
fclose($socket);
## 소켓 연결이 실패했을 때
}else{
errorMsg("$server:$port 서버로 연결할 수 없습니다.");
}
// 디버그 정보를 출력하는 함수
//{{{ function printDebug($title,$data)
function printDebug($title,$data){
$data = nl2br($data);
$debug = "==== $title ==============================================================================================================================\r\n<br>";
$debug .= $data;
$debug .= "============================================================================================================================================\r\n\r\n<br>";
echo $debug;
}
//}}}
// 소켓으로 요청한 후 넘어오는 응답코드를 알려줌
//{{{ function getHttpStatusName($code)
function getHttpStatusName($code){
switch($code){
case 100 : $name = "Continue";break;
case 101 : $name = "Switching protocols";break;
case 200 : $name = "Complete, 전송 성공";break;
case 201 : $name = "Created, POST 명령 실행 및 성공";break;
case 202 : $name = "Accepted, 서버가 클라이언트 명령을 받음";break;
case 203 : $name = "Non-authoritative information, 서버가 클라이언트 요구 중 일부 만 전송";break;
case 204 : $name = "No content, 클라언트 요구를 처리했으나 전송할 데이터가 없음";break;
case 205 : $name = "Reset content";break;
case 206 : $name = "Partial content";break;
case 300 : $name = "Multiple choices, 최근에 옮겨진 데이터를 요청";break;
case 301 : $name = "Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음";break;
case 302 : $name = "Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시";break;
case 303 : $name = "See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음";break;
case 304 : $name = "Not modified";break;
case 305 : $name = "Use proxy";break;
case 400 : $name = "Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음";break;
case 401 : $name = "Unauthorized, 클라이언트의 인증 실패";break;
case 402 : $name = "Payment required, 예약됨";break;
case 403 : $name = "Forbidden, 접근이 거부된 문서를 요청함";break;
case 404 : $name = "Not found, 문서를 찾을 수 없음";break;
case 405 : $name = "Method not allowed, 리소스를 허용안함";break;
case 406 : $name = "Not acceptable, 허용할 수 없음";break;
case 407 : $name = "Proxy authentication required, 프록시 인증 필요";break;
case 408 : $name = "Request timeout, 요청시간이 지남";break;
case 409 : $name = "Conflict";break;
case 410 : $name = "Gone, 영구적으로 사용할 수 없음";break;
case 411 : $name = "Length required";break;
case 412 : $name = "Precondition failed, 전체조건 실패";break;
case 413 : $name = "Request entity too large";break;
case 414 : $name = "Request-URI too long, URL이 너무 김";break;
case 415 : $name = "Unsupported media type";break;
case 500 : $name = "Internal server error, 내부서버 오류";break;
case 501 : $name = "Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을 요구함";break;
case 502 : $name = "Bad gateway, 서버의 과부하 상태";break;
case 503 : $name = "Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태";break;
case 504 : $name = "Gateway timeout";break;
case 505 : $name = "HTTP version not supported";break;
}
$message = "[$code] $name";
return $message;
}
//}}}
}
?>