함수 사용시 도저히 이해가 안되는 부분. > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

함수 사용시 도저히 이해가 안되는 부분. 정보

함수 사용시 도저히 이해가 안되는 부분.

본문

5개항 설문 투표를 만들어 놓고 집계 수치를 해당 $wr_id의 레코드를 update하는 함수를
/lib/폴더 아래에 함수 모음 화일에 다음과 같은 함수를 만들어 놓았습니다.

//(2012.04.09)추가 함수

//이상하게 이 함수를 게시판 실행화일에서 직접 부르면 안되고, 함수  실행문을 실행 화일에 그대로 복사해서 실행하면 되는 이유는 도데체 뭔가요.
//이럴바엔 함수로 등록해서 /lib/에 저장해 놓을 필요가 있나? 사용 페이지 마다 코드나 변수명을 고쳐야 한다면 안하고 말지 젠장.
/*
biznara.lib에서

function update_vote($wr_id, $vote)
{
    global $config;
    global $board;
    global $g4;
    global $is_admin;

    $sql = " select sum(bv_count) as vote_sum, count(bv_count) as vote_count
from {$g4['board_vote_table']} where wr_id = '$wr_id'
and bo_table = '$bo_table' and bv_flag = '$vote'  ";
                $row = sql_fetch($sql);
                $vote_sum = $row[vote_sum];
$vote_count = $row[vote_count];

  $sql = " update {$g4['write_prefix']}{$board[bo_table]}
set wr_{$vote} = '$vote_sum' where wr_id = '$wr_id' ";
  sql_query($sql);
}
*/

그 다음은 투표이벤트가 발생했을시 실행되는
bbs/vote.php화일에서의 실행문입니다.

// 집계표 update
//update_vote($wr_id, $vote); <=== 이 함수가 실행이 안되어서 여기다 함수내 실행문을 직접 복사해 넣음.

    $sql = " select sum(bv_count) as vote_sum, count(bv_count) as vote_count
    from {$g4['board_vote_table']}  where wr_id = '$wr_id'
and bo_table = '$bo_table'
and bv_flag = '$vote' ";
$row = sql_fetch($sql);
$vote_sum = $row[vote_sum];
$vote_count = $row[vote_count];

  $sql = " update {$g4['write_prefix']}{$board[bo_table]}             
set wr_{$vote} = '$vote_sum' where wr_id = '$wr_id' ";   
      <== 함수를 불러 오면 특히 여기 sql문이 stop

  sql_query($sql);

그 이유를 설명해 주실 수 있는 분 계십니까?
그냥 이대로 넘어가도 되겠지만 이것 때문에 한참을 헤맸으니 울화가 치밀어 그 이유를 알고 싶기도 하고 또 제가 원래 기초가 없는 사람이라 기초 지식을 배울 겸해서 질문 드립니다.

참고로 현재 사이트는 www.biz-nara.com 이고 비회원도 글쓰기가 가능토록 임시로 열어 놨으니 사이트에 직접 들어 오셔서 확인해도 됩니다.
  • 복사

댓글 전체

일반적인 답변이라면,
함수가 코드 자체로는 되는데, 함수로 만들때 안된다면,
변수 사용에 문제가 있는 경우가 많습니다.

위의 경우, 확실치는 않지만, $bo_table 변수가 함수안에서 선언되지 않은것 같습니다.
보통 $bo_table는 함수 파라미터로 넘겨주는 경우가 많은데,
이 경우는, 전체적인 이해를 할 수가 없기에 뭐라고 말씀드리기는 힘드네요..
(사용된 bv_* 테이블 도 기본 그누보드 테이블이 아니고요..)
전진님의 설명으로 감을 잡았습니다.
함수내 변수를 $bo_table대신 {$board[bo_table]}로 바꿔보니 딱 되는군요.
또한 덕분에 parameter에 대한 기초 개념이 이제사 싹 들어 왔습니다. 그동안 함수내에서 어떤 것은 {}로 옷을 입히고 어떤 것은 {}없이 벌거벗은 채로 그냥 불러들이는 경우게 있었는데 도대체 그 차이는 뭔가 혼자 고민했었는데 바로 파라미터(국산말로 '매개변수')냐 아니냐 차이였군요.
파라미터라는 말도 책 설명으로는 딱 감이 안오던데 이제 보니 어떤 작업을 하기 위한 '원료'(인자)를 담는 그릇에 해당되는 군요. ('빵 제조' 함수가 있다면 '밀가루'와 '물'과 '이스트'가 있어야 하듯이) 그게 있어야 어떤 결과물이 나올 테니까요.  최초 이 용어를 지어낸 사람이 'parameter'라 하지 말고 'materials'했었으면 덜 헤맸을텐데.
감사합니다.
아.. 제 콩글리쉬때문에 헷갈리셨네요. 죄송합니다. ^^;

정식 명칭은 함수 인자 (function argument) 일것입니다.  뭐 대부분 혼용해서 사용하지만요..
굳이 비교하자면, 함수 인자는 빵을 만드는 재료도 해당되겠지만, 대부분 빵재료는 (global 변수등의) 다른 방법으로 주어지고 함수 인자는, 그 빵을 만드는 여러 옵션 (빵 굽는 온도, 시간 등)을 담당하는 경우가 많습니다.
위 예에서도, 재료에 해당하는 것은 디비에 들어있는 정보 (투표수) 일테고, 함수인자는 어떤 정보($wr_id)를 꺼내서 어느 칸(wr_$vote)에 넣을지 조정하는 역할을 하고요. ^^;

그리고 {}있고 없고 차이는, 함수 인자때문은 아니고요,
{}안에 php 변수 ($로 시작하는 문자) 를 넣어서 그 값을 얻어낼때 (evaluation) 사용됩니다.
특히 문자열, 예를 들어 디비 쿼리 (database query) 같은 문자열 안에 넣을때 사용합니다.

간단한 경우 (보통 변수나 단일배열)에는 사용하지 않아도 됩니다.
그러나 다중배열변수의 값 ($로 시작되고 뒤에 두개 이상의 []가 붙는 경우) 인 경우는, 원래대로 {}로 감싸줘야 합니다.  그리고 배열의 문자필드명 ([]사이에 들어가는 숫자가 아닌 이름) 은 ' ' (작은 따옴표)로 감싸야 합니다. 규칙이 쉽지 않기에, 단순변수가 아니면 우선 {}와 '' 를 붙여주는 것이 안전합니다.
또는, 문자열 밖으로 내보내는 방법도 있습니다.

예를들어,
$sql = " select sum(bv_count) as vote_sum, count(bv_count) as vote_count
    from {$g4['board_vote_table']}  where wr_id = '$wr_id'
and bo_table = '$bo_table'
and bv_flag = '$vote' ";

에서 {$g4['board_vote_table']} 의 경우가 거기에 해당합니다. ^^
설명 너무 감사드리고 전체적으로 모두 다 이해되는 것은 아니지만 그래도 혼자 공부하면서 제멋대로 개념정리를 한 것을 바로 잡는데에는 상당히 도움이 되었습니다.
© SIRSOFT
현재 페이지 제일 처음으로