도와주세요

그누보드 게시글 자동 작성 php 파일 관련해서 질문 드려요 ^^

이니스프리2017.12.12 18:57조회 수 1299댓글 10

    • 글자 크기

안녕하세요?

 

제가 장래에 홈페이지를 만들게 되면

 

홈페이지 홍보가 되기 전에 어느 정도 게시글이 있어야 될 것 같기도 하고,

 

친구가 자신의 사무실 홈페이지의 Q&A 게시판에 글이 많이 있었으면 좋겠다고 해서요.

 

그런데 나중에 알고 보니 XE로 제작된 홈페이지더군요 ㅠㅠ

 

 

저번에 게시판에 올렸던 허접한 오토핫키 자동 댓글 쓰기 매크로는 

 

네모 님 말씀대로 너무 우회적인 것 같아서요 ㅜㅜ

 

이번에는 다음의 두 글을 참조하여 자동으로 그누보드 게시판에 글을 작성하는 php 파일을 작성했는데요. 

 

우선 두 분께 진심으로 감사드립니다 ^^

 

그누커뮨 말러83님의 글

http://gnucomun.net/bbs/board.php?bo_table=study&wr_id=52

 

sir 명랑폐인 님의 팁

https://sir.kr/g5_tip/6762

 

 

그래서 다음과 같은 두 가지 방식으로 시도해봤는데요.

 

<?php
define('_INDEX_', true);
include_once('./_common.php');
function board_write($bo_table, $subject, $content, $mb_id) 
{
    global $g5;
    $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 = "";
    $wr_email = "";
    $wr_name = $bo[bo_use_name] ? $mb[mb_name] : $mb[mb_nick];
    $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();
    sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' ");
    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' ) ");
    sql_query("update {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$bo_table}'");
    return true;
}

$bo_table = "1001"; // 게시판 테이블 입력
$filename = "subject.txt";
$fp = fopen($filename, "r");
$subject = fgets($fp, '50');
fclose($fp);
 
$filename = "content.txt";
$fp = fopen($filename, "r");
$content = fread($fp, filesize($filename));
fclose($fp);
 
$mb_id="guest1"; 
$result =  board_write($bo_table, $subject, $content, $mb_id);

?> 

 

<?php 
define('_INDEX_', true); 
include_once('./_common.php'); 

function board_write($bo_table, $subject, $content, $mb_id, $nickname) 
{ 
    global $g5; 

    $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 = ""; 
    $wr_email = ""; 
    $wr_name = $nickname; 

    $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(); 
    sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' "); 
    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' ) "); 
    sql_query("update {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$bo_table}'"); 
    return true; 
} 


$bo_table = "1001"; // 게시판 테이블 입력 

$filename = "subject.txt"; 
$fp = fopen($filename, "r"); 
$subject = fgets($fp, '50'); 
fclose($fp); 

$filename = "content.txt"; 
$fp = fopen($filename, "r"); 
$content = fread($fp, filesize($filename)); 
fclose($fp); 

$mb_id="guest1"; 
$nickname="게스트01"; 

$result =  board_write($bo_table, $subject, $content, $mb_id, $nickname); 


?>

 

 

일단 게시글은 잘 작성이 되는데요.

 

두 스크립트 모두 문제는 목록스킨이나 게시글 자체에서 글쓴이 이름(닉네임)이 표시가 안 되더군요.

 

첫번째 스크립트는 DB에서 닉네임을 불러오려고 했고

 

두번째 스크립트는 nickname 변수값을 지정하여 이것을 wr_name에 대입한 것인데요.

 

 

위와 같이 회원 레벨은 출력이 되지만 글쓴이 이름은 공백으로 나오네요 ㅠㅠ

 

실제 존재하는 회원명을 넣어봐도 그렇고 다르게 넣어봐도 마찬가지더군요.

 

 

위와 같이 테스트 해본 호스팅은 닷홈인데요.

 

