DB 수정 없이 여분필드 길이 및 갯수 늘리기 > 그누보드5 팁자료실

그누보드5 팁자료실

DB 수정 없이 여분필드 길이 및 갯수 늘리기 정보

DB 수정 없이 여분필드 길이 및 갯수 늘리기

본문

DB 수정 없이 여분필드 길이 및 갯수 늘리기

 

예전 그누보드도 그렇고 지금도 여분필드를 사용하면서 파이프라인(또는 짝대기라 부르는 요녀석 -> |)을 쓰거나 조금 관련 지식이 있다 하시는 분들은 JSON을 많이 사용하고 계실 겁니다.

 

여분필드를 많이 써야할땐 wr_* 로 시작하는 필드를 거의 무한정 늘리기도 하고요.

 

하지만... 호랑이는 죽어서 가죽을 남기고 사람은 죽어서 이름을 남긴다는 말 처럼(?) 원래의 프로그램 코드는 배제한 채 데이터베이스(DB)에 남은 기록만 가지고 데이터의 종류를 파악해야 하거나 또는 재구성, 마이그레이션, 복구 등을 진행해야 되는 상황이 오기 마련인데요.

 

이럴 땐 특정 문자(파이프라인 등)로 나눠놓은 필드나, wr_*로 무한정 늘려놓은 필드는 나쁜 걸림돌이 됩니다.

 

JSON의 경우 가장 호환성이 좋은 대안이긴 하지만, DB에서 한 줄로 쭉 나열하여 보았을 때 사람 입장에선 가독성이 좋은 양식은 아닌데다가 길이가 길어지면 결국 데이터타입을 수정해주어야 합니다.

 

그래서 이것을 피하기 위한 대안이 될 수 있는 팁을 적어보자 합니다.

 

1. 필드를 나눌 수 있는 표현형은 파이프라인 또는 JSON만 있는게 아니다

웹 브라우저에는 아주 재미있는 표현형이 있습니다. 아래와 같이 웹 브라우저에서 확인할 수 있습니다.

 

2283217713_1692202159.4976.png

 

뭔가 필드를 잘 나눠줄 것 같이 생기지 않았나요? 여기선 이것에 착안하여 key{N}=value{N}; 방식의 표현을 사용해보려고 합니다.

 

 

2. key{N}=value{N}; 표현을 처리할 수 있는 함수를 짜보자

 

define("DEFAULT_HTML_ENTITY_FLAGS", ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401);  // 상위에 정의하세요.

function darklion_build_stored_data($data) {
    $terms = array();
    foreach($data as $k=>$v) {
        $k = htmlentities($k, DEFAULT_HTML_ENTITY_FLAGS, 'UTF-8');
        $v = htmlentities($v, DEFAULT_HTML_ENTITY_FLAGS, 'UTF-8');
        array_push($terms, $k . '=' . $v);
    }
    return implode("; ", $terms);
}

function darklion_parse_stored_data($s) {
    $data = array();

    $terms = array_filter(array_map("trim", explode(";", $s)));
    foreach($terms as $term) {
        list($k, $v) = explode('=', $term);
        $k = html_entity_decode($k, DEFAULT_HTML_ENTITY_FLAGS, 'UTF-8');
        $v = html_entity_decode($v, DEFAULT_HTML_ENTITY_FLAGS, 'UTF-8');
        $data[$k] = $v;
    }

    return $data;
}

 

 

3. 여분필드에 정보를 기입해보자 (멤버 여분필드에 기입하는 예시)

 

$stored_data = darklion_build_stored_data(array(
    "a" => "1",
    "b" => "2"
))
$sql = " update {$g5['member_table']} set mb_10 = '{$stored_data}' where mb_id = '{$mb['mb_id']}' ";
sql_query($sql);

 

결과: 해당 사용자의 mb_10 필드에 a=1; b=2; 라는 값이 기록됨.

 

 

4. 여분필드의 길이 제한을 극복해보자

필드의 길이가 충분한 필드를 가진 DB 필드는 g5_memo의 me_memo 필드, g5_write_* 각 테이블의 wr_content에 있습니다. 이것을 활용하여 DB 수정 없이 필드의 길이를 늘릴 수 있습니다.

만약, 학창시절 컴퓨터 공학이나 그 비슷한걸 전공하셨다면 '포인터'가 생각날 수 있는 방식입니다.


(1) 쪽지를 생성하고 ID를 가져오는, 그리고 ID를 이용해 쪽지를 가져오는 함수 생성

 

function darklion_add_memo($mb_id, $recv_mb_id, $me_memo) {
    global $g5;
    
    $tmp_row = sql_fetch(" select max(me_id) as max_me_id from {$g5['memo_table']} ");
    $me_id = $tmp_row['max_me_id'] + 1;

    $sql = " insert into {$g5['memo_table']} ( me_recv_mb_id, me_send_mb_id, me_send_datetime, me_memo, me_read_datetime, me_type, me_send_ip ) values ( '{$recv_mb_id}', '{$mb_id}', '" . G5_TIME_YMDHIS . "', '{$me_memo}', '0000-00-00 00:00:00' , 'recv', '{$_SERVER['REMOTE_ADDR']}' ) ";
    sql_query($sql);

    return ($me_id == sql_insert_id() ? $me_id : 0);
 

function darklion_get_memo($me_id) {
    global $g5;

    $me = sql_fetch(" select me_memo from {$g5['memo_table']} where me_id = '{$me_id}' ");
    return $me['me_memo'];
}

 

(2) 해당 ID를 이용하여 여분필드에 번호 값 기록

 

$a_id = darklion_add_memo($mb['mb_id'], $mb['mb_id'], '1');
$b_id = darklion_add_memo($mb['mb_id'], $mb['mb_id'], '2');

// 회원 정보에 등록
if ($a_id > 0 && $b_id > 0) {
    $stored_data = darklion_build_stored_data(array(
        "a" => $a_id,
        "a" => $b_id
    ));
    $sql = " update {$g5['member_table']} set mb_10 = '{$stored_data}' where mb_id = '{$mb['mb_id']}' ";
    sql_query($sql);
}

 

(3) 이렇게 반영된 데이터를 조회하는 방법

 

$parsed_data = darklion_parse_stored_data($mb['mb_10']);
$a_id = darklion_get_memo($parsed_data['a_id']);
$b_id = darklion_get_memo($parsed_data['b_id']);

echo $a_id . '<br>';

echo $b_id . '<br>';


이렇게 하시면 여분필드의 길이나 갯수를 확장하기 위해 데이터베이스 구조를 수정하는 하는 일이 줄어들 수 있습니다.

이 팁이 실제 적용된 예시는 특정 플러그인에 있으니 참고 바랍니다. https://sir.kr/g5_plugin/10381

주의: 쪽지 테이블을 이용하는 경우 일정 기간이 지나면 자동 삭제될 수 있으므로, 영구 저장을 원하시는 경우 g5_write_*(게시판) 테이블을 별도 생성하여 진행하시기 바랍니다.

감사합니다.

추천
2

댓글 2개

전체 2,432 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

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