게시판 파싱후 글등록 처리 함수 > 그누보드5 팁자료실

그누보드5 팁자료실

게시판 파싱후 글등록 처리 함수 정보

게시판 파싱후 글등록 처리 함수

본문

외부 게시판 파싱하여 글등록 하는 기능 개발하던중 만든 코드입니다.

게시판 제목, 게시판 내용(텍스트), 업로드 파일 처리가 가능하도록 수정하였습니다.

추후에 php로 심플한 파서 만드는 방법도 추가해보겠습니다.

 


/**
 * 그누보드 게시물 등록 함수.
  * @param $bo_table 게시판명 ex) freeboard
 * @param $subject  게시물 제목
 * @param $content 게시물 내용
 * @param array $files 업로드할 파일 경로 배열, 물리적 경로입력
 *              ex /home/account/www/data/uploads/images1.jpg,,,,
 *
 */
function board_write($bo_table, $subject, $content, $files=array()) {
    global $g5, $config;
    $write_table = "g5_write_{$bo_table}";
    $wr_num = get_next_num($write_table);
    $wr_reply = '';
    $ca_name = "";
    $html = ""; $secret=""; $mail = "";
    $wr_subject = $subject;
    $wr_content = $content;
    $wr_link1 = "";
    $wr_link2 = "";
    $mb_id = "admin";
    $wr_name = "관리자";
    $wr_email = "";
    $sql = " insert into $write_table
                set wr_num = '$wr_num',
                     wr_reply = '$wr_reply',
                     wr_comment = 0,
                     ca_name = '$ca_name',
                     wr_option = '$html,$secret,$mail',
                     wr_subject = '$wr_subject',
                     wr_content = '$wr_content',
                     wr_link1 = '$wr_link1',
                     wr_link2 = '$wr_link2',
                     wr_link1_hit = 0,
                     wr_link2_hit = 0,
                     wr_hit = 0,
                     wr_good = 0,
                     wr_nogood = 0,
                     mb_id = '$mb_id',
                     wr_password = '',
                     wr_name = '$wr_name',
                     wr_email = '$wr_email',
                     wr_homepage = '',
                     wr_datetime = '".G5_TIME_YMDHIS."',
                     wr_last = '".G5_TIME_YMDHIS."',
                     wr_ip = '{$_SERVER['REMOTE_ADDR']}',
                     wr_1 = '',
                     wr_2 = '',
                     wr_3 = '',
                     wr_4 = '',
                     wr_5 = '',
                     wr_6 = '',
                     wr_7 = '',
                     wr_8 = '',
                     wr_9 = '',
                     wr_10 = '' ";
    sql_query($sql);
    $wr_id = sql_insert_id();
    // 부모 아이디에 UPDATE
    sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' ");
    // 새글 INSERT
    sql_query(" insert into {$g5['board_new_table']} ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values ( '{$bo_table}', '{$wr_id}', '{$wr_id}', '".G5_TIME_YMDHIS."', '$mb_id' ) ");
    // 게시글 1 증가
    sql_query("update {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$bo_table}'");

    // 파일개수 체크
    $file_count   = 0;
    $upload_count = count($files);
    for ($i=0; $i<$upload_count; $i++) {
        if($files[$i] && file_exists($files[$i]))
            $file_count++;
    }
    // 디렉토리가 없다면 생성합니다. (퍼미션도 변경하구요.)
    @mkdir(G5_DATA_PATH.'/file/'.$bo_table, G5_DIR_PERMISSION);
    @chmod(G5_DATA_PATH.'/file/'.$bo_table, G5_DIR_PERMISSION);
    $chars_array = array_merge(range(0,9), range('a','z'), range('A','Z'));
    // 가변 파일 업로드
    $file_upload_msg = '';
    $upload = array();
    for ($i=0; $i<count($files); $i++) {
        $upload[$i]['file']     = '';
        $upload[$i]['source']   = '';
        $upload[$i]['filesize'] = 0;
        $upload[$i]['image']    = array();
        $upload[$i]['image'][0] = '';
        $upload[$i]['image'][1] = '';
        $upload[$i]['image'][2] = '';
        $upload[$i]['del_check'] = false;
        $tmp_file  = $files[$i];
        $filesize  = filesize($files[$i]);
        $filename  = basename($files[$i]);
        $filename  = get_safe_filename($filename);
        if (file_exists($tmp_file)) {
            //=================================================================\
            // 090714
            // 이미지나 플래시 파일에 악성코드를 심어 업로드 하는 경우를 방지
            // 에러메세지는 출력하지 않는다.
            //-----------------------------------------------------------------
            $timg = @getimagesize($tmp_file);
            // image type
            if ( preg_match("/\.({$config['cf_image_extension']})$/i", $filename) ||
                preg_match("/\.({$config['cf_flash_extension']})$/i", $filename) ) {
                if ($timg['2'] < 1 || $timg['2'] > 16)
                    continue;
            }
            //=================================================================
            $upload[$i]['image'] = $timg;
            // 프로그램 원래 파일명
            $upload[$i]['source'] = $filename;
            $upload[$i]['filesize'] = $filesize;
            // 아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함
            $filename = preg_replace("/\.(php|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $filename);
            shuffle($chars_array);
            $shuffle = implode('', $chars_array);
            // 첨부파일 첨부시 첨부파일명에 공백이 포함되어 있으면 일부 PC에서 보이지 않거나 다운로드 되지 않는 현상이 있습니다. (길상여의 님 090925)
            $upload[$i]['file'] = abs(ip2long($_SERVER['REMOTE_ADDR'])).'_'.substr($shuffle,0,8).'_'.replace_filename($filename);
            $dest_file = G5_DATA_PATH.'/file/'.$bo_table.'/'.$upload[$i]['file'];
            // 업로드가 안된다면 에러메세지 출력하고 죽어버립니다.
            $error_code = copy($tmp_file, $dest_file) or die("upload error");
            // 올라간 파일의 퍼미션을 변경합니다.
            chmod($dest_file, G5_FILE_PERMISSION);
        }
    }
    // 나중에 테이블에 저장하는 이유는 $wr_id 값을 저장해야 하기 때문입니다.
    for ($i=0; $i<count($upload); $i++)
    {
        if (!get_magic_quotes_gpc()) {
            $upload[$i]['source'] = addslashes($upload[$i]['source']);
        }

        $sql = " insert into {$g5['board_file_table']}
                set bo_table = '{$bo_table}',
                     wr_id = '{$wr_id}',
                     bf_no = '{$i}',
                     bf_source = '{$upload[$i]['source']}',
                     bf_file = '{$upload[$i]['file']}',
                     bf_content = '',
                     bf_download = 0,
                     bf_filesize = '{$upload[$i]['filesize']}',
                     bf_width = '{$upload[$i]['image']['0']}',
                     bf_height = '{$upload[$i]['image']['1']}',
                     bf_type = '{$upload[$i]['image']['2']}',
                     bf_datetime = '".G5_TIME_YMDHIS."' ";

        sql_query($sql);
    }
    // 업로드된 파일 내용에서 가장 큰 번호를 얻어 거꾸로 확인해 가면서
    // 파일 정보가 없다면 테이블의 내용을 삭제합니다.
    $row = sql_fetch(" select max(bf_no) as max_bf_no from {$g5['board_file_table']} where bo_table = '{$bo_table}' and wr_id = '{$wr_id}' ");
    for ($i=(int)$row['max_bf_no']; $i>=0; $i--)
    {
        $row2 = sql_fetch(" select bf_file from {$g5['board_file_table']} where bo_table = '{$bo_table}' and wr_id = '{$wr_id}' and bf_no = '{$i}' ");
        // 정보가 있다면 빠집니다.
        if ($row2['bf_file']) break;
        // 그렇지 않다면 정보를 삭제합니다.
        sql_query(" delete from {$g5['board_file_table']} where bo_table = '{$bo_table}' and wr_id = '{$wr_id}' and bf_no = '{$i}' ");
    }
    // 파일의 개수를 게시물에 업데이트 한다.
    $row = sql_fetch(" select count(*) as cnt from {$g5['board_file_table']} where bo_table = '{$bo_table}' and wr_id = '{$wr_id}' ");
    sql_query(" update {$write_table} set wr_file = '{$row['cnt']}' where wr_id = '{$wr_id}' ");
}

 

추천
3

댓글 19개

그누보드5의 게시판 등록하는 write_update.php 파일에서 필요한 코드만 추가하였습니다. 최대한 기존 소스 기존 코드를 유지하도록 하였습니다.
소중한 지식 감사드립니다
크롤링과 파싱 등에 많은 관심이 있는데 아직은 하나도 모르겠네요 ^^;;

보통 이러한 영역을 학습 하려면 어떤언어부터 접근하는게 좋을까요?
이 소스 참 좋은데요 명랑님 궁금한 점이 있습니다~!  게시물 작성시 동시에 이렇게 입력되는 방법 어려울까요

 댓글 글쓴이에는  : 게시물 글쓴이 이름
 댓글 내용에는  : 게시물 내용 (이미지 없다고 가정)
우와!!!!!!!!!!!!!!!!!! 감사합니다 ㅠㅠㅠㅠ 이럴수가.  감사합니다.  위와 같이 질문을 드린 이유가 정확히는  파싱후  긁어온 댓글을  입력하는 부분에서 막혀버렸거든요~  여분 필드를 이용하면 될 것 같은데.. 해결이 나질않고 있습니다  . Orz (절)
명랑님 소중한 지식 감사합니다. 그런데 제가 정말로 궁금한게 하나 있습니다 
파싱된 자료의 제목이  디비에 있는 게시물 제목과 일치하면 (중복되면)  입력되지 않도록 하려면 어떻게 해야 되는지 도무지 모르겠습니다
제목은 유니크하다고 정의한다면 wr_subject를 unique index를 추가하시면 됩니다.
동일 제목으로 입력이 들어오면 오류가 나게 됩니다.
오류를 회피할려면 insert ignore 구문을 쓰시면 됩니다.
형님 정말 감사합니다.. 사용법에 대해 질문을 드려도 될까요 ?

저 코드로 php 파일을 짠 뒤 파일질라에 업로드 하면 알아서 뚝딱 게시판에 적용될 것 같지는 않은데요. 그렇게 하면 계속해서 자동 업로드가 될테니 멈추기도 힘들 것 같구요.

저 코드를 사이트에 적용시킨다면 어떤 절차를 밟아야 하는지 알 수 있을까요 ?

많이 늦은 시기에 질문드려 죄송합니다 ㅠ
전체 30 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

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