크롬80버전 결제 이슈, 영카트5 주요패치 확인!

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

컨텐츠몰 10% 할인
그누보드5
영카트5
매뉴얼
Q & A
제작의뢰
컨텐츠몰
부가서비스
소모임
커뮤니티

그누보드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

댓글 전체

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

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

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

회원로그인

진행중 포인트경매

  1. 참여9 회 시작20.05.27 19:24 종료20.06.01 19:24

(주)에스아이알소프트 (06253) 서울특별시 강남구 도곡로1길 14, 6층 624호 (역삼동, 삼일프라자) 대표메일:admin@sir.kr
사업자등록번호:217-81-36347 대표:홍석명 통신판매업신고번호:2014-서울강남-02098호 개인정보보호책임자:이총

© SIRSOFT