DB 수정 없이 여분필드 길이 및 갯수 늘리기
DB 수정 없이 여분필드 길이 및 갯수 늘리기
예전 그누보드도 그렇고 지금도 여분필드를 사용하면서 파이프라인(또는 짝대기라 부르는 요녀석 -> |)을 쓰거나 조금 관련 지식이 있다 하시는 분들은 JSON을 많이 사용하고 계실 겁니다.
여분필드를 많이 써야할땐 wr_* 로 시작하는 필드를 거의 무한정 늘리기도 하고요.
하지만... 호랑이는 죽어서 가죽을 남기고 사람은 죽어서 이름을 남긴다는 말 처럼(?) 원래의 프로그램 코드는 배제한 채 데이터베이스(DB)에 남은 기록만 가지고 데이터의 종류를 파악해야 하거나 또는 재구성, 마이그레이션, 복구 등을 진행해야 되는 상황이 오기 마련인데요.
이럴 땐 특정 문자(파이프라인 등)로 나눠놓은 필드나, wr_*로 무한정 늘려놓은 필드는 나쁜 걸림돌이 됩니다.
JSON의 경우 가장 호환성이 좋은 대안이긴 하지만, DB에서 한 줄로 쭉 나열하여 보았을 때 사람 입장에선 가독성이 좋은 양식은 아닌데다가 길이가 길어지면 결국 데이터타입을 수정해주어야 합니다.
그래서 이것을 피하기 위한 대안이 될 수 있는 팁을 적어보자 합니다.
1. 필드를 나눌 수 있는 표현형은 파이프라인 또는 JSON만 있는게 아니다
웹 브라우저에는 아주 재미있는 표현형이 있습니다. 아래와 같이 웹 브라우저에서 확인할 수 있습니다.

뭔가 필드를 잘 나눠줄 것 같이 생기지 않았나요? 여기선 이것에 착안하여 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개
게시판 목록
그누보드5 팁자료실
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 2695 | 1개월 전 | 172 | ||
| 2694 | 1개월 전 | 134 | ||
| 2693 | 1개월 전 | 143 | ||
| 2692 | 1개월 전 | 158 | ||
| 2691 | 1개월 전 | 312 | ||
| 2690 | 1개월 전 | 217 | ||
| 2689 |
|
1개월 전 | 424 | |
| 2688 | 1개월 전 | 275 | ||
| 2687 |
선택과집중
|
1개월 전 | 313 | |
| 2686 | 1개월 전 | 275 | ||
| 2685 | 1개월 전 | 330 | ||
| 2684 | 2개월 전 | 462 | ||
| 2683 | 2개월 전 | 262 | ||
| 2682 | 2개월 전 | 287 | ||
| 2681 |
선택과집중
|
2개월 전 | 264 | |
| 2680 | 2개월 전 | 313 | ||
| 2679 |
|
2개월 전 | 417 | |
| 2678 |
|
2개월 전 | 488 | |
| 2677 | 2개월 전 | 312 | ||
| 2676 | 2개월 전 | 287 | ||
| 2675 |
선택과집중
|
2개월 전 | 464 | |
| 2674 |
|
2개월 전 | 310 | |
| 2673 | 2개월 전 | 322 | ||
| 2672 | 2개월 전 | 272 | ||
| 2671 | 2개월 전 | 244 | ||
| 2670 | 2개월 전 | 357 | ||
| 2669 | 2개월 전 | 275 | ||
| 2668 |
선택과집중
|
2개월 전 | 470 | |
| 2667 |
선택과집중
|
2개월 전 | 455 | |
| 2666 |
선택과집중
|
3개월 전 | 388 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기