※ 본 강좌는 디망쉬님의 강좌 입니다.
드림캐스트라는 컨슈머 기기(게임기)의 건버드 2 라는 슈팅
게임을 거금 65,000 원 주고 구입했습니다. 아아. 정말
일본의 싸이쿄 애들은 슈팅 게임 하나는 죽여주게 잘 만드내요.
감동 감동. T_T
● 기초
d. php 의 DB 관련 함수들 (for MySQL)
별 거 없습니다. php 과 mysql 을 연동하여 게시판을
짤 때 많이 쓰일만한 관련 함수입니다.
mysql_connect("서버주소","id","비번")
mysql_select_db("DB이름",$connect)
mysql_close()
mysql_query("명령어",$connect)
mysql_fetch_array()
mysql_fetch_row()
mysql_num_rows()
mysql_result
이게 끝입니다. 적어도 요정도만 아시면 게시판 짤
때 무리가 전혀 없습니다. 단지 말만 그런게 아니라
제가 실제로 위의 함수들로만 게시판을 짜는데
무리가 없었습니다. 그럼 하나 하나 알아보도록 하죠.
mysql_connect("서버주소","id","비번")
mysql_select_db("DB이름",$connect)
mysql 서버에 접속하는 함수입니다. 거의 항상 쌍으로
붙어다니죠. ^^;
'서버주소' 는 접속할 mysql 의 위치입니다. 만약
해당 php 가 mysql 서버와 같은 곳이라면 localhost
만 적어주심 됩니다. 만약 외부라면 외부의 ip address
를 쓰면 되구요. 그리고 id 는 접속할 id 이고 비번은
그 id 의 비번입니다. 그리고 DB 이름은 접근할
DB 이름입니다. 만약 mysql 의 id 가 dimanche 이고
비번은 1234 이며, DB 이름은 dimancheDB 일 경우
(리눅스/유닉스) 쉘 상에서는
mysql -udimanche -p1234 dimancheDB
로 접근을 하죠. 이걸 위의 두 함수로 하는 겁니다.
mysql_close()
이 함수는 방금 알아본 함수를 통해 한 접속을 끊어주는
겁니다. 사실 이거 없어도 알아서 접속은 종료됩니다.
하지만 기왕이면 접속을 끊을 때는 끊어주는게 좋습니다.
습관상요. :)
mysql_query("명령어",$connect)
mysql 명령어(쿼리)를 보내는 함수입니다. mysql 에
접속하여
SELECT * from test;
라고 했다면, 이것을 php 가 mysql 로 넘겨줄 방법이
필요한데, mysql_query 가 바로 그 대안이죠.
mysql_query("select * from test",$connect);
하면 " 과 " 사이의 select * from text 가 mysql
로 보내지고 그 결과값을 리턴하죠. 이때 리턴되는
값을 받아야 하므로 저장될 변수명를 지정해주면 되겠죠?
$result = mysql_query ...(후략)
이러면 mysql_query 가 보낸 쿼리, 즉 명령어의 결과가
$result 에 들어갑니다.
그런데 이 뜬금없이 나타난 $connect 의 정체가 궁금하지
않으세요? ^^; 이건 사실 여러분이 함수를 통짜로
외우라는 의미에서 mysql_select_db 를 쓰다보니
난데없이 나타난 겁니다. 보통 mysql_connect() 와
mysql_select_db() 함수를 사용할 때 아래처럼
사용합니다.
$connect = mysql_connect("서버주소","id","비번")
mysql_select_db("DB이름",$connect)
이건 mysql_connect 함수가 성공적으로 완료되었는지
아닌지에 대한 숫자가 리턴됩니다. 그 값을 $connect 가
갖고 있죠. 그리고 mysql_select_db 에서 $connect
부분은 $connect 의 값이 정상적으로 작동됨을 의미하는
1 일 경우 mysql_select_db 가 작동되는 겁니다.
(아니면 말구요. -_-;)
이 말은 mysql_select_db() 에서 $connect 를 생략하고
mysql_select_Db("DB이름"); 만 해도 된다는 말이죠.
아무튼 mysql_query 도 마찬가지 이유입니다. ^^;
mysql_fetch_array()
mysql_query 로부터 넘어온 값을 배열로 가져오는
역할을 합니다. DB 의 테이블이 다음과 같다고 보죠.
+----+----------+----------+
: no : id : name :
+----+----------+----------+
: 1 : dimanche : 디망쉬 :
: 2 : banx : 방재석 :
: 3 : lpark : 에로박 :
+----+----------+----------+
여기서 no, id, name 은 스키마(schema)라고 부를
겁니다. 맞건 안맞건 넘어가요. ^^; 이런 용어는
중요한게 아니니. 아무튼 mysql_fetch_array 로
값을 가져오면 스키마의 이름으로 배열됩니다.
$query = "SELECT * FROM test WHERE no=1";
$result = mysql_query($query, $connect);
이렇게 하면 no 가 1인 모든 내용이 $result 에
넘어갑니다. 이걸
$infor = mysql_fetch_array($result);
라고 하면 다음과 같이 배열이 됩니다.
$infor[no] => 1
$infor[id] => dimanche
$infor[name] => 디망쉬
에. 무슨 말인지 모르시겠다구요? 그럼 다음 함수를
보죠. ^^; 그럼 차이를 느끼시게 되고 그에 따라
무슨 내용인지 이해가 가실 겁니다.
mysql_fetch_row()
mysql_fetch_array() 와 같은 역할입니다. 다만
mysql_fetch_array() 는 배열 방 이름이 스키마와
같다면, mysql_fetch_row() 는 배열 방 이름이
순서대로 숫자가 매겨집니다.
$infor = mysql_fetch_row($result);
이렇게 할 경우
$infor[0] => 1
$infor[1] => dimanche
$infor[2] => 디망쉬
가 됩니다. 분명 mysql_fetch_array 와 역할이
같지만 형식은 약간 차이가 나죠?
중요한 것은 위 두 함수는 mysql_query 로부터
넘어온 값을 실제로 사용하도록 값을 정리해서(?)
가져온다는 겁니다. 위 두 개 중 어떤 걸 쓰시건
상관 없습니다. 마음에 드는 걸 쓰시면 되죠. 전
mysql_fetch_array() 가 더 사용하기가 편해서
mysql_fetch_array 를 애용합니다.
mysql_num_rows()
mysql_query 로 부터 넘어온 값에서 줄 수를
알아내는 함수입니다. 저 위의 테이블을
$count = mysql_num_rows($result);
로 하면 $count 변수에는 3 이 들어가겠죠.
^^; 저의 경우 이 함수를 해당 자료가 있는지
없는지 알아낼 때 주로 사용합니다.
mysql_num_rows() 함수로 체크해봐서 값이
0 이면 해당 자료나 정보가 없는 것이고 0 초과면
해당 자료가 있다는 거죠.
회원 가입 받고 관리하는 것을 짤 때 유저의
id 가 이미 존재하는지 존재하지 않는지 체크하면
되겠죠?
mysql_result()
mysql_query 로부터 넘어온 결과 값을 잡아내는
거라고 영문 메뉴얼에는 나와있습니다. 형식은
mysql_result(int result, int row, mixed field);
라고 하는군요. 자세히 설명을 하라면 솔직히
할 자신이 없습니다. -_-; 뭘 어떻게 설명해야
할 지. 하지만 확실한 건 전 이 함수를 해당
자료의 총 갯수를 알아낼 때 사용한다는 거죠.
아래처럼요.
$query = "SELECT COUNT(*) FROM test";
$result = mysql_query($query,$connect);
$total = mysql_result($result, 0, "COUNT(*)");
이라고 하면 $total 에는 test 테이블의 총
자료의 갯수가 나오죠. 쯔압.
에헤헤. 끝났습니다. 이제 '디'편의 마지막인 'e. 이정도는
알아야 한다.' 로 넘어가겠습니다.
e. 이정도는 알아야 한다.
별 거 없습니다. php 로 무언가를 만든다면, 아니
프로그래밍을 한다면 기본적으로 염두해야할 사항
몇 가지입니다.
# 이름을 신중히 짓자.
제가 무언가를 프로그래밍할 때 코딩하는 시간은
전체의 60% 이고 생각하는 시간은 40% 입니다.
생각하는 시가 40% 중 20%는 변수명, 함수명 등입니다.
-_-;
사실 이름 짓는 것 만큼 중요한 게 없습니다. 일단
이름 짓는데 기본 사항을 나열하보죠.
- 흔한 영어 단어를 쓰지 말자
- 해당 언어의 기본 함수명으로 쓰지 말자
- 규칙을 주자
이 내용은 기본입니다. 첫번째부터 보죠. 흔한
영어 단어를 쓰지 말자? 변수명으로 $total ,
$count 이런 거 쓴다고 문제되지 않습니다.
하지만 웬만한 사람은 해당 언어의 모든 함수를
기억 못하는 것이 보통입니다. 특히 외부의
누군가가 만든 함수를 사용할 지도 모른다면
더더욱 피할 필요가 있습니다. 왜냐하면 흔히
생각할 수 있는 영단어 변수명은 다른 사람도
생각해내어 사용할 수도 있거나 언어 자체에서
이미 제공하는 것일 수 있으니까요.
그리고 해당 언어의 기본 함수명으로 쓰지 말자는
이미 한 번 거론한 내용입니다. php 에 echo
함수가 있습니다. 이걸 $echo 로 사용하면
안된다는 거죠. 에러는 안납니다.(라고 어느
분께서 지적을. 캄샤 ^^) 하지만 결코 좋은
습관이 못되죠. 헷갈릴 수도 있고.
마지막으로 규칙을 주자는 변수명을 지을 때
통일된 규칙을 갖고 지으면 나중에 두고 두고
편하기 때문에 지킬 필요가 있습니다.
$total_num
$total_page
위 두 변수는 어떤 규칙을 갖고 있습니다. 변수명을
봐도 대충 어떻게 쓰일지 예상이 가죠.
$total_num 은 전체 갯수를, $total_page 는
전체 페이지 수를 저장할 변수로 예상됩니다. :]
# 주석을 많이 달자
소스 곳곳에 지저분할 정도만 아니라면 소스를
많이 붙여주는 것이 좋습니다. 아무리 변수명이나
사용자 정의 함수명을 잘 지었어도 그것은 결국
일종의 약어같은 형식이기 때문에 시간이 지난
후에는 변수가 어떤 역할을 하는지 몰라볼 수도
있습니다. (실제로 제가 자주 그랬어요. T_T)
굳이 변수명이나 함수명뿐 아니라 해당 알고리즘
부분은 별도의 주석을 달면 좋겠죠.
주석 어떻게 다냐구요?
단일행(줄)은 // 로 하면 됩니다.
// 에헤헤. 디망쉬는 귀여워
라고 하면 // 부터 나머지 뒷 부분은 주석이죠.
echo ("$total_page"); // 전체 페이지 출력
처럼 하면 보기도 좋고 쉽게 알아보겠죠?
또 다른 방법은 /* 과 */ 으로 묶어주는 겁니다.
/*
이것은 전체 페이지를 출력하는 부분이다.
$total_page 변수는 get_total() 이라는
직접 만든 함수를 통해 생성된다.
*/
echo ("$total_page");
어때요. $total_page 변수의 역할은 물론
어디서 생성된건지도 알 수가 있겠죠. 소스
전체를 읽지 않고도.
# 예외 처리를 확실히 해두자
서버 관리자들은 솔직히 CGI 를 열어두는 것을
원하지 않습니다. 왜냐하면 CGI 로 인한 보안
사고가 많이 생기거든요. 실제로 공개된 웹 게시판들
옛 버전을 보면 보안 문제로 긴급히 패치가 나오곤
했죠.
게시판 소스는 게시판의 기능과 개발자에 따라
다르지만 1000 줄에 육박하기 일쑤입니다. 제가
만든 pwb 1.0a 만 하더라도(공개 안됐심다.
걍 제가 관리하는 홈페이지에만 물려놨죠) 소스 줄이
1400 줄에 육박합니다. (물론 주석이나 빈줄 포함)
아무튼 게시판 소스는 상당히 방대하기 때문에
예상하지도 못한 부분에서 문제가 발생됩니다.
CGI 를 이용하는 유저가 어떤 짓을 할지 모르기
때문이죠. 개발자는 이것을 최대한 염두하여 최대한
예외 처리를 하여야 합니다.
특히 게시판에는 if 문이 많이 나옵니다. if 문은
제어문의 하나인데 만약 어떠어떠하면 이렇게 한다'
라고 명령을 내릴 수 있게 해줍니다. 예를 보죠.
if ($i == "1") {
$str = "디망쉬는 1번";
}
위 소스는 $i 변수의 값이 1 일 경우 $str 라는
변수에 디망쉬는 1번 이라는 문자열을 저장합니다.
위 소스는 예외 처리가 하나도 안되어 있습니다.
만약 $i 가 1이라면 $str 에 해당 문자열이
저장되겠지만 $i 가 1이 아닌 값이라면? 아무런
일을 수행할 필요가 없다면 문제가 안되지만
$str 변수에 의해 어떠한 중요한 기능이 정상적으로
작동되느냐 안되느냐가 걸려있다면 매우 중요한
문제죠.
그래서 개발자는 if 문을 사용하면 else 문을
가급적 함께 해주는 편이 좋습니다. else 문은
if 문과 함께 사용되는 것으로서 '이외의 경우'
에 해당합니다. 위 소스를 수정하자면
if ($i == "1") {
$str = "디망쉬는 1번";
}
else {
$str = "디망쉬는 몇 번이더라";
}
로 할 수 있겠죠. $i 가 1이라면 $str 에는
디망쉬는 1번 이라는 문자열이 들어가겠고, $i 가
1이 아니라면(2일 수도 있고 -1 일 수도 있고)
$str 에는 디망쉬는 몇 번이더라 라는 문자열이
저장되죠.
휴우 끝났습니다. 사실 '이정도는 알아야한다!' 부분에는
이전 회에서 다루지들 못한 if 문 같은 제어문, for 문
같은 반복문 같은 것을 다룰 계획이었습니다. 하지만
이런 것들은 앞으로 숱하게 만나겠지만 위의 내용은
이번 회가 아니면 다룰 기회가 없겠다 싶어서 내용을
긴급히 바꾸었습니다. ^^;
자. 다음 회는 드디어 제 2 편에 해당하는 '망' 편입니다.
여기서는 웹 게시판을 구상하죠. 게시판 디자인 및 콘티,
게시판 구조(db) 등을 다루는 겁니다. 실제로 게시판을
짜는 것 못지않게 중요한 부분이죠. 이런 초기 작업이
허술하면 나중에 게시판 소스 갈아엎고 새로 작성하는
사태가 벌어지며 그런 경우 숱하게 봤습니다. ^^;
좀 걱정되내요. 제 짧은 지식내에서 민감한 내용을
다룰 예정이라 저의 허접 독학 지식이 탄로나는 건 아닐까
하는. ^^; 에이 뭐 어때요. 전 단지 초보분들이 맨땅에
헤딩하지만 않으면 성공인데여 뭐. ^^;
그럼 다음 강좌에서 뵈요. 헥헥
< 출처표기 >