함수 사용시 도저히 이해가 안되는 부분. 정보
함수 사용시 도저히 이해가 안되는 부분.관련링크
본문
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 이고 비회원도 글쓰기가 가능토록 임시로 열어 놨으니 사이트에 직접 들어 오셔서 확인해도 됩니다.
/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 변수가 함수안에서 선언되지 않은것 같습니다.
보통 $bo_table는 함수 파라미터로 넘겨주는 경우가 많은데,
이 경우는, 전체적인 이해를 할 수가 없기에 뭐라고 말씀드리기는 힘드네요..
(사용된 bv_* 테이블 도 기본 그누보드 테이블이 아니고요..)
전진님의 설명으로 감을 잡았습니다.
함수내 변수를 $bo_table대신 {$board[bo_table]}로 바꿔보니 딱 되는군요.
또한 덕분에 parameter에 대한 기초 개념이 이제사 싹 들어 왔습니다. 그동안 함수내에서 어떤 것은 {}로 옷을 입히고 어떤 것은 {}없이 벌거벗은 채로 그냥 불러들이는 경우게 있었는데 도대체 그 차이는 뭔가 혼자 고민했었는데 바로 파라미터(국산말로 '매개변수')냐 아니냐 차이였군요.
파라미터라는 말도 책 설명으로는 딱 감이 안오던데 이제 보니 어떤 작업을 하기 위한 '원료'(인자)를 담는 그릇에 해당되는 군요. ('빵 제조' 함수가 있다면 '밀가루'와 '물'과 '이스트'가 있어야 하듯이) 그게 있어야 어떤 결과물이 나올 테니까요. 최초 이 용어를 지어낸 사람이 'parameter'라 하지 말고 'materials'했었으면 덜 헤맸을텐데.
감사합니다.
함수내 변수를 $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']} 의 경우가 거기에 해당합니다. ^^
정식 명칭은 함수 인자 (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']} 의 경우가 거기에 해당합니다. ^^
설명 너무 감사드리고 전체적으로 모두 다 이해되는 것은 아니지만 그래도 혼자 공부하면서 제멋대로 개념정리를 한 것을 바로 잡는데에는 상당히 도움이 되었습니다.