혹시 닷홈만의 문제는 아니겠지요? ㅠㅠ

 

아미나 커뮤니티에서 닷홈의 PHP 버전과 충돌이 있다는 글은 몇 번 보았는데요.

 

제가 알기로 위 스크립트는 그누보드4 시절부터 사용되었으니 아마도 문제는 없겠죠?

 

 

지난 며칠 동안 그누보드 커뮤니티 등에도 글을 남겼지만 결국 해결을 하지 못해서 

 

스포어의 회원님들께서는 그누보드보다는 주로 XE나 라이믹스를 사용하시는 점을 잘 알지만 

 

스포어만큼 친절하신 고수 회원님들이 많이 계신 곳도 없는 것 같아서 

 

부득이 여기에 다시 질문 드립니다 ㅠㅠ

 

 

그럼 날씨가 추운데 감기 조심하시고 편안한 저녁 되세요.

 

답변 달아주실 스포어 회원님께 미리 감사드립니다 ^-^

 

 

ཇོ་མོ་གླང་མ

    • 글자 크기
아이폰/아이패드 충전기 발열 관련 질문 드립니다 (by 이니스프리) 자동 스크롤 캡쳐 잘 되는 윈도우용 캡쳐 프로그램 추천 부탁드립니다 (by 이니스프리)
  • 2017.12.12 23:51

    음... 두번째 코드는 제대로 작동하는데요..?

    문제가 된다면 닉네임이 한글로 지정되어 있어서 인코딩 문제가 일어날 수는 있겠네요.

     

    첫번째 코드는

    board_write 함수 안에 $mb를 정의하는 부분이 빠져있네요.

     

    global $g5; 밑에다가 $mb = get_member($mb_id); 를 추가해 보세요.

  • @네모
    이니스프리글쓴이
    2017.12.14 00:21

    허걱 제가 어제 작성한 댓글이 네모 님의 답변에 대댓글로 달리지 않았네요 ㅠㅠ

     

    제가 어제 오늘 계속 정신없이 바빠서 방금 집에 들어와서

     

    네모 님께서 말씀하신대로 수정을 해보았습니다.

     

     

    두번째 코드는 영문으로 된 닉네임에서는 잘 작동하고

     

    한글 닉네임의 경우에는 공백으로 나오는 것을 보니

     

    네모 님 말씀대로 인코딩의 문제로 생각됩니다 ^^

     

     

    첫번째 코드도 네모 님께서 추가하라고 말씀하신 부분을 추가했더니

     

    한글과 영문 닉네임 모두 잘 작동하네요 :)

     

     

    그럼 날씨가 추운데 네모 님께서도 감기 조심하시구요

     

    안녕히 주무세요 ^-^

     

    다시 한 번 진심으로 네모 님께 감사드립니다!!

     

  • 이니스프리글쓴이
    2017.12.12 23:56

     

    이미지 153.jpg

     

    역시 네모 님이 최고네요~ 정말 감사합니다! ^-^ 

     

    새해에 복받으실거에요~

     

    제가 스포어에 여쭤보길 잘 했네요 :)

     

    이것 때문에 요며칠 삽질했는데

     

    생각해보니 어드민과 회원 계정 모두 한글 닉네임이네요! ㅠㅠ

     

    네모 님 말씀대로 원인은 한글 닉네임의 인코딩 때문인 것 같군요.

     

    하필 제가 지금 급히 나갈 일이 생겨서

     

    내일 다시 영어로 된 닉네임 계정을 생성해서 다시 해보고 말씀드릴게요~

     

    그럼 네모 님께서도 감기 조심하시고 안녕히 주무세요!

     

    다시 한 번 진심으로 감사드립니다 ^-^

     

  • 2017.12.13 19:37

    해결이 되셨는지는 모르겠지만... 참고로 저 코드는 SQL Injection에 취약합니다.... 문자열에 해당하는 변수(제목, 내용 등)은 모두 addslashes 함수를 적용한 다음 sql변수에 대입하는 것을 추천합니다.

  • @humit
    이니스프리글쓴이
    2017.12.14 01:04

    앗 humit 님께서도 군복무 하느라 바쁘신데 이렇게 답글 달아주셔서 정말 감사합니다! 

     

    일단 네모 님께서 답변해주신 방법으로 닉네임이 출력되지 않는 문제는 해결하였습니다.

     

    SQL Injection의 위험성이 있다는 점까지 미처 제가 고려를 하지 못했네요 ㅠㅠ

     

    humit 님 덕분에 많이 배워서 감사합니다!

     

     

    그렇다면 문자열에 해당하는 변수 중에서 SQL 변수에 대입되는 것은

     

    제목, 내용, 닉네임 3개이니 그 3개를 이렇게 수정하면 되는건가요?

     

    $wr_subject = addslashes(trim($subject));
    $wr_content = addslashes(trim($content));

    $wr_name = addslashes($bo[bo_use_name] ? $mb[mb_name] : $mb[mb_nick]);

     

    제가 완전 컴알못이라서 PHP에 대해 기초적인 것조차 잘 몰라서 죄송합니다 ㅠㅠ

     

     

    네모 님과 humit 님께서 말씀하신 부분을 제가 이해한대로 잠정적으로 반영한 스크립트입니다.

     

    <?php
    define('_INDEX_', true);
    include_once('./_common.php');

    function board_write($bo_table, $subject, $content, $mb_id) 
    {
        global $g5;
        $mb = get_member($mb_id); 
        $write_table = "g5_write_{$bo_table}";
        $wr_num = get_next_num($write_table);
        $wr_reply = '';
        $ca_name = "";
        $html = ""; $secret=""; $mail = "";
        $wr_subject = addslashes(trim($subject));
        $wr_content = addslashes(trim($content));
        $wr_link1 = "";
        $wr_link2 = "";
        $wr_email = "";
        $wr_name = addslashes($bo[bo_use_name] ? $mb[mb_name] : $mb[mb_nick]);
        $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();
        sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' ");
        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' ) ");
        sql_query("update {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$bo_table}'");
        return true;
    }


    $bo_table = "1001"; // 게시판 테이블 입력

    $filename = "subject.txt";
    $fp = fopen($filename, "r");
    $subject = fgets($fp, '50');
    fclose($fp);

    $filename = "content.txt";
    $fp = fopen($filename, "r");
    $content = fread($fp, filesize($filename));
    fclose($fp);

    $mb_id="guest1"; 

    $result =  board_write($bo_table, $subject, $content, $mb_id);


    ?> 
     

  • @이니스프리
    2017.12.14 10:39

    관리자만 사용할 스크립트인데, 굳이 SQL 인젝션을 신경쓸 필요는 없다고 봅니다.

    물론, 해당 스크립트의 접근 권한을 설정할 필요는 있습니다. 데이터가 저장된 파일의 수정도 방지해야겠죠.

  • @네모
    이니스프리글쓴이
    2017.12.14 12:22

    앗 그렇군요 ^^ 감사합니다!

     

    제가 PHP에 대해서 낫놓고 기억자도 모르는 수준인데

     

    이렇게 가르쳐주셔서 감사합니다!

     

    일단 PHP 파일명과 TXT 파일명을 복잡하게 바꿔놔서

     

    다른 사람이 접근할 수 없도록 하려구요.

     

    그리고 파일과 디렉토리의 퍼미션도 제가 좀 더 공부를 해서 적절히 변경을 해야겠네요.

     

    그럼 네모 님께서도 점심식사 맛있게 드세요 :)

     

    다시 한 번 진심으로 감사드립니다!

     

  • @네모
    2017.12.14 13:24

    컨텐츠 내용에 작은따옴표(')가 들어가는 경우가 있을 수 있기 때문에 addslashes 함수는 어쨌든 사용을 하셔야 할 것 같네요..

    만약 작은 따옴표가 들어간다면 SQL 쿼리가 제대로 동작하지 않으니까요...

  • @humit
    이니스프리글쓴이
    2017.12.14 13:46

    옙 감사합니다 ^-^

     

    humit 님 말씀대로 addslashes 함수를 사용하는 방향으로 할게요~

     

    요즘 날씨가 추운데 humit 님께서도 감기 조심하시고 군 생활이 힘드시겠지만 화이팅이요!

     

    항상 감사드립니다 :)

     

  • @이니스프리
    2017.12.14 14:38

    네 감사합니다 :)

