보험최저가로 가입하는요령 쉬운 돈벌기 방법
데이터 베이스를 사용해 볼까요~
이전에도 말씀을 드렸지만...우리가 설치했던 APM이라는것은 아파치웹서버+PHP+MYSQL입니다.
우리가 그동안 localhost라는 주소를 사용해서 php문서를 실행한것은 아파치를 구동시키면 php해석기가 자동으로 메모리상에 상주해 있기때문에 가능했던것이죠...
그럼 MYSQL은 뭘까요?
보통 SQL이란단어가 들어가면 DB(date base)를 말합니다.
데이터베이스라는것은 일련의 데이터들을 보기좋게...또는 쓰기좋게 잘 정리 해놓은 거죠...
간단하게 말하면 표(table)를 생각하시면 됩니다.
우리가 뭔가를 보기 좋게 정리 할때 표를 만들어 놓고 보죠...^^그쵸?
앞서 우리가 파일에 저장하는 방법을 배워보긴 했는데...
그걸 사용하기 쉽게 정리하기란 쉽지가 않습니다.
그리고 파일을 여닫는 속도 또한 장담할수가 없죠....
또 검색이라든지 조건에 맞는 항목을 가져오는 방법에 있어서도 파일만을 이용하는 저장방법에는 한계가 따른다는거죠...
자....그래서 DB를 사용해야 한다는말씀인것인것입니다. @_@
신문에서나 지하철에서 oracle광고를 많이 보셨죠?
보통 뭐 성공하는 기업들의 선택.....-_-이런식의 문구였었는데;;
대체 오라클이 뭐길래......하는 분들도 계셨을겁니다...
오라클 또한..DB입니다.
대신 초대형기업용으로 생각하시면 됩니다.
몇백만,몇천만건의 방대한 자료나...은행과같은 보안상의 안정성...등에서 우수하다는거죠...
그런데 그기능만큼이나 값도 비싸다네요....-.-
물론 다른 DB도 많습니다만.. 우린 mySQL을 사용해보도록 하겠습니다.
-_-왜냐;;; mySQL만의 강력한 특징이 있기때문입니다...
1.공짜다 -_-
2.간편하다....
3.요즘 많은곳에서 지원해준다 -_-a
4.php랑 잘 논다...
-_,-그리고 자료양이 엄청나게 많지 않다면 mySQL이 속도도 더 빠르다고 자랑하데요.....;;;
자 그럼 준비운동좀 하시면서.....
( http://phpschool.com 발췌 )
오라클, SQL 서버 등이 엔터프라이즈 급이라면 MySQL은 중소형 급의 강력하고 빠른 공개형 DB 서버입니다. msql, postgreSQl 등의 다른 공개형 DB도 있지만 강력한 성능, 뛰어난 사용자 권한 설정, 편리한 유틸리티 등을 제공하며 무엇보다 PHP3 와 가장 궁합(?)이 잘 맞는 멋진 DB입니다. win32용도 있습니다. MySQL을 만든 T.C.X 에서는 무려 4천만건 이상의 자료를 MySQL 을 이용해 관리하고 있다고 합니다. PHP를 이용할 경우 오라클 DB도 잘 연동 되지만 MySQL이 더 빠르더군요. 벤치마크 결과 100,000,000건 이하의 자료에서는 공개형 DB중 가장 뛰어난 성능을 가진다고 합니다.
미리 말씀드렸지만 디비라는건 간단히 테이블입니다.
자료들을 일반 문서 처럼 그냥 마구잡이로 집어 넣는게 아니라...
테이블을 만들어서.....잘 정리해서 넣는다는거죠.......
함 볼까요?
어느 식당의 메뉴가 아래와 같이 있답니다...
비빔밥은 3000원이고 볶음밥은 3500원이고 된장찌개는 2500원인데다가 백반은 2000원입니다.
자.....위와 같이 어느 식당의 메뉴가 있는데...
돈이 2500원밖에 없습니다....
-_-;좀 불쌍하지만.....그렇다면 2500원이하의 메뉴를 먹어야 겠죠
그럼 2500원 이하인 메뉴를 찾아 봅시다.......
된장찌개,백반
그렇죠?
쉽습니다.....-_-;
그럼 이렇게 가정을 해보죠.....
그 식당에 메뉴가 100개가 있다고 해볼까요?
@_@찾아보세요;;;
저런식의 메뉴라면 알맞은 메뉴를 찾기 위해 그집 메뉴판을 처음부터 끝까지 읽어봐야 합니다....;; -_-굶어죽죠;;
그래서 식당에서는 아래와 같이 메뉴를 만든답니다...
메뉴 가격
---- ------------
비빔 3000
볶음 3500
된장 2500
백반 2000
그렇죠?...
가격순으로 보길 원하는 사람을 위해.....위와 같이 가격순으로 정렬해 놓으면 더 찾기 쉽겠죠...
위경우가 디비를 사용한 경우라고 보시면 됩니다.....;;
암튼....그냥 간단하게 DB=table이라고 생각하시면 편합니다...
그럼 이제 mySQL을 사용하기 위해 준비를 해볼까요..
mySQL을 사용 하려면 일단 서버에서 실행을 해주어야 겠죠...
start MySQL라는 아이콘을 더블클릭하면.....도스창 하나가 생겼다가 사라질겁니다......-_-; 뜬거죠;;그게;;
그리고 APM을 설치했을때 phpMyAdmin이라는것을 보셨을겁니다..
실행하시면....아이디와 암호를 넣는 창이 뜨죠...(기본적으로 아이디=root 암호=없음 일겁니다.)
암튼 접속을 하셨으면 왼쪽과 오른쪽 프레임이 갈라진 화면이 보이실겁니다...왼쪽은 사용중인 DB리스트 이고 오른쪽은 작업공간으로 생각하시면 됩니다.
일단 서버에 mySQL만 설치 되었다고 해서 바로 사용할수 있는게 아닙니다.
사용할수 있는 유저와 그 유저의 공간을 만들어 주어야 하는데...
다음과 같이 하시면 됩니다...
myphpadmin의 좌측프레임에서 mysql을 클릭합니다.
다음 디비에 SQL 문법 실행하기...라는 곳이 보이죠...
이곳에다가 어떠한 명령문을 써주고 실행을 누르면 그것이 실행이 됩니다.
insert into user values ('localhost','계정아이디',password('계정패스'),'N','N','N','N','N','N','N','N','N','N','N','N','N','N');
위 명령문으로 유저를 생성합니다.
우린 이렇게 만들어보죠....아이디는 navy로 하고 패스워드는 1234로 하겠습니다.
insert into user values ('localhost','navy',password('1234'),'N','N','N','N','N','N','N','N','N','N','N','N','N','N');
위 문장을 그곳에 넣고 실행하시면 mySQL유저가 하나 생깁니다.
그런데 저 명령문이 꼭 영어 문장 같죠.....
저런 문장을 SQL쿼리라고 부른답니다.....^^v
insert into db values('localhost','사용할디비네임','계정아이디','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
위 쿼리는 유저가 사용할 디비..즉 사용할 공간을 만들어 줍니다.
계정아이디는 아까 만든 유저로 정해주면 되겠죠?
우린 디비네임도 그냥 navy로 하겠습니다. 계정아이디는 아까 만든 navy죠?
insert into db values('localhost','navy','navy','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
실행하면 navy라는 계정에 navy라는 디비가 생깁니다. 패스워드는 1234죠..
근데 저 위에 N과 Y는 무엇인가요;;;
저건 그냥 권한에 대한 설정인데 -_-^ 걍 저렇게 하면 된댑니다;;;
자 그럼 이제 디비 하나를 만들어 줘야 합니다.
저 쿼리문에서는 이 유저가 이 디비를 사용하겠다고만 한것이지 디비가 실제로 생성된것은 아닙니다...그래서;;
좌측프레임의 메뉴중 메인페이지...로 들어갑니다.
그럼 아까 첫화면이 다시뜨죠;;; 여기서 새로운 디비 생성 에다가 아까 우리가 만들기로 했었던....navy라고 쳐줍니다.
만들기를 클릭하면 navy라는 디비가 생성됩니다...
그리고 나서 MySQL 다시읽기를 클릭하면 +_+ 준비 끝입니다.
@_@좀 복잡했죠;;; 순서대로 정리해보겠습니다.
phpmyadmin실행
좌측에서 mysql클릭
유저생성쿼리실행
디비생성쿼리실행
좌측에서 메인페이지클릭
새로운디비만들기
mysql다시읽기
위 순서대로 하시면 됩니다.
그리고 사실은 SQl커맨트창이라는게 있습니다.
탐색기에 mysql폴더에서 잘 찾아보시면 있죠.....
실행하면 도스창처럼 까만 창이 뜨는데......거기서 작업을 하시는게 정석입니다....
그런데;; 어짜피 쓰라고 만들어놓은 프로그램이니까 그냥 살짝 사용해보는거죠^0^;;
우리가 만들었던 mySQL계정은.....
아이디:navy
패스워드:1234
디비이름:navy
위와 같습니다.....그쵸?
우선...apache와 mysql을 시동시키시고....
아래와 같은 문장을 php문서에 담아서 실행해 볼까요~
파일명은 connect.php로 하겠습니다...(connect..접속! -_-)
<?
$connect=mysql_connect("localhost","navy","1234");
$mysql=mysql_select_db("navy",$connect);
?>
위 소스를 실행했을때 아무런 에러표시가 없다면...이전에 유저와 디비 생성이 정상적으로 되었고....지금 그 디비로 아무 문제 없이 접속되었다는 것입니다....
뭔가 -_-이상하다싶으면 처음부터 다시 해보시고요;;;
소스를 살펴보죠;;;
mysql_connect()라는 함수는 mysql에 접속하는 함수입니다.
mysql_connect(호스트,아이디,패스워드) 와 같은 형식으로 사용하고요..
우리가 만들었던 계정인 navy와 1234를 넣었습니다.
그리고 $connect= 를 앞에 써준 이유는 위의 접속정보가 $connect로 들어가는 것입니다.
그러니까 $connect에 값이 들어가지 않으면 접속이 실패한것이겠죠;;
밑에줄에 보면 mysql_select_db()라는 함수가 있습니다.
형식은 mysql_select_db(디비이름,접속구분자) 와 같이 쓰이는데....
여기서 접속구분자란 $connect를 말합니다....접속정보가 들어간다고 했었죠?
암튼...이건 접속된 mysql에서 사용할 디비를 골라줍니다.....우리 디비이름이 뭐였죠?.......네 navy죠....
그리고 $mysql= 역시 디비가 제대로 골라졌으면 그 정보가 들어갑니다.
만약 $mysql에 값이 들어가지 않았다면 디비가 제대로 골라지지 못한거겠죠....
그래서 제대로 접속이 된건지....또는 제대로 디비를 골라 잡았는지를 if문으로 체크할수가 있겠죠....
if(!$connect) 이면 mysql에 접속이 옳바르게 되지 않은것입니다. 즉, 계정정보가 잘못되었거나 계정이 존재하지 않는거죠....
if($connect && !$mysql) 이라면 접속은 제대로 되었으나 디비 선택이 잘못된것입니다. 즉, 디비가 존재하지 않거나 계정에게 사용권한이 있는 디비가 아닌것이겠죠...
mysql에 자료를 넣고 빼실때에는 그 문서에서 항상 위에서처럼 미리 mysql에 접속을 해주어야 합니다.
그냥 위 문장을 connect.php라는 식의 파일에 저장해두시고...디비에 접속해야 하는 문서에서 include하셔서 사용하면 간단하겠죠...
<?include"connect.php";?>
위와 같이 한줄만 써주시면 디비에 접속이 되는거죠;;;
지금까지 mySQL계정을 만들고 접속하여 DB를 사용할수 있도록 DB를 select하는것까지 알아봤습니다...
그럼 이제 직접적으로 테이블을 만들고 사용을 해야겠죠...
일단 테이블의 설계에 대해 알아볼까요?
DB에는 정규화라는게 있습니다.
사실 DB얘기를 깊게 하자면 @_@넘복잡하고...제가 아는것도 한계가 있기때문에 간단하게 요점만....어려운 용어 없이 얘기하도록 하겠습니다.
정규화의 예제를 한번 볼까요?
아래와 같은 테이블이 있습니다.....
(수강신청테이블)
이름 주소 과목
---- ----- -----
김씨 서울 과학
김씨 서울 수학
이씨 인천 과학
이씨 인천 수학
이씨 인천 국어
박씨 서울 국어
위와 같은 수강신청 테이블이 있다고 볼까요....
보아하니......누가 어디살고 어떤과목을 신청했다...라는 내용인데...
김씨는 과학,수학을 듣고....이씨는 과학,수학,국어...를 듣습니다.
그리고 박씨는 국어만 듣죠....
그런데...문제가 있죠....
김씨가 두번 나옵니다.....왜냐면 과학과 수학...두가지 이기 때문이죠...
그리고 이씨는 세번나옵니다......과학,수학,국어 이기 때문이죠....
그러면서 쓸데없는 서울이 두번나오고......인천은 세번 나왔죠......
이 얼마나 낭비입니까........
DB도 용량의 한계가 있는거죠..(-_-물론 이정도의 간단한 테이블로는 기별도 안가죠...)
어쨌든.....이런게 좀더 방대한 데이터를 다루는것이었다면....
좀 문제가 생길겁니다....억지라고요?;;;-_-
그럼 어떤 메일사이트를 예로 들어볼까요?
D라는 메일 사이트에는 회원마다 주소록이란 기능을 지원해 준답니다.
자신이 자주 보내는 사람주소를 주소록에 등록하는거죠....
위예제처럼 테이블을 짠다면 이렇게 될겁니다....
회원ID//비밀번호//이름//.....그외 회원정보....//주소록이름//주소록주소
이런식으로 엄청난 데이터가 주소록에 사람이 추가될때마다 계속 들어가는거죠.........-_-이런형식은 그대로.....아웃! 입니다.....
자 암튼 이런 이유로 정규화라는걸 합니다;;;
정규화된모습을 한번 볼까요?
(학생테이블)
이름 주소
---- -----
김씨 서울
이씨 인천
박씨 서울
(수강신청테이블)
이름 과목
---- -----
김씨 과학
김씨 수학
이씨 과학
이씨 수학
이씨 국어
박씨 국어
자 위처럼...테이블이 두개가 생겼습니다.
먼저 학생테이블에는 그 학생에 대한 모든 정보가 들어가 있는거죠...
주소 이외에도 성별이나 학번 또는 주민등록번호....뭐 그런거죠...
(-_-저기 써있는 그대로만을 보시면 안됩니다)
그리고 밑에 수강신청 테이블에서는 그 학생 이름과 과목만이 들어갑니다. 그렇기 때문에 과목이 아무리 많이 들어갔다 하더라도....
그 학생의 전체 정보가 반복되는 경우는 없습니다.
이대로라면 이전의 모델보다는 훨씬 경제적이고 합리적입니다. 그렇죠?
이렇게 테이블을 쓰기좋게 설계하는것을 정규화 라고 한다더군요;;;
엇 그런데....이렇게 테이블을 두개로 갈라놓으면 어떡하죠?....
자 볼까요?....
이씨가 수강하는 과목과 주소를 알고 싶습니다.....
그럼 이렇게 합니다.....학생테이블에서 이름이 이씨인 사람의 정보를 가져오고 또,수강신청 테이블에서도 이름이 이씨인 사람의 정보를 가져오면 되겠쬬.....-0-오오오;;;
자 여기서 나오는 말이 primary key라는것 입니다.
그 행의 주키 라는 얘기인데....(기본키라고 부른다죠~)
이는 각각의 행을 구분해줄수 있는 항목을 말하는 것입니다....
예를 들면 우리가 구입하는 제품에는 모두 제품번호라는게 있죠?
그리고 제품번호는 절대 중복되지 않습니다....
왜냐면 중복되면 각각의 제품을 구분할수 없으니까 말이죠...
primary key도 마찬가지 입니다....
독립적이면서 유일한 값을 갖고 있는것을 primary key로 정해줘야 합니다. 그리고 값이 비어있으면 안돼겠죠....비어있는 값은 null이라고 하는데 여기서 나오는 말이 not null입니다.....
즉, primary key의 조건은....unique하고 not null입니다......@_@
^^...유일하면서 비어있지 않으면 된다는거죠....
자 그럼 학생테이블에서는......어떤가요?
김씨....이씨.....박씨.........
유일한것 같지만.....어딘가 좀 -_-a;;;;
김씨,이씨,박씨....면 우리나라에서 젤 많은 성씨죠;;;
이름이란건 중복될수 있습니다.....그래서 primary key로는 쓸수 없습니다.
그다음은 주소를 볼까요?....
주소역시 무리죠......@_@ 보나마나 입니다...
생각해보세요....어떻게 사람을 주소로 구분한답니까;;;;
학교에서 선생님이 학생을 부를때...........야! 너 거기 서울시 xx구 ㅁㅁ동에 사는 놈.... 이라고 부르진 않죠........
이런경우 많을겁니다.....오늘은 28일......이니까......28번...이거 풀어봐...
그렇슴다.....바로 번호 였던것임다......-0-
학생에겐 학번이란게 있죠......primary key의 조건에 맞춰볼까요?
학번은 학생에게 하나씩 부여되는 것으로 유일한 번호이고....
학번이 없는 학생은 없습니다......+_+ 그래서 우린....primary key로 학번을 쓰기로 합니다.......짝짝짝...-0-;;
(학생테이블)
학번 이름 주소
---- ---- -----
0001 김씨 서울
0002 이씨 인천
0003 박씨 서울
(수강신청테이블)
학번 과목
---- -----
0001 과학
0001 수학
0002 과학
0002 수학
0002 국어
0003 국어
자 위와 같이....학번이라는 primary key를 써서 테이블을 바꿔봤습니다.
자 그럼 이제 다시 이씨가 수강하는 과목을 찾아볼까요?
먼저 학생테이블에서 이씨를 찾아서 학번(primary key)이 뭔가 봅시다...
앗....0002로군요...?
그럼 이제 수강신청테이블로 가서 학번이 00002인 과목을 모두 가져옵니다....그럼 결국 과학,수학,국어.....가 나오겠죠.......
엇....그런데...학생테이블에서 학번이 primary key였는데....
수강신청테이블에서도 primary key일까요?-_-
primary key의 조건을 살펴보세요......중복되는 값이 나오기 때문에 수강신청테이블에서는 primary key가 될수가 없죠......
학생테이블에서는 primary key이지만 수강신청테이블에서는 primary key가 아닙니다.....이럴경우...즉, 다른 테이블에서 primary key인 경우에 이를 foreign key라고 부릅니다........~
자.....여기까지 입니다....
제 생각엔 솔직히.......여기까지만 이해하면 어떤 형태의 테이블이라도 만들 수가 있습니다.....-_-a;;;;머리를 잘 굴려야죠...
끝내기 전에 한가지만 더 예를 들까요?
게시판에 보면 댓글이란게 있습니다..커맨트 라는 것인데....
각 글마다 따로 쓸수가 있죠.........말하자면......1번글에 커맨트를 5개 쓸수가 있고......2번글에는 2개를 쓸수가 있고......그렇죠?...
원리는 위 의 수강신청 테이블과 같습니다...
게시물 테이블이 있고......커맨트 테이블이 따로 있는거죠.....
그래서 만약 2번글이라면.......커맨트 테이블에서 2번글로 되어진 커맨트를 모두 가져오는 겁니다......
(게시물테이블)
번호 글내용 글제목
---- ------ --------
0001 .....
0002 ..
0003
(커맨트테이블)
번호 커맨트
---- -------
0001 ......
0001 ....
0002 ..
0002
0002
이해가시죠?;;;
자 그럼 이제 슬슬 PHP를 mySQL과 함께 사용할 준비를 해야겠죠?
지난시간에는 mySQL의 계정을 만들고 접속하는 것과 테이블을 설계하는것에 대해서 알아보았습니다....
그럼 이번에는 PHP에서 어떻게 mySQL에 명령어를 전달하는가...에 대해 알아보죠;;;
mysql_connect()
일단 요놈으로 mySQL에 접속을 합니다.....
사용법은 mysql_connect(호스트,ID,PASS) 이렇게였죠?
mysql_select_db()
이건 접속한 mySQL에서 DB를 골라줍니다....
사용법은 mysql_select_db(DB이름,접속구분자)
mysql_close()
요놈은 DB에 접속을 끊어 줍니다...
실제로는 쓰지 않아도 페이지가 로딩되면 자동으로 끊어집니다...
mysql_query()
요게 중요합니다....
query라는 단어가 들어있는것으로 알수 있겠죠...
DB에 쿼리를 알려 줄때 사용합니다.
우리가 데이타를 집어 넣거나 꺼내오고 삭제하고 수정하는 요청들을 DB에게 알려주는 역할을 하는거죠......
이외에도 DB관련 함수들은 상당히 많이 있습니다.....
일단 기본적으로 요 네개만 알아 둡시다
테이블을 만들어 보죠...
대부분의 datebase들은 SQL이란 명령어를 써서 작업을 하게 되는데 기본적인 명령어들은 모두 같습니다....
테이블을 만드는 명령어는 create table이라죠....형식은...아래와 같습니다.
CREATE TABLE 테이블이름 (
이름 자료형(크기)
이름 자료형(크기)
.......
)
우리가 만들려고 했던 메모장에 들어가는 항목은....
번호//이름//내용//작성시간//IP 였죠....위 쿼리에 대입해 볼까요?
테이블 이름은 exam_memo이고 각 항목은 영어로....
no//name//memo//date//ip 로 하겠습니다....
CREATE TABLE exam_memo (
no 자료형(크기),
name 자료형(크기),
memo 자료형(크기),
date 자료형(크기),
ip 자료형(크기)
)
위와 같이 각 항목은 ,(쉼표)로 구분해주시면 되고요....
엇....근데 자료형과 크기..는 대체 뭘까요...@_@;;;
간단하게 말하면.....입력할 값이 숫자냐....문자냐.... 뭐 이런겁니다..
크기는 몇자리 숫자냐......문자로 몇글자냐...이런거겠죠....
아래 정리된 내용을 참고 하세요~~~
TINYINT
정수형(-128~127) [UNSIGNED]-정수형(0~255)
SMALLINT
정수형(-32768~32767) [UNSIGNED]-정수형(0~65535)
MEDIUMINT
정수형(-8388606~8388607) [UNSIGNED]-정수형(0~16777215)
INT
정수형(-2147483648~2147483647) [UNSIGNED]-정수형(0~4294967295)
INTEGER
INT와 동일
BIGINT
정수형(-9223372036854775808~9223372036854775807) [UNSIGNED]-정수형(0~18446744073709551615)
FLOAT(정밀도)
부동소수점실수
FLOAT(L, F)
단정도 부동소수점 실수 (-3.402823466E+38 ~ 1.175494351E-38, 0,1.175494351E-38 ~ 3.402823466E+38)
DOUBLE
배정도 부동소수점 실수 (-1.7976931348623157E+308 ~ -2.2250738585072014E-308,0,2.2250738585072014E-308 ~ 1.7976931348623157E+308)
DECIMAL 부동 소수점 실수 CHAR 형태로 동작
NUMERIC ECIMAL과 동일
DATE 날짜형(1000-01-01 ~ 9999-12-31)
DATETIME 날짜와 시간형(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59)
TIMESTAMP 타임스템프형(1970-01-01 ~ 2037년 임의 시간)
TIME
시간형(-838:59:59 ~ 838:59:59)
YEAR
년도형(1901 ~ 2155, 0000)
CHAR
고정폭 문자열
VARCHAR
가변폭 문자열
TINYBLOB / TINYTEXT
BOLB, TEXT형, 최대길이 255문자
BLOB / TEXT
BOLB, TEXT형, 최대길이 65535문자
MEDIUMBLOB / MEDIUMTEXT
BOLB, TEXT형, 최대길이 16777215문자
LONGBLOB / LONGTEXT
BOLB, TEXT형, 최대길이 4294967295문자
ENUM
문자열 목록형, 최대 65535개, 저장된 문자열 목록 중에 오직 한가지만 얻을 수 있습니다.
SET
문자열 목록형, 최대 64개, 저장된 문자열 목록 중에 0, 1개 이상을 얻을 수 있습니다
헥헥헥;;;
이렇게 자료형은 많이 있습니다....그중에서 우리가 골라써 사용해야죠..
일반적으로 간단하게 세가지를 사용할수가 있는데.....
int와 varchar, 그리고 text입니다.
int는 정수형으로 최대크기는 11이고 int(11)이라고 하면 11자리 정수를 뜻하는거죠...
varchar는 문자형으로 최대 크기는 255입니다. varchar(255)라고 하면 255자를 뜻합니다.
text는 크기를 정해 주지 않고 그냥 text라고 하며 textarea에서 입력받은 값을 넣을때 사용하시면 됩니다.....
그런데 잠깐 char과 varchar의 차이를 짚고 넘어가면...
char(50)이라고 하면 무조건 50자가 들어갈 공간을 비워 놓지만....
varchar(50)이라고 하고 20자를 집어 넣으면 20자 공간만 차지 한답니다..
그래서 용량면에서 varchar를 사용하는게 좋긴 하지만.......
char이 더 속도와 안정성면에서는 좋다고 하더군요...@_@ 암튼알아서;;
자 그럼 저 위에 저렇게 많은 자료형 중에서 우린 딱 두개만 쓰겠습니다.
int와 varchar입니다.... 넣어볼까요?
CREATE TABLE exam_memo (
no int(11),
name varchar(10),
memo varchar(50),
date int(11),
ip varchar(15)
)
no를 int로 한것은 어짜피 번호는 정수형이니까요....;;;
name은 문자열로 10글자 까지만 했습니다.
그리고 memo도 50자만 받습니다.
그런데 date를 int로 했네요.......움;;;
저위에 자료형에 날짜형이 있죠;;;; 그런데 우린 PHP를 더 믿을렵니다;;
PHP에서 유닉스타임스탬프값을 기억하시나요?
time()으로 알아내는 값이죠;;; 그 값하나만 있으면 년월일시분초를 한거번에 알수 있습니다.......그래서 그냥 date에는 그 값을 정수형으로 집어 넣기로 한것 입니다.
ip는 문자열 15자 인데......000.000.000.000 이렇게 ip는 15자 라죠;;;
자 그다음은....primary key를 정해줘야 합니다.....
우리가 정한 primary key는 뭐였죠?......옙;;; no입니다....
그럼 아래와 같이....해줍니다..
CREATE TABLE exam_memo (
no int(11) primary key,
name varchar(10),
memo varchar(50),
date int(11),
ip varchar(15)
)
no를 primary key로 해줬죠?.......
CREATE TABLE exam_memo (
no int(11) DEFAULT '0' primary key,
name varchar(10),
memo varchar(50),
date int(11),
ip varchar(15)
)
이번엔 default값을 줬습니다. 기본값으로 0을 준거죠;;;
그리고 이렇게도 해볼까요?
CREATE TABLE exam_memo (
no int(11) DEFAULT '0' NOT NULL auto_increment
primary key,
name varchar(10),
memo varchar(50),
date int(11),
ip varchar(15)
)
no줄을 보면...default값으로 0을 주고 not null이라고 했습니다.
기본으로 0이란 값을 갖고 비어있는 값은 아니라는거죠...
그리고 auto_increment 라는것은 자동으로 증가 한다는 겁니다...
자 기본값이 0이었죠....그럼 최초에 데이터가 들어오면 no는 1이 됩니다... 왜냐면 기본이 0에다가 auto_increment이기 때문에 +1이 되는거죠....그다음에 또 데이터가 들어오면 2가 되겠죠?.......왜냐면;;; auto_increment이니까요......자동으로 +1이 계속 됩니다.....
그럼결국 값이 중복될 일은 없겠죠?......그래서 no는 primary key가 자동으로 성립됩니다.......
이해가 안가시면 ㅎ_ㅎ 눈 이렇게 뜨시고 계속 쳐다 보시구요;;;
이제 이 완성된 쿼리문을 DB에 넣어야죠;;;
실행을 하면 테이블이 생기는것이겠죠?..........
그래서 이 파일을 install.php로 하고....
아래 소스를 넣어 볼까요;;
<?
include"connect.php";
$query="
CREATE TABLE exam_memo (
no int(11) DEFAULT '0' NOT NULL auto_increment
primary key,
name varchar(10),
memo varchar(50),
date int(11),
ip varchar(15)
)";
$result=mysql_query($query,$connect);
if($result){echo"ok";}
?>
저장하고 실행 하셔서 ok라고 화면에 표시되면 exam_memo라는 테이블이 만들어진 것이겠죠?
소스 설명을 드리면.......
지난시간에 connect.php를 만드셨을겁니다......
첫줄은 그 파일을 include하여 DB에 접속하는거죠....
그다음은 $query라는 변수에 앞서 만들어놓은 쿼리문을 넣어두고
mysql_query()라는 함수를 사용하여 mySQL에 보내줍니다...
그리고 $result에 그 결과를 저장하여......
if($result) 즉, 결과가 true이면 echo"ok"; 죠....
그래서 테이블이 성공적으로 만들어졌다면 화면에 ok를 출력합니다.
@_@;;;; 여기까지 테이블 만들기였습니다....
다음엔 글을 넣어보죠~~~
자...이제 테이블을 만들었으니까....
자료를 넣어야 겠죠~?
자료를 넣을때는 insert라는 쿼리문을 사용합니다...
형식은 아래와 같습니다....
insert into 테이블이름 (이름1,이름2,이름3...)
values (값1,값2,값3...)
이름은 테이블 항목의 이름이겠고...값은 거기에 해당하는 들어갈 값입니다.
우리가 만들었던 exam_memo 테이블의 항목은...
no 자료형(크기),
name 자료형(크기),
memo 자료형(크기),
date 자료형(크기),
ip 자료형(크기)
위와 같이 5개 입니다...그럼 insert쿼리에 대입해보죠...
insert into exam_memo (no,name,memo,date,ip)
values (값1,값2,값3,값4,값5)
테이블 이름은 exam_memo..맞죠?.....
no에는 값을 넣을 필요가 없습니다...
왜냐하면 우리가 애초에 테이블을 생성할때 auto_increment로 해줬기 때문에 아무런 값을 넣지 않아도 알아서 +1씩 해줍니다....
(전 시간에 설명을 드렸었죠?)
그리고 값을 넣을때 문자는 ''를 사용하고 숫자는 ''없이 입력해도 됩니다.
예를 들어볼까요?
name에는 navyism을, memo에는 안녕하세요를,date에는 92391238를 (유닉스타임스탬프이니까..),ip에는 211.23.312.54를 넣는다고 해보죠....
그럼 쿼리문은 아래와 같이 됩니다...
insert into exam_memo (no,name,memo,date,ip)
values ('','navyism','안녕하세요',92391238,'211.23.312.54')
''의 사용을 잘 살펴보세요....문자형과 숫자형의 차이입니다.
자 그럼 저 쿼리를 mysql에 보내려면....어떻게 해야죠?....
옙;;; 지난시간에 테이블을 생성할때 사용했던 mysql_query()함수를 쓰면 됩니다.....
예제 소스를 보시죠....
<?
include"connect.php";
$query="insert into exam_memo (no,name,memo,date,ip)
values ('','navyism','안녕하세요',92391238,'211.23.312.54')";
mysql_query($query,$connect);
?>
이 소스를 실행하면 exam_memo테이블에는 넣어준 값이 들어가게 됩니다.
이전까지는 아무런 데이터가 없었으니 no는 자동으로 1이 되겠죠?
phpMyAdmin에서 exam_memo테이블의 일반적리스트를 보시면 1행이 추가된 것을 보실수 있을 겁니다....
그럼 이제 사용자로부터 입력받은 값을 DB에 집어 넣도록 해볼까요?
먼저 뭘해야죠?....
네에 입력 폼을 만들어야 겠죠...
메모장은 글리스트와 입력폼이 함께 있어야 하니까....
list.php파일에 폼을 만들어 놓도록 하겠습니다...
list.php라는 파일을 만들고 아래 소스를 저장합니다.
<form method=post action=write.php>
이름 <input type=text name=name size=10 maxlength=10>
메모 <input type=text name=memo size=30 maxlength=50>
<input type=submit value=입력>
</form>
일반적인 form소스 입니다....
지난번에 form에 대해서 다뤘던 부분이죠...
maxlength는 우리가 테이블을 만들때 사용했던 자료형 크기를 바탕으로 정한것입니다....
name은 varchar(10)이고 memo는 varchar(50)이었죠...
그래서 최대 크기(maxlength)는 10과 50입니다.
(# 미리보기-> http://navyism.yezzang.com/exam_memo/list.php )
method는 post이고 action은 write.php입니다...
즉, 글을 입력하면 write.php로 입력받은 값을 넘겨 준다는 거겠죠...
일단 이대로 저장을 하고.....
이젠 write.php의 소스를 작성해볼까요?
list.php에서 입력받은 값을 가져오기 때문에....input태그의 name인자로 쓰인 name과 memo를 각각 $name과 $memo이라는 변수로 가져옵니다.
그리고 위에서 다루었던 insert쿼리문의 값 부분에 $name,$memo식으로 변수를 넣어주면 입력받은 값이 DB로 들어가는거죠...
일단 write.php소스를 보겠습니다.
<?
include"connect.php";
?>
먼저 connect.php를 include하여 DB에 접속합니다.
<?
include"connect.php";
if(!$name){} //입력확인
if(!$memo){}
?>
if문 부분은 name과 memo에 아무런 값도 입력하지 않았을때에 에레메세지로 alert창을 띄워주는 부분입니다.
alert창을 띄우는 방법은...
echo"<script language=javascript>
alert('메세지');
history.go(-1);
</script>";
위와 같습니다....
javascript를 이용하여 alert()라는 함수로 메세지를 띄우고...
history.go(-1)은 이전 페이지로 돌아가라 라는 것입니다.
적용해 볼까요?
<?
include"connect.php";
if(!$name){
echo"<script language=javascript>
alert('이름을 입력하세요');
history.go(-1);
</script>";
exit;
} //입력확인
if(!$memo){
echo"<script language=javascript>
alert('내용을 입력하세요');
history.go(-1);
</script>";
exit;
}
?>
이런식이 됩니다.....
exit를 if문 마지막에 써준것은 에러가 발생했기 때문에 더이상 실행할 필요가 없기 때문입니다...
밑으로 가면 DB에 insert하는 부분이 있을 것인데...exit를 해주지 않으면 에러를 표시하고 DB에 까지 insert하게 됩니다...
그런데 소스를 가만보니...중복되는 부분이 많죠......;;;
예전에 배웠던 함수를 만들어 쓰기...기억나시나요?...
error()라는 함수를 만들어서 간단하게 사용해 보도록 하겠습니다.
function error($message) {}
error()라는 함수를 선언하고 매개변수로 $message라는 것을 받아 들입니다.
function error($message) {
echo"<script language=javascript>
alert('$message');
history.go(-1);
</script>";
exit;
}
에러 메세지 내용을 추가한 부분입니다...
error('이름을 입력하세요')와 같은 형식으로 함수를 호출하면...
$message="이름을 입력하세요"가 됩니다....
그래서 alert('이름을 입력하세요')와 같이 들어가기 때문에.....
정상적으로 에러를 표시하고 history.go(-1)로 앞페이지로 돌아가면서 exit를 만나면서 페이지 실행을 종료 합니다.
그럼 다시 write.php에 적용해 보도록 하겠습니다.
<?
include"connect.php";
function error($message) { //에러 함수 선언
echo"<script language=javascript>
alert('$message');
history.go(-1);
</script>";
exit;
}
if(!$name){error('이름을 입력하세요');} //입력확인
if(!$memo){error('메모를 입력하세요');}
?>
적용한 소스 입니다....
자 그럼......이제 폼에 입력된 항목의 검사는 끝났습니다....
이번엔 IP와 시간을 알아내야겠죠...
IP는 $ip에...시간은 $date에 넣도록 하겠습니다...
<?
include"connect.php";
function error($message) { //에러 함수 선언
echo"<script language=javascript>
alert('$message');
history.go(-1);
</script>";
exit;
}
if(!$name){error('이름을 입력하세요');} //입력확인
if(!$memo){error('메모를 입력하세요');}
$ip=$REMOTE_ADDR; //IP저장
$date=time(); //시간을 유닉스타임스탬프로 저장
?>
$REMOTE_ADDR이라는 것은 IP를 알려주는 변수입니다.
time()은 시간함수 시간에 다루었던 것이죠?
그럼 이제 DB에 집어넣을 준비가 다 되었습니다.....
쿼리문을 만들어 볼까요?
insert into exam_memo (no,name,memo,date,ip)
values ('','$name','$memo',$date,'$ip')
처음에 만들었었던 쿼리문에 변수를 사용하여 넣은 모습입니다.
다시한번 ''의 사용에 유의 하세요...
그런데 잠깐 문제가 있습니다...
예를들어......사용자가 memo에 ' 를 입력하면 어떻게 될까요?
$memo=" ' "; 가 되죠?
그래서 위 쿼리문에 들어가게 되면....
insert into exam_memo (no,name,memo,date,ip)
values ('','$name',' ' ',$date,'$ip')
이렇게 됩니다........뭔가 잘못된것 같죠?....
'$memo'부분이 ' ' ' 가 되어버립니다.
이렇게 되면 정상적으로 데이터가 들어갈 수 없겠죠...
그래서 '나 "등의 특수문자가 입력되면 ' "와 같이 앞에 역슬레쉬()를 붙여줘야 DB에 이상없이 들어갑니다...
이때 쓰이는 함수가 addslashes()라는 함수인데...
이 함수는 특수문자앞에 를 붙여줍니다.......
반대로 를 제거하는 함수는 stripslashes()입니다.....이건 데이터를 꺼내올때 사용하겠죠?
암튼 소스에 적용해 봅시다...
<?
include"connect.php";
function error($message) { //에러 함수 선언
echo"<script language=javascript>
alert('$message');
history.go(-1);
</script>";
exit;
}
if(!$name){error('이름을 입력하세요');} //입력확인
if(!$memo){error('메모를 입력하세요');}
$ip=$REMOTE_ADDR; //IP저장
$date=time(); //시간을 유닉스타임스탬프로 저장
$name=addslashes($name);
$memo=addslashes($memo);
?>
addslashes()함수에 $name과 $memo를 넣어서 다시 $name과 $memo에 저장을 했습니다....
이렇게 하면 이제 $name과 $memo에 있던 특수문제 앞에 모두 가 붙게 되겠죠?...
자 이제 진짜로 DB에 넣어봅시다....
아까 만들어 놓은 쿼리문을 mysql_query()함수로 DB에 넣어줍니다.
<?
include"connect.php";
function error($message) { //에러 함수 선언
echo"<script language=javascript>
alert('$message');
history.go(-1);
</script>";
exit;
}
if(!$name){error('이름을 입력하세요');} //입력확인
if(!$memo){error('메모를 입력하세요');}
$ip=$REMOTE_ADDR; //IP저장
$date=time(); //시간을 유닉스타임스탬프로 저장
$name=addslashes($name);
$memo=addslashes($memo);
$query="insert into exam_memo (no,name,memo,date,ip)
values ('','$name','$memo',$date,'$ip')";
mysql_query($query,$connect);
?>
$qeury라는 변수에 쿼리문을 넣고 mysql_query()함수를 호출하여 쿼리문을 DB에 보내주었습니다...
이로서 글이 DB에 입력된거죠.....
자 그럼......입력후엔 어떻게 될까요?...
다시 list.php로 되돌아 가야 겠죠?...
이동하는 구문을 마지막에 넣어줘 볼까요...
html에서 다른 페이지로 이동하는 문장입니다...
<meta http-equiv='refresh' content='0;url=경로'>
이 구문을 마지막줄에 넣어줍니다...
<?
include"connect.php";
function error($message) { //에러 함수 선언
echo"<script language=javascript>
alert('$message');
history.go(-1);
</script>";
exit;
}
if(!$name){error('이름을 입력하세요');} //입력확인
if(!$memo){error('메모를 입력하세요');}
$ip=$REMOTE_ADDR; //IP저장
$date=time(); //시간을 유닉스타임스탬프로 저장
$name=addslashes($name);
$memo=addslashes($memo);
$query="insert into exam_memo (no,name,memo,date,ip)
values ('','$name','$memo',$date,'$ip')";
mysql_query($query,$connect);
?>
<meta http-equiv='refresh' content='0;url=list.php'>
휴우우...
^^/ 끝입니다....
이제 이 소스를 write.php로 저장하시고 list.php를 실행하여서 글을 입력해 보세요........
-_-;; 아무 변화 없죠?......
아직 입력된 글을 보는 부분을 만들지 않았기 때문입니다...
메모입력창까지 만들고 입력까지 되도록 만들어 보았습니다...
근데 입력은 되는데 입력한 내용이 화면에 표시되지는 않았죠?
아직 꺼내오기를 안해서 그렇습니다...-_-;
(php my admin으로 exam_memo라는 테이블의 일반적리스트를 확인하시면 입력한 메모들이 보일겁니다....)
자 그럼 이제 꺼내오기를 해야 하는데.....
DB에서 꺼내오는 쿼리는 select라는 구문을 사용합니다...
sql의 기본구문이죠;;;
select [꺼내올항목] from [꺼내올테이블] where [조건] order by [정렬방법] limit [갯수]
위와 같은 기본형식입니다...
사실 좀더 복잡한 옵션이 더 들어가는데....일단 사용할 것들만 적어 놓아봤습니다...
아무래도 쿼리문에 대해서 따로 공부 하셔야 할것같은데....흠흠...
그럼 이제 우리가 만든 테이블에 적용해볼까요...
select * from exam_memo
위 구문에서 *란...모든것이란 뜻입니다...어디에서? from exam_memo
즉, exam_memo라는 테이블에서 모든것(*)을 꺼내 오라는거죠...
where절이 없는 이유는 아무런 조건이 없기 때문입니다....그야말로 있는대로 죄다 꺼내오는거죠...
select * from exam_memo order by no
order by절에서 no로 주었습니다......그래서 이쿼리로 꺼내오면 no순으로 꺼내옵니다.
우리가 테이블을 만들때 no라는 항목을 만들었었죠....
자동으로 증가되기 때문에 1,2,3,... 이런식으로 증가했을것입니다.
그런데 no순으로 꺼내오면 가장 오래전글 부터 불러오겠죠......
하지만 보통 메모장이나 그런것들은 가장 최근글부터 꺼내온다죠~
그래서 뒤에 desc라는걸 붙입니다....역순...이라는 얘기죠.......내림차순!
asc와 desc가 있는데 asc는 생략할수 있습니다. 그래서 order by no라고만 했다면
order by no asc와 같은 말입니다. no의 올림차순으로 꺼내온다는 거죠..
하지만 order by no desc라고 하면 no의 내림차순으로 꺼내옵니다.
select * from exam_memo order by no desc limit 10
limit 10이라는것은 no의 내림차순으로 10개만 가져온다는 것입니다.
메모가 100개가 있는데 한페이지에 모두 100개를 보여주는건 무리겠죠...
그래서 페이지를 나누고 한페이지에 들어갈 갯수만큼 가져오는 겁니다...일단 10개로 했는데...
처음 10개를 가져온다는 거겠죠?...그럼 다음 10개는 어떻게 가져오나요?....
이렇게 바꿔봅시다...
select * from exam_memo order by no desc limit 10,10
limit [시작위치],[갯수]
이렇게 하면 11번째 글부터 10개를 가져온다는것입니다. 그러니까 2번째 페이지가 되겠죠...
그럼 여기서 페이지 나누는 방법에 대해서 잠깐;;;
좀 @_@복잡하긴 하지만 차근차근 생각해보면.....그리 어렵진 않을겁니다...
-_-;저도 이 로직을 생각하느라 어찌나 많은 삽질을 했는지...
자 보시죠~
전체 39개의 글이 있습니다....
한페이지에 10개의 글이 보여진다면 총 몇페이지가 필요할까요? 계산해 보세요....
네에 4페이지죠....39/10=3...9
3페이지를 쓰고 9개의 글이 남습니다....하지만 이 나머지 9개도 한개의 페이지를 쓰겠죠....
나머지가 1이어도 물론 한개의 페이지를 더 쓰게 됩니다...
결국 총 몇페이지인가를 구하는 식은....
전체페이지를 페이지당 갯수로 나눈몫을 무조건 올림 해준값이 됩니다.
php에서 올림값을 리턴하는 함수는 ceil()입니다
아래와 같은 식이 나오겠죠...
//페이지수 구하는공식
//$total 전체갯수
//$page 페이지당 게시물수
$pagesu = ceil($total/$page); //전체갯수를 페이지당 게시물수로 나눠서 올림
자 그럼 대입해볼까요?
$total=39;
$page=10;
$pagesu=ceil($total/$page);
결과는 $pagesu=4가 됩니다......맞죠?
그럼 전체 4개의 페이지가 나온다는 얘기겠죠....
그럼이제 페이지를 구분해 주는 변수를 하나 만들어 보죠...
$pagenum이라고 하겠습니다 (-_-쥔장맘대로)
$pagenum이 0이면...즉 값이 들어있지 않으면 첫페이지를 보여주게 하고....
1이면 두번째 페이지....2이면 세번째 페이지를 보여주게 해볼까요...
자 그럼 임의로 $pagenum을 정해 주어보겠습니다 @_@눈 크게 뜨시고...
$pagenum=2; //세번째 페이지를 보여줍니다.
$total=39; //전체갯수
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
전체 4개의 페이지가 나왔고 세번째페이지를 보기를 원합니다.
쿼리문에서는 limit [시작위치],[갯수]
시작위치를 잡아줘야겠죠...갯수는 $page입니다.(페이지당 갯수니까요)
시작위치는 아래와 같은 식으로 잡으면 되겠쬬~
$start=($page*$pagenum);
대입해 봅시다.....
최초....첫번째 페이지를 볼때는 $pagenum=0입니다. 위식에 대입해보면 $start=0이죠...
그래서 쿼리문은 limit 0,10이 됩니다.
맞죠? 첫번째글부터 10개.....
$pagenum=1일때......대입해보면 (10*1)=10
limit 10,10입니다.....11번째글부터 10개
$pagenum=2일때......대입해보면 (10*2)=20
limit 20,10입니다.....21번째글부터 10개
....
자 이런식으로 나오게 되겠쬬....
정리해봅시다....아래 소스를 보세요...
$pagenum=2; //세번째 페이지를 보여줍니다.
$total=39; //전체갯수
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum); //가져올 시작위치를 결정합니다.
쿼리문=select * from exam_memo order by no desc limit $start,$page
위 식에서 게시물을 가져올 시작위치와 갯수를 $start와 $page로 받아서 쿼리에 넣어준것입니다.
이렇게 하면 $pagenum에 따라 페이지가 바뀌겠죠...헉헉.....
(이해가 안가시면 다시 잘 머릿속으로 암산을 하면서 보세요...)
그럼 페이지수 결정하는건 여기까지만 하고......
이제 글목록을 가져오는 부분에 대해서 해보도록 하죠....
우선 게시물의 전체갯수를 구해야겠죠....
구하는 쿼리는 아래와 같습니다...
select count(*) from [테이블이름]
count()라는 함수는 mysql에서 제공되는 함수입니다(php랑은 상관없습니다)
열의 갯수를 세는거죠.... 그러니까 총 열의 갯수를 구하고 그것을 select해줍니다.
대입해 볼까요?
select count(*) from exam_memo
이렇게 되겠죠....
그럼 php로 적용해보죠...
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
첫째줄에서 $query라는 변수에 쿼리문을 넣고 두번째 줄에서 mysql_query()함수로 mysql로 보냅니다.
그리고 여기서 mysql_fetch_array()라는 함수는 select된 값을 연관배열로 리턴합니다.
연관배열이란......지난번에 배열을 다룰때 나왔던 것이죠...
보통 배열처럼 $a[0],$a[1]이 아니라 $a[name],$a[title] 과 같이 배열안에 숫자 대신 임이의 단어로 구분하게 해줍니다.
mysql_fetch_array()를 사용하면 select된 항목이 연관배열로 들어갑니다.
select * 로 해주었다면 연관배열에는 우리가 exam_memo를 만들때 넣어주었던...
no,name,memo등이 들어가겠죠...
하지만 select count(*)로 했기때문에 열의 총갯수가 $total["count(*)"]라는 연관배열의 변수로 들어갑니다
일단 이해가 안가실텐데......글 목록 꺼내올때 다시 한번 다루도록 하겠습니다.
암튼 위 문장으로 우리는 입력된 메모의 총 갯수를 $total에 집어 넣었습니다.
그다음으로는 아까 사용했던 식을 이용하여 $start를 구해야겠죠.... 보시죠~
<?
include"connect.php";//DB에 접속
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum); //가져올 시작위치를 결정합니다.
?>
요기까지 입니다.
게시물을 가져올 준비가 다 된거죠?
시작위치($start)와 페이지당 갯수($page)가 정해졌으니 그대로 아래와 같이 쿼리문을 써주면 됩니다.
$query="select * from exam_memo order by no desc limit $start,$page";
$query라는 변수에 다음과 같은 쿼리문을 넣어준것이죠
select(골라라)
*(모든것을)
from(어디에서?)
exam_memo(exam_memo테이블에서)
order by(정렬을)
no(no로해서)
desc(내림차순으로)
limit(제한을)
$start(시작위치부터)
$page(페이지당갯수만큼)
이해가시죠?^^;
$query="select * from exam_memo order by no desc limit $start,$page";
$result=mysql_query($query,$connect);
$result에 mysql_query()함수를 사용한 결과물을 집어 넣었습니다.
그러니까 select한 결과가 $result에 들어가있는거죠....
이제 mysql_fetch_array()를 사용해서 연관배열로 만들면 되겠죠?
그런데 아까랑 다른점이 있습니다. 아까는 한개의 열만 받아들이는 것이고...
이번엔 열이 몇개인진 몰라도 최대한 10개죠....
그래서 최대 10번까지는 반복을 해야 합니다.
때문에 while이라는 반복문을 사용하기로 합니다.....
$query="select * from exam_memo order by no desc limit $start,$page";
$result=mysql_query($query,$connect);
while($data=mysql_fetch_array($result))
{ }
@_@점점 복잡해지죠?....
while($data=mysql_fetch_array($result)) 이부분에서 속 부분부터 볼까요
mysql_fetch_array($result) : 결과물을 연관배열로 만듭니다.
$data=mysql_fetch_array($result) : 연관배열을 $data라는 배열로 정의합니다.
while($data=mysql_fetch_array($result)) : while문으로 반복합니다.
여기서 while문은 무한루프가 아닙니다.
while문이 루프되면서 연관배열에는 가져온 데이터를 한행씩 리턴해줍니다.
그러니까 글이 3개가 있었으면.....while문이 처음 돌때에는 1번글에 대한 연관배열 $data를 보내주고
두번째 돌때는 2번글에 대한 연관배열 $data를 보내주고....세번째에는 3번글.....
이렇게 돌아가겠죠....
for문을 쓸수 있는데도 while을 사용한것은.....while은 종료지점을 정해 주지 않아도
자동으로 모든 행을 리턴하고 나면 종료되기 때문입니다.
그래서 아까의 경우라면 3행까지 리턴하고 종료되겠죠......
자....이해 안되시죠-_-? (외우세요....;;;)
<?
include"connect.php";//DB에 접속
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum); //가져올 시작위치를 결정합니다.
$query="select * from exam_memo order by no desc limit $start,$page"; //꺼내올 쿼리문
$result=mysql_query($query,$connect); //mysql에 요청
while($data=mysql_fetch_array($result)) //결과를 꺼내옴
{ }
?>
이부분 까지 되었습니다.
그럼 이제 { } 에 출력문을 간단하게 넣어볼까요?
echo "$data[memo] <br>";
이런 문장을 넣어보죠....
$data라는 연관배열에서 $data[memo]라는 것은 exam_memo의 memo라는 항목을 꺼내온다는 것입니다.
예를들어 글이 아래와 같이 입력되어 있다고 해볼까요...
[exam_memo테이블]
no name memo
-- ---- ---------
01 test 테스트
02 navy 움하하
03 babo 바보
04 navy 우헤헤
이렇게 4개의 글이 있습니다. -_-a;;;
위의 echo문을 반복문에 넣어서 실행을 하면......
행이 4개니까 4개 모두 출력합니다. limit에서 꺼내올갯수($page)가 10으로 되어있지만...
10보다 작은 4개가 있으므로 4개 모두 꺼내옵니다.....(14개라면 10개만 꺼내오겠죠?)
결과는 아래와 같이 나올겁니다.
우헤헤
바보
움하하
테스트
역순으로 나왔죠?....order by no desc 즉, no의 내림차순이니까...4,3,2,1순으로 나온거죠
$data[memo]를 출력한거니까....memo부분만 출력되었습니다.
좀 눈치빠르신분들은 지금 이 예제로 대충 감을 잡으셨을것 같습니다....
자 그럼~ 좀더 제대로 한번 만들어 볼까요?...
테이블을 구성해 봅시다...
<table border=1>
<tr><td>번호</td><td>이름</td><td>메모</td><td>시간</td></tr>
</table>
위와 같이 각 항목을 셀로 만들어 한행에 4개의 열을 생성했습니다.
번호 이름 메모 시간
---- ---- ---- -----
이렇게 나오는거겠죠?
그럼 DB에서 꺼내오는 echo문을 어떻게 해야 할까요?
echo "<tr><td>번호</td><td>이름</td><td>메모</td><td>시간</td></tr>";
이렇게 해서 돌려주면 되겠죠...물론 안에 들어가는 항목들은 각 변수로 채워줘야 합니다.
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";
이렇게 해주면 되겠죠....
번호에 $data[no]
이름에 $data[name]
메모에 $data[memo]
시간에 $data[date]
라고 넣어줬습니다.........
그런데 시간은 우리가 DB에 넣을때 유닉스 타임스탬프로 넣어뒀죠...
그래서 알아보기 쉽게 가공해 주어야 합니다.
(년-월-일)로만 가공해 봅시다...
$data[date]=date('y-m-d',$data[date]);
date()함수를 사용해서 $data[date]를 y-m-d형식으로 변경하였습니다.
그럼 이제소스를 정리해 볼까요;;
<?
include"connect.php";//DB에 접속
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum); //가져올 시작위치를 결정합니다.
echo"
<table border=1>
<tr><td>번호</td><td>이름</td><td>메모</td><td>시간</td></tr>
"; //테이블시작
$query="select * from exam_memo order by no desc limit $start,$page"; //꺼내올 쿼리문
$result=mysql_query($query,$connect); //mysql에 요청
while($data=mysql_fetch_array($result)) //결과를 꺼내옴
{
$data[date]=date('y-m-d',$data[date]);//시간가공
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";//꺼내온것출력
}
echo"</table>";//테이블끝
?>
우리가 write.php라는 파일을 만들때.....
DB에 넣기전에 name과 memo에 addslashes()라는 함수를 적용해줬던 것이 기억나실겁니다.
특수문자에 를 붙여서 DB에 넣었었죠......
이제 꺼내올때는 를 제거해야 겠죠?^^
꺼내올때는 반대로 stripslashes()라는 함수를 사용해 줍니다.
이제 while문 속 {}에만 보도록 하죠;;
{
$data[date]=date('y-m-d',$data[date]);//시간가공
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";//꺼내온것출력
}
자 여기에 stripslashes()함수를 사용해 줄까요~
{
$data[date]=date('y-m-d',$data[date]);//시간가공
$data[name]=stripslashes($data[name]);//이름에서 제거
$data[memo]=stripslashes($data[memo]);//메모에서 제거
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";//꺼내온것출력
}
이렇게 해주면 입력할때 "나 '등을 사용했더라도 그대로 이상 없이 꺼내올수 있게 됩니다.
아래 전체 소스를 한번더 보여드리겠습니다.
<?
include"connect.php";//DB에 접속
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum)+1; //가져올 시작위치를 결정합니다.
echo"
<table border=1>
<tr><td>번호</td><td>이름</td><td>메모</td><td>시간</td></tr>
"; //테이블시작
$query="select * from exam_memo order by no desc limit $start,$page"; //꺼내올 쿼리문
$result=mysql_query($query,$connect); //mysql에 요청
while($data=mysql_fetch_array($result)) //결과를 꺼내옴
{
$data[date]=date('y-m-d',$data[date]);//시간가공
$data[name]=stripslashes($data[name]);//이름에서 제거
$data[memo]=stripslashes($data[memo]);//메모에서 제거
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";//꺼내온것출력
}
echo"</table>";//테이블끝
?>
위 소스를 list.php의 form태그 밑 부분이나 윗부분에 편하신대로 넣어주시면 됩니다.
전 밑에 넣겠습니다.
>>> list.php소스
<form method=post action=write.php>
이름 <input type=text name=name size=10 maxlength=10>
메모 <input type=text name=memo size=30 maxlength=50>
<input type=submit value=입력>
</form>
<?
include"connect.php";//DB에 접속
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum); //가져올 시작위치를 결정합니다.
echo"
<table border=1>
<tr><td>번호</td><td>이름</td><td>메모</td><td>시간</td></tr>
"; //테이블시작
$query="select * from exam_memo order by no desc limit $start,$page"; //꺼내올 쿼리문
$result=mysql_query($query,$connect); //mysql에 요청
while($data=mysql_fetch_array($result)) //결과를 꺼내옴
{
$data[date]=date('y-m-d',$data[date]);//시간가공
$data[name]=stripslashes($data[name]);//이름에서 제거
$data[memo]=stripslashes($data[memo]);//메모에서 제거
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";//꺼내온것출력
}
echo"</table>";//테이블끝
?>
>>> list.php소스끝
자 이소스를 실행하시고.......
글을 마구잡이로 넣어줍니다......
많이 넣을수록 좋겠죠~~~;;;
mysql에서 데이터를 가져오는 방법까지 알아보았습니다...
근데 항상 최근 10개만 보여지게 되죠.....
다른페이지로 가고 싶어도 갈 방법이 없습니다...-_-;;
그럼 다른 페이지로 넘어가는 방법이 뭐가 있었죠?....잘생각해보세요.....
$pagenum이라는 변수가 기억나시죠.....^^
$pagenum=0이면 최근 10개만 보여집니다.
$pagenum=1이면 최근 11개부터 10개만 보여집니다.
$pagenum=2이면 최근 21개부터 10개만 보여집니다......
......
그럼 $pagenum이라는 변수만 잘 조정해주면 우리는 다른페이지로 넘어갈 수가 있겠죠...
주소창에 get방식으로 다음과 같이 입력해 볼까요?
list.php?pagenum=1
두번째 페이지가 나올겁니다.......
그런데 이렇게 다른 페이지를 볼때마다 주소를 입력해 주기가 불편하죠...
그래서 페이지 이동버튼을 만드는 겁니다 -_-;;
자 그럼 일단 페이지 버튼의 모양부터 구상해보죠...
[1] [2] [3] [4] [5]
이런식으로 만들까 하는데.....
한번에 이렇게 5페이지만 보여집니다...
그럼 6번 페이지로 이동은?
[1] [2] [3] [4] [5] [▶▶]
여기서 >>를 클릭하면 [6] [7] [8] [9] [10] 이렇게 나오게 하죠...
앞으로 이동은 [◀◀] 을 만들면 됩니다...
쉬울것 같지만 -_-그렇지가 않더군요....저도 이부분에서 몇일밤을 샜습니다 -_-;
일단 한페이지에 보여질 목록수를 정합니다...
우린 5개로 했죠....
$pageviewsu=5; //한페이지에 보여질 목록수
그런데 그 목록그룹이 몇번째 그룹인지 정해 주어야 합니다.
예를들어 2번페이지면 1번그룹이고 8번페이지는 2번째 그룹이겠죠...
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
대입해 볼까요?......
2번째 페이지이면 $pagenum이 1,1+1은 2, 2/5($pageviewsu)이니까 0.4가 나옵니다 ceil()함수로 올림해 버리면
1이 나오겠죠......그래서 이 그룹은 1번 그룹 즉~ 1에서 5번 페이지까지 입니다.
8번째 페이지이면 $pagenum이 7,7+1은 8, 8/5($pageviewsu)이니까 1.6이 나옵니다 ceil()함수로 올림해 버리면
2가 나오겠죠......그래서 이 그룹은 2번 그룹 즉~ 6에서 10번 페이지까지 입니다.
그럼 그 그룹에 표시될 시작과 끝을 정해 줘야겠죠...
$pagestart=($pageviewsu*($pagegroup-1))+1;
목록에 표시될 페이지시작지점 입니다...
2($pagenum)번페이지였다면 페이지그룹($pagegroup)은 1이죠...
페이지그룹($pagegroup)에서 -1을 해주면 0이 됩니다.
그리고 보여질 목록수($pageviewsu)를 곱해주면 0이죠 +1을 하면 1입니다....그래서 그 그룹의 시작은 1페이지입니다.
8($pagenum)번페이지였다면 페이지그룹($pagegroup)은 2죠...
페이지그룹($pagegroup)에서 -1을 해주면 1이 됩니다.
그리고 보여질 목록수($pageviewsu)를 곱해주면 5죠 +1을 하면 6입니다....그래서 그 그룹의 시작은 6페이지입니다.
이제 시작을 정했으니 끝은 어떻게 할까요?.....
간단하죠.....시작페이지에 목록수만 더해주고 1을 빼주면 됩니다.
$pageend=$pagestart+$pageviewsu-1;
2($pagenum)번페이지였다면 그룹의시작은($pagestart) 1페이지니까 +목록수($pageviewsu)를 해주면 6이죠 -1이니까 그 그룹의 끝은 5페이지입니다.
8($pagenum)번페이지였다면 그룹의시작은($pagestart) 6페이지니까 +목록수($pageviewsu)를 해주면 11이죠 -1이니까 그 그룹의 끝은 10페이지입니다.
이부분역시 종이에 잘 대입해 가면서 적어보세요......그래야 이해가 가실겁니다...
일단 위 식들을 정리해 놓죠...
$pageviewsu=5; //한페이지에 보여질 목록수
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
$pagestart=($pageviewsu*($pagegroup-1))+1; //시작페이지결정
$pageend=$pagestart+$pageviewsu-1; //종료페이지결정
for($i=$pagestart;$i<=$pageend;$i++)
{echo $i;}
이렇게 for문으로 시작부터 끝까지 해서 $i를 찍어내면 그 그룹에 맞는 페이지리스트가 출력됩니다..
그런데 문제가 좀 있죠...
현재 20개의 글이 있으면 한페이지당 10개의 글이니까 총 2개의 페이지가 존재합니다.
그런데 페이지시작에 1페이지고 페이지끝이 5페이지죠.....그래서 5페이지까지 출력되 버립니다.
그걸 막기위해 for문에 break를 걸어 버리겠습니다.
총 페이지수($pagesu)보다 $i가 크면 break겠죠...(반복문에서 break를 만나면 반목문은 종료됩니다)
if($pagesu<$i){break;}
이 조건문을 for문에 넣어봅시다...
$pageviewsu=5; //한페이지에 보여질 목록수
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
$pagestart=($pageviewsu*($pagegroup-1))+1; //시작페이지결정
$pageend=$pagestart+$pageviewsu-1; //종료페이지결정
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
echo $i;
}
글($total)이 20개였다면 한페이지당글수($page)가 10이니까 총페이지갯수($pagesu)는 2가 됩니다.
그래서 for문을 돌다가 $i가 3이 되는 순간 break가 걸려서 반복문을 빠져나옵니다.
결국 밑에는 1과 2만 찍히는거죠..
지금상태로는 12라고 나왔으니 좀더 이뿌게 만들어줘보도록 하죠...
for문의 {}만 보도록 합시다....
{
if($pagesu<$i){break;}
echo $i;
}
이부분을 아래와 같이 바꿉니다.
{
if($pagesu<$i){break;}
echo "[$i] ";
}
[1] [2] 이런식으로 찍혔을겁니다.....
자 그럼 이제 링크를 걸어줘야 겠죠.......
링크는 <a href=list.php>에다가 ?를 사용하여 get방식으로 변수를 전달합니다.
여기서는 $pagenum이란 변수를 넘겨줘야 하는데......
1번페이지의 $pagenum=0입니다.
2번페이지의 $pagenum=1이고요......
그러니 결국 $i페이지의 $pagenum은 $i-1이 되겠죠...
그럼 다음과 같이 링크를 걸어주면 되겠죠...
{
if($pagesu<$i){break;}
$j=$i-1;
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
}
그럼 결과적으로 화면에 다음과 같은 소스로 해석되어 나옵니다.
[<a href=list.php?pagenum=0>1</a>]
[<a href=list.php?pagenum=1>2</a>]
지금까지의 소스를 쫘악 보여드리죠
>>> list.php소스
<form method=post action=write.php>
이름 <input type=text name=name size=10 maxlength=10>
메모 <input type=text name=memo size=30 maxlength=50>
<input type=submit value=입력>
</form>
<?
include"connect.php";//DB에 접속
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum); //가져올 시작위치를 결정합니다.
echo"총 <b>$total</b>개의 메모
<table border=1>
<tr><td>번호</td><td>이름</td><td>메모</td><td>시간</td></tr>
"; //테이블시작
$query="select * from exam_memo order by no desc limit $start,$page"; //꺼내올 쿼리문
$result=mysql_query($query,$connect); //mysql에 요청
while($data=mysql_fetch_array($result)) //결과를 꺼내옴
{
$data[date]=date('y-m-d',$data[date]);//시간가공
$data[name]=stripslashes($data[name]);//이름에서 제거
$data[memo]=stripslashes($data[memo]);//메모에서 제거
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";//꺼내온것출력
}
echo"</table>";//테이블끝
$pageviewsu=5; //한페이지에 보여질 목록수
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
$pagestart=($pageviewsu*($pagegroup-1))+1; //시작페이지결정
$pageend=$pagestart+$pageviewsu-1; //종료페이지결정
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
$j=$i-1;
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
}
?>
>>> list.php소스끝
처음나오는 echo부분에 "총 <b>$total</b>개의 메모"라는 부분은 메모의 총갯수를 표시해 주는것입니다.
자 그럼 이제 글을 한 60개만 넣어보죠....(더 많이 넣어도 됩니다..)
그럼 하단에 페이지이동 버튼이 1~5까지 만들어질겁니다...
그런데 페이지는 6번페이지까지 만들어져야 겠죠....60개고 페이지당10개씩이니까
이제 다음 그룹으로 넘어가도록 해주어야 합니다....
우리가 원하는건 [1] [2] [3] [4] [5] 다음에 [▶▶]라는 버튼입니다...
다음그룹으로 넘어가야죠...
그럼 다시 하단 버튼의 for문 부분만 보도록 하겠습니다.
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
$j=$i-1;
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
}
자 이 반복문이 돌아간 다음에 [▶▶]가 찍혀야겠죠...
목록이 나온 다음 그룹으로 넘어가려면....$pageend라는 변수를 생각하시면됩니다...
목록그룹의 끝이었죠......1번 그룹에서 5로 끝났으니 그냥 간단하게 다음그룹으로 넘기려면
6번째 페이지로 넘겨주면 됩니다...
결국 ($pageend+1)번째 페이지로 넘기면 되겠죠....그런데 $pagenum은 보려는페이지-1이었죠...
($pageend+1)번째 페이지의 $pagenum은 ($pageend+1)-1 즉...$pageend로 해주시면 됩니다...
<a href=list.php?pagenum=$pageend>▶▶</a> 이렇게 해주시면된다는거죠
그런데 여기서 조건이 있습니다.
다음 그룹이 존재할때만 이 버튼을 표시해 주어야 한다는거죠...
그럼 다음그룹이 존재한다는걸 어떻게 구분할까요........-_-a
마지막 페이지($pageend)가 총 페이지($pagesu)보다 작으면 그 다음 페이지가 존재하는거겠죠...^^
그 다음 페이지가 존재한다는건 그 다음에 그룹이 더 있다는거죠....
그래서 아래와 같은 if문에 넣어줍니다...
if($pageend<$pagesu){echo"[<a href=list.php?pagenum=$pageend>▶▶</a>] ";}
실행해 보시면 [1] [2] [3] [4] [5] [▶▶] 와 같이 나오고 [▶▶]를 클릭하면 [6]번 페이지로 넘어갑니다.
그런데 이제 1~5번 페이지로 돌아갈 방법이 없죠.....그래서 이제 반대로 [◀◀] 버튼을 만들어 보겠습니다.
이전 목록그룹으로 돌아가려면 이전목록그룹의 처음 페이지를 알아야 합니다...
지금 [6]이 표시되어 있으니까 이전목록그룹의 처음 페이지는 [1]이겠죠....
만약 [11]이 표시되어 있다면 이전목록그룹의 처음페이지는 [6]일겁니다.....@_@뭐가 보이시죠?
그렇슴다...지금 목록그룹의 시작($pagestart)에서 표시될목록갯수($pageviewsu)만큼 빼주면 이전 그룹의 시작페이지가 나옵니다.
그리고 여기서 $prev는 $pagenum에 들어가야 할 값이니까 -1을 해줍니다...(잊지 않으셨죠? 3페이지의 $pagenum는 2입니다....)
그럼 링크를 아래와 같이 걸면 되겠죠....
$prev=$pagestart-$pageviewsu-1;//이전목록그룹의 시작페이지결정
echo"[<a href=list.php?pagenum=$prev>◀◀</a>] ";
그런데 여기서도 조건이 있습니다....
지금 1번그룹에 있다면 [◀◀]버튼이 있으면 안되겠죠.......그래서 $pagegroup>1 때만 화면에 표시합니다...
if($pagegroup>1){
$prev=$pagestart-$pageviewsu;//이전목록그룹의 시작페이지결정
echo"[<a href=list.php?pagenum=$prev>◀◀</a>] ";
}
위 구문을 for문 앞에 써주시면 되겠죠......
자그럼 한가지만 더 추가해 볼까요?
[◀]와 [▶] 버튼으로 바로이전 페이지와 바로다음 페이지로의 이동을 구현해 봅시다.....
간단하죠?........
[◀]버튼은 현재페이지($pagenum)에 -1을 해주어서 링크를 걸어주면되고.....
[▶]버튼은 현재페이지($pagenum)에 +1을 해주어서 링크를 걸어주면됩니다.....
이것역시.....if문을 사용해서 해야겠죠....현재 첫번째 페이지라면 [◀]버튼이 필요없고
마찬가지로 마지막 페이지라면 [▶]버튼이 필요가 없습니다.
움 소스를 생각해보죠......
[◀]버튼의 링크는 다음과 같습니다.
$prevpage=$pagenum-1;
echo"[<a href=list.php?pagenum=$prevpage>◀</a>] ";
조건은? $pagenum이 0이면 안되겠죠...그래서....결국
if($pagenum){
$prevpage=$pagenum-1;
echo"[<a href=list.php?pagenum=$prevpage>◀</a>] ";
}
이렇게 되겠죠.....이 소스는 [◀◀]소스 바로 뒤와 for문 사이에 들어가면 되겠죠...
이번엔 [▶]버튼.....
$nextpage=$pagenum+1;
echo"[<a href=list.php?pagenum=$nextpage>▶</a>] ";
조건은? 지금 페이지는 마지막페이지가 아니어야 겠죠...
총 페이지수는 $pagesu입니다....
그리고 지금페이지는 $pagenum이 아니라 $pagenum+1이죠..? (예를들어 5번페이지일때 $pagenum=4이니까..)
그래서 결국 $pagenum+1과 $pagesu가 같으면 [▶]버튼은 표시되지 않습니다.
$pagenum+1과 $pagesu가 다를때 표시하도록 하면 되겠군요...
if(($pagenum+1)!=$pagesu){
$nextpage=$pagenum+1;
echo"[<a href=list.php?pagenum=$nextpage>▶</a>] ";
}
이소스는 for문과 [▶▶]버튼 소스 사이에 위치시킵니다.
자 그럼 마지막으로 한가지만 더 해보도록 하겠습니다....
현재 3번째 페이지에 위치하고 있다면 [3]은 클릭될 이유가 없겠죠...
그리고 현재가 몇번째 페이지에 있는가를 보여주기 위해 약간 모양을 바꿔줘야 겠습니다...
for문을 한번 볼까요.....
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
$j=$i-1;
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
}
echo문에 조건을 하나 걸어줍니다.....
제가 [3]을 클릭해서 3번째 페이지로 이동했습니다....
그럼 페이지 이동버튼에서 3번째 페이지로 이동하는 [3]이란 버튼의 링크를 빼보도록하죠...
if문을 써야 하겠는데.....
지금의 $pagenum=2겠죠...(3번째페이지니까)
그러니까 $i-1과 $pagenum이 같다면.....지금의 페이지로 이동하는 버튼이 되겠죠....
3번째 페이지니까 $i=3일때 현재 페이지고....$i-1은 2이고....지금 $pagenum=2니까 말이죠...
둘이 같으면 됩니다....
조건을 줘보죠.....아까 공교롭게도 $j에 $i-1을 넣어놨네요.....이걸 사용합니다..
if($j==$pagenum) 맞죠?....이식이 참이면 현재 페이지를 나타내는 버튼입니다.
echo "[<a href=list.php?pagenum=$j>$i</a>] ";
이부분을 다음과 같이 수정해볼까요...
if($j==$pagenum){echo "$i ";}
페이지이동버튼을 출력하다가 현재 페이지이면 링크를 걸지 않고 숫자만 보이도록 했습니다...
그럼 아닐땐?
if($j==$pagenum){echo "$i ";}
else{echo "[<a href=list.php?pagenum=$j>$i</a>] ";}
else로 아까 있던 문장을 그대로 써주면 되겠죠...
자 그럼 완성된 소스가 나갑니다.........쭈우욱~~~~
>>> list.php소스
<form method=post action=write.php>
이름 <input type=text name=name size=10 maxlength=10>
메모 <input type=text name=memo size=30 maxlength=50>
<input type=submit value=입력>
</form>
<?
include"connect.php";//DB에 접속
$query="select count(*) from exam_memo"; //쿼리문저장
$total=mysql_fetch_array(mysql_query($query)); //쿼리문입력
$total=$total["count(*)"]; //갯수저장
$page=10; //페이지당 갯수
$pagesu=ceil($total/$page); //페이지수를 구합니다. 결과:4
$start=($page*$pagenum); //가져올 시작위치를 결정합니다.
echo"총 <b>$total</b>개의 메모
<table border=1>
<tr><td>번호</td><td>이름</td><td>메모</td><td>시간</td></tr>
"; //테이블시작
$query="select * from exam_memo order by no desc limit $start,$page"; //꺼내올 쿼리문
$result=mysql_query($query,$connect); //mysql에 요청
while($data=mysql_fetch_array($result)) //결과를 꺼내옴
{
$data[date]=date('y-m-d',$data[date]);//시간가공
$data[name]=stripslashes($data[name]);//이름에서 제거
$data[memo]=stripslashes($data[memo]);//메모에서 제거
echo "<tr><td>$data[no]</td><td>$data[name]</td><td>$data[memo]</td><td>$data[date]</td></tr>";//꺼내온것출력
}
echo "<tr><td colspan=4 align=center>";
$pageviewsu=5; //한페이지에 보여질 목록수
$pagegroup=ceil(($pagenum+1)/$pageviewsu); //페이지 그룹결정
$pagestart=($pageviewsu*($pagegroup-1))+1; //시작페이지결정
$pageend=$pagestart+$pageviewsu-1; //종료페이지결정
if($pagegroup>1){
$prev=$pagestart-$pageviewsu-1;//이전목록그룹의 시작페이지결정
echo"[<a href=list.php?pagenum=$prev>◀◀</a>] ";
}
if($pagenum){
$prevpage=$pagenum-1;
echo"[<a href=list.php?pagenum=$prevpage>◀</a>] ";
}
for($i=$pagestart;$i<=$pageend;$i++)
{
if($pagesu<$i){break;}
$j=$i-1;
if($j==$pagenum){echo "$i ";}
else{echo "[<a href=list.php?pagenum=$j>$i</a>] ";}
}
if(($pagenum+1)!=$pagesu){
$nextpage=$pagenum+1;
echo"[<a href=list.php?pagenum=$nextpage>▶</a>] ";
}
if($pageend<$pagesu){echo"[<a href=list.php?pagenum=$pageend>▶▶</a>] ";}
echo"</td></tr></table>";//테이블끝
?>
>>> list.php소스끝
휴우~......-_-정말 길었네요......
예전에 n@board를 처음 만들때 이 목록 이동 로직에 대해서 한동안 애를 먹었습니다..
어디 마땅히 설명이 나온곳도 없고말이죠.....
그리고 혼자 끙끙거리다가 -_-; 겨우 완성했었던 기억이........
그런데 해놓고 나니.....별로 대단한건 아니더군요....
그냥 계산좀 하다보면 술술술 나오는 것이었습니다....
문제는 어떻게 하나의 로직으로 구성을 짓느냐는 것이죠.....
사실 이렇게 강좌만 보시면 잘 이해가 안가실겁니다.....
좋은 방법 하나 알려드리면.......
일단 강좌를 프린트 합니다.....
그리고 지하철이나 이동중에 또는 틈틈이 자알 반복해서 읽어보세요....
그러다 보면 조금씩 이해가 가실겁니다.....
그리고 꼭 한번 자기가 실행해보는것도 좋겠죠.....
지금까지 만든 메모장 예제는....
http://navyism.yezzang.com/exam_memo/list.php
여기입니다~
태초에 나는 개그이야기를 만들었다.
내말을 믿고 나를 따르면 천당,
내말을 믿지않고 나를 따르지 않으면 지옥,
나는 하늘나라(우주)에 사느니라.
그럼 난 외계인?




웃대가리
