이제 어려운 코드가 시작되었어. 그렇지만 미리 겁 먹지마.
여기는 여러분이 만질 이유가 별로 없어. 그냥 다 만들어진 코드를 사용하기 만 하면 되니까.
또 전체적인 흐름만 파악하면 여러분도 얼마던지 수정할 수도 있을거야.
bbs.php 는 무척 긴 코드이니 중요 흐름을 담당하는 부분 만 보면 다음과 같아.
- bbs.php
<?php
if (!defined('YOGI')) exit ; // 개별 페이지 접근 불가
... 생 략 ...
$cur_page = isset($_GET['page']) ? $_GET['page'] : 1; // 현재 페이지번호
$search = isset($_GET['search']) ? $_GET['search'] : null ; // 검색어
$pre_url = empty($search) ? 'page='.$cur_page : 'page='.$cur_page.'&search='.$search ; // 현재 페이지와 검색어 url 기억
$action = isset($_GET['mode']) ? $_GET['mode'] : ''; // 상태 (추가수정,삭제,보기,리스트)
if (!isset($read_level)) { $read_level = 0;}; // 글읽기 권한 없으면 기본 0
if (!isset($write_level)) { $write_level = 2;}; // 글쓰기 권한 없으면 기본 2
switch ($action) { // 인자로 들어온 action 값에 따라 이동한다.
//===== 추가,수정,댓글 ======================================================
case 'add' :
case 'edit' :
case 'cmt' :
$isForm = true; // 폼양식 출력함
if(isset($_POST["submit"])) { //-- bbs_edit.php 에서 저장 눌러서 들어오면
... 생 략 ...
}
//---- $isForm 이 true 이면 폼양식을 출력한다.
if ($isForm) {
if ($action == 'add') {
$mode = '?mode=add&'. $pre_url ;
} else if ($action == 'edit') {
$mode = '?mode=edit&bno='.$_GET['bno'].'&'.$pre_url ;
... 생 략 ...
}
//*************************************************************
include_once(YOGI_DIR . '/bbs_edit.php'); // 게시판 입력폼 삽입
//*************************************************************
}
break;
//===== 보기 =============================================================
case 'view' :
... 생 략 ...
//**************************************************************
include_once(YOGI_DIR .'/bbs_view.php'); // 게시글과 댓글 보기
//**************************************************************
break;
//===== 삭제 =============================================================
case 'delete' :
case 'delcmt' :
... 생 략 ...
break;
//===== 리스트 ================================================================
default :
include_once(YOGI_DIR . '/bbs_list.php'); // 일반 리스트 삽입
include_once(YOGI_DIR . '/search.php'); // 검색상자 삽입
break;
} //- End of Switch
... 생 략 ...
하나씩 공부해 보자구.
▶ if (!defined('YOGI')) exit ; // 개별 페이지 접근 불가
첫 째 줄은 "YOGI 라는 상수가 없으면 그냥 나가라!" 라는 뜻으로 보안을 위한 코드야.
[요기보드 설치]에서 공부했지만 YOGI 라는 상수는 _config.php 에서 정의된 상수야.
그런데 지금까지 공부한 다른 파일 처럼 첫째줄에 include_once('./_path.php') 가 없으니 이 _config.php 를 불러 오지 않은 상태이겠지?
왜 이렇게 했을까?
우선 이 bbs.php 는 단독으로는 사용할 일이 없어.
bbs.php 를 실행하지 전에 $catno 나 $current_menu 같은 값들이 미리 정해져야 제대로 작동을 하거든.
그렇지만 이것도 php 파일이기 때문에 브라우저에서 호출을 할 수는 있어.
만일 누군가 브라우즈의 주소 줄에 http://웹주소/yogi/bbs.php 라고 입력을 했다고 생각해봐.
어떤 결과가 나올지 알 수 없어. (대부분 에러가 뜨겠지...)
에러도 문제지만 이 에러 내용을 보고 해커가 내 홈페이지의 중요 사항을 파악할 수도 있어.
정상적인 파일(예: notice.php)이면 이 bbs.php 를 부르기 전에 include_once('./_path.php')를 통해 _config.php 를 불러와서 YOGI 상수를 정의하고, $catno 나 $current_menu 값 까지 다 넣은 뒤에 실행되기 때문에 이 첫줄을 건너 뛰고 다음 줄로 넘어 가기 때문에 정상적으로 작동할거야.
현재 보고 있는 게시판의 내용이 많아 여러 페이지인 경우 현재 몇번째 페이지를 보고 있는지 $cur_page 에 저장해 두는 라인이야.
여기서 $_GET[] 변수가 나왔네?
Html, CSS를 배울 때 폼 전송에서 다른 파일에 입력한 내용을 전달하는 방식에 GET 과 POST 방식이 있다는거 배웠지?
또 PHP 를 공부할 때도 $_GET $_POST 를 설명할 때도 열심히 설명했어.
GET 방식으로 전송할 때는 웹주소 뒤에 ‘?변수=변수값’ 방식으로 보내게 되어 있어.
보낼 변수가 여러 개면 ‘?변수1=변수값1&변수2=변수값2&변수3=변수값3…’식으로 & 기호로 구분하면 돼.
예를 들어 이 notice.php 라는 파일에게 mode 라는 변수와 변수값 'add' 를 전달하고 싶으면, 아래와 같이 적어서 주소줄에 입력하면 돼.
http://웹주소/notice.php?mode='add'
이렇게 주소가 들어 오면 notice.php 는 실행하면서 mode 값이 'add' 라는 것을 알 수 있는데, 이 값을 알아내는 함수가 PHP 의 전역변수로 바로 $_GET[ ] 이야.
이것은 반드시 대문자로 써야 해.
mode 변수 외에 page 라는 변수를 하나 더 보내려면 & 기호를 사용해서 뒤에 붙이면 돼.
http://웹주소/notice.php?mode='add'&page=2
- 삼항 연산자( Ternary Condition Operator )
$cur_page = isset($_GET['page']) ? $_GET['page'] : 1 는 무슨 뜻일까?
이것은 일종의 조건문인데 해석하자면 "$_GET['page'] 값이 있으면 $cur_page 에 그 값을 넣고, 없으면 1 을 값으로 해라!"
if 와 같은 역할을 해. 위 문장을 if 문으로 쓰면. .
$pre_url 은 위에서 계산한 $search, $cur_page 의 값이 있으면 이것을 합해서 임시로 저장해 둔 변수야.
이 $pre_url 은 사용자가 현재 페이지를 보다 [목록으로] 버튼을 눌렀을때 어디로 갈지를 저장해 둔 것이야.
머리 좀 아픈 코드이니 간단히 해석만 하면. .
"$search 값이 없으면 'page=2' 로 현재 페이지만 저장하고, 있으면 'page=2&search=검색어' 로 저장해라" 는 뜻이야.
위 $cur_page, $search 똑같은 삼항연산자야.
notice.php 뒤에 mode 변수와 값이 $search 변수에 그 값을 넣고, 없으면 공백(null) 값을 넣어라.
여기서 받은 $action 값은 아래에서 아주 중요하게 사용돼.
▶ if (!isset($write_level)) { $write_level = 2;}; // 글쓰기 권한 없으면 기본 2
이 게시판에 대해 글읽기, 글쓰기 권한을 정하는 라인이야.
notice.php 의 상단에서 $write_level = 8 로 정했던 거 기억해?
이처럼 미리 $write_level 값을 설정한 경우에는 그 등급으로, 또 만일 $write_level 값을 정하지 않은 경우에는 2 를 기본 글쓰기 권한으로 정해라. 는 라인이야.
▶ 부정 연산자 !
notice.php 에서는 앞서 미리 $write_level = 8 로 정했으므로 이 줄은 건너 뒤겠지?
왜냐하면 if (!isset($write_level)) 의 뜻이 "$write_level 변수가 있으면(isset()).." 인데 isset() 앞의 ! 는 부정(not)의 의미이니 if (!isset($write_level)) 의 뜻은 "$write_level 변수가 없으면(!isset()).." 이 돼.
▶ switch ($action)
GET 변수로 들어온 mode 값에 따라 switch 에 해당되는 자리로 건너 뛰는 곳이야.
bbs.php 에 mode 변수로 들어 올 수 있는 값은 add(추가) edit(수정) cmt(댓글추가), view(보기), delete(삭제), delcmt(댓글삭제) 뿐이야.
switch 문을 큰 윤곽으로 해석해 보면 다음과 같아.
switch ($action) {
case 'add' : case 'edit' : case 'cmt' : // 추가,수정,댓글추가 이면
//-- bbs_edit.php (추가,수정화면)을 삽입해라.
case 'view' : // 게시글 보기면
//-- bbs_view.php (내용보기 화면)을 삽입해라.
case 'delete' : case 'delcmt' : // 삭제, 댓글삭제면
//-- yg_bbs 테이블에서 해당 글을 삭제하는 코드들
default : // 그밖의 경우 (즉, $action 값이 없으면)
//-- bbs_list.php (게시판리스트) 를 삽입해라.
//-- search.php (검색상자)를 삽입해라.
}
큰 흐름은 의외로 간단하지?
notice.php 뒤에 mode 와 함께 값을 넣어서 실행하면(예: notice.php?mode=add) 해당라인에 속하는 case 자리를 찾아가서 추가화면을 띠우거나, 보기화면, 삭제작업등을 하게 돼.
그리고 mode 값이 없으면 default 자리로 가서 bbs.list.php (즉, 게시판 리스트)를 출력하는거야.
그런데 각각의 case 에 속한 코드들에 대한 설명은 여기서 안 할거야.
왜냐하면 너무 복잡해서 디테일 한 코드 까지 설명하면 아마 여러분 중에서 절반은 여기서 포기할 것 같아서 그래.
지금 다 알려고 하지마.
이 글을 읽고 있다면 여러분은 분명 초보잖아.
한꺼번에 알려고 하지 말고 일단 여러분의 홈페이지를 만들어 보면서 "이 부분을 요렇게 바꾸고 싶어.." 하는 순간이 오면 그때 찾아서 해당 부분을 담당하는 코드를 찾아서 공부해봐.
요기보드에 있는 모든 코드들은 아주 많이 쓰이는 함수들 뿐이기 때문에 구글, 네이버등에서 검색하면 얼마던지 도움을 받을 수 있어.