댓글 달기

번호 제목 글쓴이 날짜 조회 수
공지 [중요] IP 변경이 있습니다.20 마스터 2019.09.20 388
공지 [중요] 고정 IP에 문제가 발생한 것 같습니다.1 마스터 2019.09.20 240
공지 회원 전용 페이지가 생겼습니다.15 마스터 2018.03.20 8696
공지 [필독] 질문하는 방법6 마스터 2018.02.23 1123
620 팀뷰어 대체할 원격 제어 프로그램 추천 부탁드립니다16 이니스프리 2017.11.30 26910
619 계속 사용중이던 네트워크 공유 폴더가 갑자기 액세스 불가라고 뜹니다.6 장윤서 2018.06.07 15470
618 엑셀 그래프의 축 간격 조절 문제입니다.2 title: 양귀비(관상용)왕뚠뚠돈까스라이츄 2017.08.10 3546
617 윈도우용 메일 클라이언트가 필요합니다.9 네모 2018.01.11 3477
616 크롬에서 특정 사이트 접속 문제 관련하여 질문 드립니다9 이니스프리 2017.03.27 3286
615 파일질라로 연결하니까 보안되지 않은 서버입니다. TLS를 통한 FTP를 지원하지 않습니다. 이렇게떠요 해결방안좀1 마카오 2016.09.11 2438
614 파티션 복구 프로그램 TestDisk 잘 아시는 분 계시나요?29 이니스프리 2017.11.10 2393
613 "크롬이 응답하지 않습니다. 다시 시작하시겠습니까?" 오류 관련 질문 드려요 ^^8 이니스프리 2017.12.05 2327
612 나무 위키의 수익구조는 무엇일까요?2 맛스타 2018.03.18 1458
611 NET::ERR_CERT_AUTHORITY_INVALID가 자꾸 뜹니다..4 title: 양귀비(관상용)왕뚠뚠돈까스라이츄 2017.09.03 1441
610 아이폰/아이패드 충전기 발열 관련 질문 드립니다9 이니스프리 2019.05.02 1417
그누보드 게시글 자동 작성 php 파일 관련해서 질문 드려요 ^^10 이니스프리 2017.12.12 1299
608 자동 스크롤 캡쳐 잘 되는 윈도우용 캡쳐 프로그램 추천 부탁드립니다6 이니스프리 2017.12.03 1283
607 집에서 시놀로지 NAS로 워드프레스나 미디어위키 돌리면 느릴까요?10 이니스프리 2017.01.16 1277
606 프린터가 지 맘대로 프린트를 하네요.3 곰도리푸 2018.04.04 1223
605 도움이 절실합니다. Freenom 질문입니다.(왕초보)22 슬립 2017.11.14 1056
604 동영상 스트리밍 사이트 만들기6 맛수타 2017.09.29 987
603 라떼판다와 라즈베리 파이 중 어느 쪽을 사는 게 나을까요?9 title: 애프터 이펙트제르엘 2018.10.14 928
602 네이버 카페 대문을 HTML로 제작해보려는데 너무 어렵네요.6 도바킨 2018.07.09 918
601 국제전자센터에서 스마트폰 구입 괜찮을까요?2 이니스프리 2018.11.05 783
이전 1 2 3 4 5 6 7 8 9 10... 31다음
첨부 (0)
서버에 요청 중입니다. 잠시만 기다려 주십시오...