1.2 웹 서버의 종류
대중의 인기를 끌었던 웹 서버의 종류는 Apache , IIS, Netscape, NCSA, WebSTAR , CERN, MacHTTP로 요약할 수 있습니다.
- Apache - 유닉스 기반의 웹 서버로 발전 했으며 마이크로소프트 윈도우 환경도 지원합니다. 현존 하는 서버 중 가장 많은 점유율을 가지고 있습니다.
- IIS(Internet Information Server) - NT 기반의 웹 서버이며 주로 사용되는 스크립트 언어는 ASP입니다. 하지만 최근에는 PHP와의 접목도 이루어지고 있습니다.
- NCSA - 유닉스 기반이고 아파치 웹 서버의 초기 모델이며 현재는 아파치 웹 서버�"� 자리를 물려준 상태입니다.
- Netscape, CERN - 유닉스 기반이며 현재 Apache에 밀려 사용자가 현격히 감소한 상태 입니다. 현재 각 웹 서버의 사용자 층을 확인할 때 Apache 웹서버가 나머지 웹 서버의 사용자를 모두 합한 것을 넘어선 상태입니다.
1.3 웹 서비스의 종류
웹 서비스의 종류는 다양한 사용자의 욕구와 이를 만족 시키기 위한 개발이 지속적으로 이루어지는 한 계속해서 증가 할 것 입니다. 물론 같은 서비스라도 경쟁을 위해 차별화를 추구할 것입니다. 웹 서비스의 예를 보면 여러 가지 콘텐츠를 이용한 다중 쇼핑 몰(전자 제품, 가정 용품, 의류, 잡화)에서 한가지 상품을 특화한(농산물, MP3, 공연 예매, 스포츠 용품…)사이트 각 개인의 정보와 여러 가지 디렉토리 서비스, 일반적인 자료의 공유와 정보 교환 사이트 등 여러 방식이 존재 합니다. 물론 이것은 차별화를 위한 하나의 방편 입니다. 차별화를 위해서는 디자인도 중요하지만 내용이 우선해야 됩니다. 좋은 예로 뉴욕 타임즈를 보면 알 수 있습니다. 즉, 인지도에 의한 해당 쇼핑 몰의 인기도가 중요한 역할을 합니다. 이를 극복하는 것은 오직 차별화 입니다.
- 다중 쇼핑몰의 예
-

1.4 전자 상거래
가장 포괄적으로 생각하는 전자 상거래의 의미는 인터넷을 이용하여 돈에 해당하는 물건을 주고 받는 것입니다. 돈의 가치를 지닌 전자화폐를 주고 원하는 물건을 살 수도 있습니다. 다시 말해 네트워크를 통한 상품의 거래이며 광고, 기타 모든 서비스의 구매 활동 등을 말합니다. 이것은 실물 경제와는 다른 또 다른 경제 형태가 될 것입니다. 하지만 아직 이러한 전자 화폐의 지불과 물건 구입은 이루어지지 않습니다. 다만 사이버 머니 개념의 소액전자화폐 등을 이용한 이벤트형식의 물건 거�"� 이루어지고 있습니다.
1.5 전자 상거래의 문제점
신용카드를 이용하거나 은행 지로 번호를 통한 돈의 거래는 활발히 이루어 지고 있지만 정작 전자 화폐의 이용은 아직 보안과 여러 다른 여러가지 이유로 인해 개발이 늦어 지고 있습니다. 만약 이러한 여타의 문제들이 해결 된다면 인터넷 쇼핑몰은 한층 인기가 상승할 것 입니다. 전자 화폐의 근본적인 문제는 물론 돈의 발행, 이중성 , 통화 , 복제 등 여러가지가 있을 수 있습니다. 이러한 문제점이 해결되고 안정적인 전자 결재가 이루어 진다면 은행의 역할 역시 감소할 것입니다. 이것은 각 은행의 수수료 수입의 감소와 자금 조달 방법 또한 새로워 지게 하기 때문 입니다. 세계적으로 이러한 전자 상거래의 표준화 작업은 각국의 독특한 방식으로 진행 중이며, 시장을 선점하기 위해 치열한 노력을 하고 있습니다.
- 전자 상거래 관련 사이트
-
전자상거래 위원회 - http://www.ecc.or.kr/
<TIP>
----------------------------------------------------------------------------전자상거래 자격증
전자상거래 위원회에서는 전자상거래 관리사 자격증을 신설했으며 이로 보다 전문적으로 사이트를 구성하고 주도하는 인력을 배출할 것입니다. 보다 자세한 내용은 해당 사이트를 방문하면 정보를 얻을 수 있습니다. http://www.ecc.or.kr/
관련 과목

- 정보통신부 - http://www.mic.go.kr/
- 한국무역 정보통신 - http://www.ecrc.or.kr/
- 한국전자상거래 관리사 협회 - http://www.ecca.co.kr/
- 한국 전자거래 협의회 - http://www.kcals.or.kr/
- 중소기업진흥공단 전자상거래 지원 센터 - http://ecrc.smipc.or.kr/
- 한국 생산성 본부 전자상거래 지원 센터 - http://ecrc.kpc.or.kr/
- 한국유통 정보 센터 - http://www.eankorea.or.kr/
- 한국 전자거래 진흥원 - http://www.keb.or.kr/
- 한국 표준 협회 - http://www.kisi.or.kr/
- 한국 건설기술 연구원 - http://www.kisi.or.kr/
- 한국 전자상거래 관리사 협의회 - http://www.ecca.co.kr/
- 한국 커머스넷 - http://www.commercenet.or.kr/
- 정부EDI/EC 지원 센터 - http://ediweb.nca.or.kr/
1.6 전자 상거래 동향과 개선할 부분
한국 전산원의 통계에 따르면 1999년 기준으로 국내 쇼핑 몰 사이트의 수는 400개에 육박하며 현재 계획 중이거나 활동중인 사이 계속 증가하는 추세 입니다. 각 쇼핑 몰의 경우 인지도에 따라 서비스 콘텐츠에 따라 활동이 활발한 사이트는 일부 입니다. 대표적으로 유니플라자 , 삼성인터넷 쇼핑몰 , 롯데 백화점을 들 수 있습니다. 국내의 전자 상거래 규모는 600억 정도의 규모로 예상 하며 본격적인 전자 상거�"� 이루어 지면 기존의 시장을 위협할 수준에 도달할 것으로 보입니다. 이러한 수준에 도달 하기 위해서는 표준화가 이루어 져야 되고 보안 , 유통채널의 다변화 등 여러 가지 개선할 부분들이 존재합니다. 무엇보다 수익성 있는 콘텐츠 개발 또한 중요한 부분 입니다.
1.7 마무리
이 장에서는 PHP를 접하기 전에 웹서버 종류에 대해서 간략히 살펴 보았습니다. 현재 가장 각광 받는 쇼핑 몰과 이를 위한 전자 상거래에 관한 것을 보았습니다. 다음 장에서는 웹서버 구축에 필요한 Apache , Php , Mysql를 알아보겠습니다.
2. 웹서버 구축에 필요한 것들 (PHP , APACHE , MYSQL)
2.1 Apache , Php , Mysql 소개
웹 개발에는 많은 도구가 필요합니다. 하드웨어를 비롯하여 소프트웨어에서도 그 종류는 많습니다. 크게 웹서버프로그램, 데이터베이스 그리고, 개발 언어입니다. 모든 운영체제에서 웹서버를 구축할 수 있고 또한 공개 프로그램이면서도 기능이 뛰어난 아파치 웹서버와 Mysql 데이터베이스, PHP 언어에 관하여 소개를 하겠습니다.
Apache 웹 서버
아파치 웹 서버는 대중의 힘을 바탕으로 가장 큰 인지도를 얻을 만큼 사용자가 이끌어 가는 서버 입니다. 여타의 상용 서버를 밀�"牆 우뚝 설 수 있었던 이유는 오픈 소스 개발에 따른 보다 빠른 사용자 중심의 개발로 인한 수많은 개발자의 합류 입니다. 무엇 보다 상용 서버에 뒤지지 않는 신속한 버그 PATCH와 끊임없는 수많은 개발자의 지원과 안정성 입니다. 이러한 점으로 웹 서버 시장에서 다른 서버와 비교해 웹 서버 시장에서 과반수 이상의 점유율을 보이고 있습니다.

공식 아파치 사이트 외에 각 국가별 그룹별로 사이트가 존재 하는데 한국 아파치 그룹에 가면 한글화 된 아파치 서버의 최신 정보와 기술적인 문제를 볼 수 있습니다.

Apache 웹 서버의 역사
아파치 프로젝트의 시작은 처음 1995년경 대중의 사랑을 받던 NCSA의 개발자중 일부가 모여 시작 했습니다. 이것을 시발로 NCSA HTTPD 개발자와 아파치 개발자들이 합류되고 이전에 만들어졌던 아파치 0.6.2를 완전히 개선한 0.8.8을, 그리고 아파치 1.0을 1995년10월에 만들어 냈습니다. 아파치 서버는 단기간에 기존의 NCSA 자리를 밀�"� 선두에 올랐습니다. 이 상승세는 지금도 계속 중이며 다른 여타의 서버가 넘보지 못하는 자리에 있게 되었습니다. 이것은 물론 직접 관여하는 개발자 이외에 전세계 아파치 그룹 및 사용자들이 항상 테스트 하고 패치하는 작업의 결과입니다. 다른 서버가 넘보지 못하는 부분이 이런 오픈 소스 개발일 것입니다. 아파치는 멈추지 않는 것입니다. 누군가 멈추려 해도 절대 멈추지 않는 지속적인 개발이 이루어 지는 것입니다.
Apache GUI Tool
아파치를 사용자 중심의 웹 서버로 만드는 노력도 진행 중입니다. GUI 프로젝트 즉, 코만치 프로젝트라 불리는 이 작업은 아파치의 운용을 그래픽적으로 할 수 있게 하는 것입니다. 많은 부분이 완성 되었고 리눅스 배포판에도 포함되어 있습니다. 아파치 서버는 모든 설정이 텍스트 파일인 httpd.conf를 수정하는 방법이기 때문에 다소 그래픽 환경에 익숙한 사람�"都� 불편할 수도 있고 접근하기 까다로운 부분이 있기 때문에 이 프로젝트는 앞으로 아파치서버의 발전에 중요한 부분을 차지하게 될 것입니다.

코만치 사이트에서 코만치에 관한 정보와 각 환경에 따른 코만치 설치 파일을 다운 받을 수 있습니다.
각 환경에 따른 지원 파일
- w Linux binary
- w Windows 9x/NT/2000 binary
- w HP-UX PARISC binary
- w Solaris Sparc binary
- w Irix MIPS binary

코만치 메인화면을 보면 기존의 httpd.conf에서의 설정을 정말 간단히 깔끔하게 수정 할 수 있게 개발 된 것을 볼 수 있습니다. 이것은 기존의 텍스트 환경에서 작업 하던 사람 또한 쉽게 접근하게 되어 있습니다.
코만치의 Properties configuration 화면




위 그림들을 보면 기존의 설정하는 부분을 아주 쉽게 생성하고 수정할 수 있게 되어 있음을 알 수 있습니다. 코만치는 또한 여러 운영체제별로 실행 파일을 제공하고 있으며 계속 개발 중입니다. 물론 아직 개선할 점을 찾으며 계속 개발 중인 윈도우용 아파치를 지원하는 코만치 또한 존재합니다.

Apache 사용자 현황
전세계 웹 서버 시장을 볼 때 아파치 서버의 사용은 월등합니다. 이것은 무엇보다 공짜임에도 불구하고 강력한 기능과 빠른 패치 따른 이유입니다. (아파치 서버의 사용자 현황은 www.netcraft.com의 자료를 인용 했습니다.)
netcraft 웹 서버관련 통계

위 그림에서 아파�"� 다른 웹 서버 사용자 수를 모두 합한 것 보다 높은 것을 볼 수 있습니다.


위 그림들에서 볼 수 있듯이 아파치 서버는 발전면에서 그리고 최고 사용 서버에서 모두 월등히 높음을 알 수 있습니다.

위 그림은 최근 몇 년간 각 서버의 변화 모습입니다. 2000년 현재 아파치 서버를 가동 중인 도메인은 400만개 이상이 되는 걸 볼 수 있습니다.
아파치에 관한 문서를 잠시 보면 웹 프로토콜의 독점을 막아야 된다고 말하고 있습니다. 인터넷에서 특정 기업에 의한 독점이 이루어 진다면 그것은 인터넷의 자유로움과 자유 경쟁을 위배하는 것입니다. 이러한 이유로 아파치는오픈 소스 프로젝트를 지향하고, 무료로 배포하는 이유 중에 하나입니다. 이 시간에도 전세계 수많은 개발자와 사용자들이 아파치를 보면서 문제점이 있는지 �"� 하고 있을 것입니다. 자신이 아파치 서버에 만족하고 기능 개선을 바란다면 뉴스 그룹에 어떠한 글을 올려도 도움이 될 것입니다. 이런 응답 글 하나하나가 아파치 서버 사용자와 개발자들�"� 중요한 도움이 될 것이며 이렇게 발전한 이유입니다.
2.2 PHP
PHP 소개
PHP는 처음 웹 스크립트 언어를 접하는 이�"� 보다 쉬우면서 보다 빠른 시간에 웹을 다이나믹 하게 만들어 줍니다. 이것은 빨리 변화되는 인터넷 시장에서 중요한 역할을 하는 것입니다. 이러한 PHP(Professional HyperText Preprocessor)는 서버에서 해석되는 HTML에 내장되어 동작하는 스크립트 언어입니다. C, Java, Perl 등에서 많은 문장 형식을 빌려왔으며 웹 브라우저 등으로 실제 코드를 볼 수 없다는 것에 보안상 유리한 점도 있습니다. 무엇보다 이 언어는 웹을 개발하는 이�"� 보다 편리한 환경을 제공해줍니다. 또한 CGI 프로그래밍 언어(C, Perl)와 ASP들이 만들어 냈던 BBS, 웹메일, 쇼핑 몰에 이르기까지 대부분을 쉽게 만들 수 있으며 상업, 비상업적으로 얼마든지 사용 가능한 언어입니다. 설치 환경은 Linux, Unix, 윈도우 등 대부분의 운영체제를 지원합니다.

PHP가 지원하는 데이터베이스
현존하는 데이터베이스를 거의 지원합니다. 간단한 게시판이나 방명록을 만들 경우라도 요즘은 데이터베이스를 사용합니다. 무엇보다 빠르게 검색 가능하면서 체계적인 저장이 되므로 데이터 관리가 편리하다는 이유입니다. 한 두개의 게시물일 경우와 수백 수천개의 게시물이 있을 때, 후자의 경우라면 보다 편리한 사용 방법은 데이터베이스 구축입니다. 지원하는 DataBASE는 (Adabas D, Dbase, Oracle, Empress, PostgreSQL, FilePRO, Solid, Informix, Sybase, InterBASE, Velocis, Msql, Unix dbm)등이 있으며, PHP4 ZEND 의 경우는 더 확실한 지원을 보장 할 것으로 보입니다. 앞으로도 데이터베이스와의 쉬운 연결과 이식성 등으로 애용자가 날로 증가하리라 봅니다.
PHP의 역사
PHP는 1994년 가을 Rasmus Lerdorf에 의해 만들어졌으며, 그의 홈페이지에서 공개되어 사용 되기는 1995년 초 Persnol Home Page Tool라고 불려지면서 입니다. 이것은 몇 개의 매크로를 가진 파서(명령 해석) 엔진과 홈페이지 뒤에서 움직이는 몇 개의 유틸리티로 이루어진 것이었습니다. 또 다시 95년 중반 이 파서가 재작성 되어 PHP/FI Version 2라 불리어 졌습니다. 또, FI는 Rasmus가 작성한 HTML 형식의 데이터를 해석할 수 있는 별도의 패키지 였는데, 그는 이 둘을 합쳐 Msql을 지원하도록 하여 PHP/FI를 만들어 냈습니다. PHP/FI는 많은 사람들의 공헌에 힘입어 발전을 거듭했으며 1996년 후반 전세계적으로 15,000개 이상의 웹사이트에서 사용되어졌고 1997년 중반엔 50,000정도 이상으로 늘어났습니다. 그리고 이해 PHP/FI는 Rasmus 개인이 아닌 팀에 의해 개발되어졌습니다. Zeev Suraski와 Andi Gutmans에 의해 재작성되어 PHP 3 가 만들어졌고, 이것은 이전 버전에서 많은 기능들을 옮겨왔으며 새로운 기능들을 추가 했습니다. 정확한 통계자료는 아니지만 NETCRAFT의 통계 자료를 보면, 현재 전세계 300,000대 이상의 웹 서버에서 사용중입니다. 만약 도메인에서 사용중인 PHP를 보면 두배 이상이 될 것입니다. 앞으로도 아파치 웹서버의 증가와 PHP4 ZEND의 다양한 포맷 지원으로 더 증가하리라 생각합니다. (PHP3의 FAQ와 Andi Gutmans의 글을 참조 했습니다)
PHP3와 PHP4 ZEND
PHP3와 PHP4를 따로 배울 필요는 없습니다. 다시말해 이 둘은 프로그램의 상위 버전이라고 생각하면 될 것입니다. (PHP4 앞으로 ZEND라함) ZEND는 PHP3가 보다 더 많은 기능을 넣기위해 복잡해진 스크립트로 인해 성능이 떨어지는 것을 본 Andi Gutmans와 Zeev Suraski에 의해 보다 원활하게 동작하게 만든 새로운 엔진 입니다. 또한 ZEND 엔진은 PHP 이외의 다른 프로그램에서도 재사용될 수 있고 앞으로 다른 언어에서도 사용 가능하리라 봅니다. ZEND 엔진을 사용하면 PHP3보다 300배 정도 성능 향상을 가져오며, 사용자가 증가했을 때 확연히 보입니다. 여기에 PLUG-IN을 별도로 구매하면 더 향상을 가져올 것입니다. 그리고 ZEND는 foreach, class::method() call과 같은 새로운 문법과 PHP3에서의 사용하기에 불편했던 점을 상당히 개선 했습니다. 강화된 것을 보면, 우선 이전 버전보다 더 많이 모듈화 되었습니다. PHP3에서와는 달리 동적인 모듈화가 쉽게 되도록 설계 되어진 것입니다. 그리고 표준 CGI, Apache, Fhttpd, ISAPI(MS의 IIS를 위한), NSAPI(Netscape server을 위한)를 지원하게 되었습니다. 뿐만 아니라 기존의 ASP를 통해서 이용한 COM/DCOM까지 ZEND는 영역을 넓혔습니다. 현재 PHP4 ZEND는 candidate 1까지 나왔으며 앞으로 계속해서 업그레이드 될 예정입니다. ZEND Optimizer의 경우 현재 beta 2까지 나와 있으며 Free Down이 가능 합니다. 설치 환경은 PHP4 beta4 pl1과 이후 버전(PHP4 RC1)에서 설치 가능하며 각각의 시스템 환경을 보면 아래와 같습니다.
- x86 Linux glibc2.1-based systems (tested on Red Hat 6.1, Mandrake 7.0, Slackware 7.0 and SuSE 6.2).
- x86 Linux glibc2.0-based systems (tested on Red Hat 5.2 and SuSE 6.1)
- x86 Linux libc5-based systems (tested on Slackware 4.0 and Debian 1.3.1r8)
- Sparc Solaris 7
- FreeBSD 3.4 and 4.0
- Windows NT 4.0 (not tested on other versions of Windows)

www.zend.com으로 가면 간단한 가입 절차와 함께 메일로 패스워드를 받고 로그인 후 ZEND Optimizer를 다운로드 할 수 있습니다.


위 그림에서 zend , 웹 서버 , 데이터베이스 , 브라우저의 역할에 대한 간략한 구조를 확인 할 수 있으며 zend 엔진이 이러한 구조에서 담당하는 부분을 확인 할 수 있습니다.
PHP와 ASP
PHP와 ASP는 근본적으로 서버용 객체 지향적인 스크립트 언어라는 점에서 같지만, ASP의 경우 IIS, PWS와 같은 윈도우 환경에서 움직이는 서버를 지원하는데 반해 PHP는 Apache, IIS, PWS, 서버 등과 유닉스 윈도우 환경에서 움직이는 모든 서버를 지원합니다. 또한 PHP는 위에서 언급한 데이터베이스 같은 경우 ODBC에 의한 연결과 유닉스에서 사용되는 거의 모든 DB를 연결해 줍니다. 무엇보다 매력적인 것은 PHP 코드 내에서 사용자 자신의 객체를 정의해서 사용할 수 있다는 점입니다. 이것 말고도 여러 가지 장점들이 많이 있습니다.
2.3 Mysql
Mysql에 관해서
Mysql 데이터베이스는 다른 상용 데이터베이스와 비교해 안정성과 기타 여러 문제에 크게 떨어지지 않으면서 공개되어진 데이터베이스입니다. 다양한 함수와 여러 기능면에서 상용 데이터베이스가 가지지 못한 점을 가진 것도 많이 있습니다. 그리고 공개된 다른 데이터베이스와 비교 할 때 사용자 또한 넓습니다. Mysql은 C , C++, Java, python, tck/tk, ODBC도 제공하며 다양한 웹서버와의 연결도 용이합니다. ODBC는 Ms 윈도우(win95 , win98 , NT) 등을 제공합니다. 현존하는 윈도우의 대부분을 지원 하며 설치 또한 대부분의 OS를 지원 합니다. Mysql을 개인적인 용도로 사용할 경우 무료이며 상업적인 목적으로 사용할 경우 mysql 개발팀에 조금의 후원을 하면 가능합니다.

Mysql이 지원하는 OS와 패키지
- AIX 4.x with native threads
- BSDI 2.x with the included MIT-pthreads package
- BSDI 3.0, 3.1 and 4.x with native threads
- DEC UNIX 4.x with native threads
- FreeBSD 2.x with the included MIT-pthreads package
- FreeBSD 3.x with native threads
- HP-UX 10.20 with the included MIT-pthreads package
- HP-UX 11.x with the native threads.
- Linux 2.0+ with LinuxThreads 0.7.1 or glibc 2.0.7
- MacOS X Server
- NetBSD 1.3/1.4 Intel and NetBSD 1.3 Alpha (Requires GNU make)
- OpenBSD > 2.5 with native therads. OpenBSD < 2.5 with the included MIT-pthreads package
- OS/2 Warp 3, FixPack 29 and OS/2 Warp 4, FixPack 4
- SGI Irix 6.x with native threads
- Solaris 2.5, 2.6 and 2.7 with native threads on SPARC and x86
- SunOS 4.x with the included MIT-pthreads package
- SCO OpenServer with a recent port of the FSU Pthreads package
- SCO UnixWare 7.0.1
- Tru64 Unix
- Win95, Win98 and NT
Mysql의 주요 기능
Mysql은 C , C++ 로 작성 되어졌으며 많은 테스트를 통해서 안정성을 입증했습니다. 또한 SQL문의 대부분을 완벽하게 지원하며 각 테이블에 16개의 인덱스를 생성 할 수 있습니다. 큰 규모의 테이블을 생성할 수 있으며 원격으로도 접속 가능 합니다. 다양한 컬럼 타입을 제공하며 사용자 관리를 쉽게 할 수 있습니다. 이외 다양한 기능들이 있으며 모든 스크립트들이 마찬가지 이지만 데이터베이스와의 유연한 연동은 필수가 되었습니다. Mysql 역시 이점이 탁월하며 모든 플랫폼에서 지원되므로 사용 범위 또한 넓은 것입니다. 처음 mysql이 Tcx 내부에 사용될 목적으로 만들어 졌습니다. 이것은 그 당시의 여타 SQL서버 보다 성능이 좋아야 했습니다. 이처럼 뛰어난 데이터베이스를 현재 우리가 무료로 사용하고 있는 것입니다.
Mysql GUI Tool
Mysql 역시 일반 텍스트 기반이 아닌 그래픽적으로 쉽게 작업할 수 있는 GUI Tool이 있습니다. 이 Tool의 기능들은 물론 스크립트로 만들 수도 있습니다. 이렇게 대부분의 프로그램들은 처음 텍스트 기반하지 않고 사용자 중심의 GUI 기반의 Tool을 생성함으로써 보다 넓은 사용자 층을 확보하고 있습니다.

GUI Tool은 유닉스 기반에서 처음 만들어 졌습니다. 지금은 윈도우 기반의 툴 또한 다양한 기능을 제공하고 있고 데이터베이스의 원격관리에서 다양한 사용자 편의를 제공합니다. 일반적인 Telnet 접속을 해서 데이터베이스를 관리하는 방법에 식상한 사람들과 처음 데이터베이스를 접하는 사람들에게 좋은 방법을 제시합니다.
MS 윈도우 용 GUI Tool






다음 장에서는 리눅스 환경에서 Apache , Php , Mysql 설치를 자세히 알아 보겠습니다.
3. 리눅스에서 APM 설치하기
APACHE , PHP , MYSQL을 Linux에서 설치 하는 방법을 알아 보겠습니다. 위 프로그램들은 최근 업그레이드 된 걸로 여러분들은 설치하세요. 최근 버전일수록 설치하는 과정은 조금 다를 수 있습니다. RPM 패키지로 인스톨 하는 방법도 있지만 설치할 때 사용 옵션의 추가와 위치 등 여러 가지 장점이 있는 TAR 패키지를 이용하여 설치하도록 하겠습니다.
A.P.M(Apache, Php, Mysql)의 설치는 다음 순서로 진행합니다.
3.1 A.P.M을 설치하기 전에 할 일
설치는 APACHE에 모듈을 추가해서 컴파일하겠습니다. 최근의 업그레이드된 프로그램은 아래의 사이트에서 구할 수 있습니다.
- Apache - http://www.apache.org/
- Php - http://www.php.net/
- Mysql - http://www.mysql.org/
먼저 CD에 있는 APACHE, PHP, MYSQL을 임시 디렉토리에 옮겨 놓습니다. 여기서는 /TMP 디렉토리에 옮겨서 설치를 하겠습니다. 여러분의 임의 디렉토리로 옮겨서 사용하면 됩니다.
<TIP>
----------------------------------------------------------------------------
CD 마운트하기
CD 마운트에 익숙치 못한 분을 위해 마운트 하는 방법을 간단히 설명하겠습니다. /etc/fstab 파일의 내용중 cdrom 항목이 대부분 인스톨 시에 있기 때문에 다음과 같이 합니다. -.fstab 의 cdrom 항목이 auto 일 경우 auto로 설정되어 있다면 부팅 전 cd가 있을 경우 /mnt/cdrom 디렉토리에 가면 cd 내용을 볼 수 있습니다. -.fstab의 cdrom 항목이 auto가 아닐 경우 cd를 넣은 다음 #mount /mnt/cdrom 하면 cd 내용을 볼 수 있습니다. -.또 다른 방법 레드핫 6.0 버전 이라면 Xwindow에서 cdrom을 마운트와 언마운트 할 수 있습니다. 만약 그 이전 버전이거나 다른 문제가 있을 경우 아래와 같이 합니다. #mount -t iso9660 /dev/cdrom /mnt/cdrom--------------------------------------------------------------------------------
2)실행중인 아파치 프로세스 찾기
/tmp 디렉토리로 APACHE , PHP , MYSQL을 다 옮겼다면 먼저 기존의 인스톨 때 생긴 APACHE를 지워야 합니다. 만약 있는 상태에서 또 인스톨 한다면 두개가 겹쳐 에러가 발생할 소지가 생깁니다. 리눅스 인스톨 때 APACHE를 제외했다면 이 부분은 넘어가도 됩니다.
#ps -ef | grep http - 이 명령을 실행하면 현재의 아파치 서버 프로세서를 확인할 수 있습니다.

3)실행 중인 아파치 프로세서 제거
Root 프로세서 541번을 제거합니다. 그러면 자식 프로세서도 다 같이 제거됩니다. 이 프로세서 번호는 다를 수 있습니다.
#kill 541 - 프로세서 제거 합니다.

실행할 때 마다 프로세서는 다르기 때문에 혹시 프로세서 번호가 자신의 것과 다르다고 이상히 여기지 마세요. 프로세서를 제거 했다면 2)번 과정을 한번 더 해서 완전히 제거 된 것을 확인 합니다.
4)기존에 설치된 아파치 찾기
rpm버전의 인스톨이 대부분이겠지만 rpm이 아닌 경우 아파치 관련 디렉토리를 찾아 제거해야 됩니다. rpm버전인 경우 일일이 관련 디렉토리를 찾아 제거해도 되지만 rpm 명령으로 간단히 제거 할 수 있습니다.
#rpm -ql apache - rpm으로 설치된 아파치 디렉토리를 찾아 줍니다.

rpm 패키지로 설치된 아파치 디렉토리를 찾는 방법은 만약 rpm 삭제 명령으로 아파�"� 제대로 제거 되지 않을 경우 설치된 디렉토리의 내용을 찾아 제거해야 되기 때문에 알아두기 바랍니다. rpm 패키지로 설치할 경우 아파치 서버의 모듈 추가와 기타 다른 설정에서 여러 문제점들이 나타날 수 있습니다. 비록 처음 접하고 다소 어렵게 느껴지더라도 바이너리 인스톨을 권장 합니다.
<TIP>
----------------------------------------------------------------------------
rpm으로 설치된 프로그램의 정보 보기 #rpm -qi 패키지명 - 해당 패키지의 존재 여부를 확인 합니다. 위 명령은 rpm으로 설치된 PHP나 Mysql을 찾을 경우도 마찬가지 입니다. 만약 의존성 문제로 인해 rpm 패키지 삭제명령( 5)번 참고)이 실행 되지 않을 경우 위 명령으로 관련 디렉토리와 파일을 찾고 삭제 하면 됩니다. 여기서 설명할 TAR 패키지 설치의 경우 아파치 설치 디렉토리는 아래와 같습니다.
/usr/local/apache /apache/bin /apache/htdocs /apache/cgi /apache/conf /apache/icons /apache/logs …--------------------------------------------------------------------------------
5)rpm으로 설치된 아파치 제거 하기
#rpm -e apache - rpm 설치 아파치를 제거해 줍니다.

5)번 명령을 한번 더 실행해서 패키지가 제거 되었는지 확인합니다. 만약 아파�"� 설치되지 않았다면 error 메시지가 나올 것입니다.
3.2 A.P.M 설치하기
1) apache 파일 풀기
tmp 또는 여러분들이 정한 임의 디렉토리로 아파치를 copy 합니다. 다음 아래의 명령을 실행 합니다.
#zcat apache_1.3.12.tar.Z | tar xvf - - 해당 패키지의 압축을 풀어 줍니다.

<TIP>
----------------------------------------------------------------------------
tar.gz 과 tar.Z 패키지 풀기
위 패키지를 푸는 방법은 몇 가지가 있습니다. #tar -xvzf 패키지명 - 이 명령으로 두 종류의 패키지를 다 풀 수 있습니다. #gunzip 패키지명 - gz 와 Z로 압축된 패키지를 풉니다. #gzip -d 패키지명 - gz 와 Z로 압축된 패키지를 풉니다.--------------------------------------------------------------------------------

위를 보면 apache_1.3.12/ 디렉토리가 생성된걸 볼 수 있습니다. 설치하는 과정에서 mc(midnight command : 옛날 도스 시절 m과 유사한 유닉스 프로그램)를 사용해서 설치하는 분도 있을 것입니다. 디렉토리 사용에 copy나 기타 명령들이 다양하므로 리눅스의 텍스트 모드에 익숙치 않은 사람은 이 프로그램을 사용하기 바랍니다.
2) 아파치 디렉토리의 ./configure 와 ./Configure 실행
apache_1.3.12 디렉토리로 가서 ./configure를 한번 실행해 줍니다. Apache에 디렉토리 (./configure 와 ./Configure 두 가지가 있으니 주의하기 바랍니다.) 다음 /apache_1.3.12/src 디렉토리로 옮겨 ./Configure를 실행합니다.


3)Mysql 풀기
./configure , ./Configure를 했다면 이제 apache는 잠시 두고 mysql을 풀도록 하겠습니다. /tmp나 여러분이 정한 임의 디렉토리로 패키지를 copy 합니다. 그리고 다음 명령을 실행 합니다.
#zcat mysql-3.23.12c-alpha-pc-linux-gnu-i686.tar.gz | tar xvf - - 해당 mysql 패키지를 풀어 줍니다.

여기 인스톨 할 mysql은 3.23.12c 버전 입니다. 여러분은 최근 버전을 다운 받아 설치하세요. 이렇게 바이너리 배포본을 인스톨 하는 이유는 다른 것보다 어느 정도 성능 향상이 있기 때문입니다. 바이너리를 컴파일 할 경우는 정적으로 링크가 이루어지게 되기 때문입니다. 직접 컴파일할 경우라도 정적으로 링크시킬 수 있지만 구지 그럴 필요는 없고 바이너리 배포본을 사용하기 바랍니다.

4) 풀린 Mysql 패키지 옮기기
압축을 다 풀었으면 mc나 cp 명령으로 mysql 디렉토리를 /usr/local/mysql로 옮깁니다. 물론 mysql 디렉토리는 새로 만드는 것입니다. 필자의 경우는 mc로 간단하게 옮겼습니다.

위 그림을 보면 /usr/local/mysql 디렉토리로 옮겨 놓은 것을 볼 수 있습니다.
5) ./scripts/mysql_install_db 실행
이제 /usr/local/mysql 디렉토리 안에서 ./scripts/mysql_install_db를 실행해 줍니다.
(*주의 : /usr/local/mysql/scripts 디렉토리에서 실행하는 것이 아님을 명심하기 바랍니다.)


6)Mysql Test 및 설정
./scripts/mysql_install_db 명령을 실행한 후 제대로 설치되었다면 이제 mysql을 간단히 테스트 해봅니다. 먼저, mysql의 사용자 패스워드를 바꾸어 줍니다. 디폴트는 패스워드 없이 root 권한이기 때문에 차후 php 스크립트를 만들더라도 이 부분은 꼭 집고 넘어가야 됩니다. /usr/local/mysql/bin 디렉토리에서 다음 명령을 실행해서 패스워드를 바꿉니다.
<TIP>
----------------------------------------------------------------------------
Mysql 리눅스와 함께 실행 하기
만약 여러분들이 리눅스 서버의 실행과 동시에 Mysql을 가동 하기를 원한다면 아래와 같이 etc/rc.d/rc.local파일에 추가 해야 합니다. rc.local 추가 부분 if [ -f /usr/local/mysql/bin/safe_mysqld ]; then /usr/local/mysql/bin/safe_mysqld & fi--------------------------------------------------------------------------------
① 패스워드 바꾸기 #./mysqladmin -u root password ‘ 새로운 password ’ 패스워드를 바꾸기 전 확인해보시면 알겠지만 #./mysql -u root 하면 그냥 접속 됩니다. 우선 암호를 만드는 것이 중요합니다. ② Mysql 가동과 정지 하기 mysql에 관한 보다 상세한 정보는 뒤 mysql 부분을 참고 하세요. #./safe_mysqld & - usr/local/mysql/bin 디렉토리 안에 safe_mysqld 파일이 존재하고 mysql을 백그라운드로 실행 합니다. #./mysqladmin shutdown - Mysql 서버를 정지 합니다. #./mysql.server start - /usr/local/mysql/sbin 디렉의 mysql.server 스크립트를 이용해 mysql을 실행 합니다. #./mysql.server stop - Mysql 서버를 정지 합니다. ③ ./mysql.server의 접속 확인 해당 스크립트를 사용하기 편한 곳으로 copy한 다음 모드를 chmod 700으로 바꾸어 사용 할 수도 있습니다. ( 필자의 경우 /sbin 디렉토리에 옮겨서 실행 했습니다.)


그럼 이제 mysql 서버는 동작하는 상태이므로 직접 접속을 해보겠습니다. 먼저 앞에서 말했던 패스워드 설정 부분을 다시 확인 하겠습니다.

위와 같이 바꾸고 난후 접속 합니다.(여러분들은 자신의 패스워드를 입력 합니다.)

위에서 -p 옵션을 줌으로써 패스워드 입력란이 뜹니다. 그러면 직접 입력하고 엔터하면 접속이 이루어 집니다. 다음 mysql> 바뀌게 됩니다.
④ Mysql 접속 후 기본적인 확인 여기에서 mysql의 database와 table를 확인해 보겠습니다. Mysql에 직접 접속해서 서버와 대화하는 방법은 뒷 부분의 php에서 지원하는 mysql 함수와 연관됩니다. 따라서 mysql 대화법을 안다면 php에서의 mysql 함수 또한 간단히 해결 됩니다. Mysql은 php와의 조화가 apache와 만날 때 더 강력해 짐은 아무도 부정하지 않을 것입니다. 비록 php와 apache만을 이용해서 데이터베이스 없이도 사용 할 수 있지만 mysql 데이터베이스가 접목 된다면 더 강력해지는 것입니다. 요즘의 경우 대부분의 서버가 데이터베이스를 이용하므로 아주 간단한 bbs에서 대형 bbs에 이르기 까지 유용하게 사용됩니다. 게다가 mysql은 공짜 데이터베이스이기 때문에 더욱 인기가 치솟고 있습니다. mysql>show databases ; - 현재 생성 되어 있는 데이터베이스를 보여 줍니다. (여기서 그냥 show tables ; 명령을 실행할 경우 에러 메시지가 출력 됩니다. 특정 데이터베이스 사용을 명시하지 않았기 때문입니다.) mysql>use mysql ; - mysql 데이터베이스 사용을 명시 합니다. 특정 데이터베이스 사용을 위해 use 명령을 사용 합니다. mysql>show tables ; - 디폴트로 만들어진 테이블을 확인할 수 있습니다. 여기에는 사용자와 함수들 호스트명 등 mysql 전반에 관한 사항이 존재합니다

mysql>/s - 세부적인 mysql 정보를 확인 합니다. 현재 설치된 mysql의 버전과 사용자 프로토콜 등의 정보를 확인 할 수 있습니다.

7) PHP 풀기
자 그럼 이제 php 모듈을 apache에 접목시키도록 하겠습니다. 여기 사용되어질 php는 PHP 4 zend beta 3 버전 입니다. 현재의 경우 PHP 4 정식 버전이 나왔고 그리고 zend 옵티마이져 등이 나온 상태 입니다. 여러분들은 이것을 설치하기 바랍니다. 아직 불안정한 상태라면 조금 더 지켜봐도 되지만 패치와 옵티마이져 등이 있으므로 더 강력해진 것은 사실 입니다. 먼저 php을 copy 한 /tmp(임의 디렉토리) 디렉토리에서 압축을 풉니다. ( PHP 4.0 과 설치 방법은 같으므로 진행 순서를 지켜 인스톨 하면 됩니다.)
#zcat |tar xvf - - 해당 " " 패키지의 압축을 푸는 명령어

8) PHP ./configure 실행
"7)" 과 같이 압축을 풀고 난 후 /tmp/php-4.0b3 디렉토리에서 mysql과 apache 항목을enable 시키기 위해서 ./configure를 아래염걋� 실행해야 됩니다.
#./configure --with-apache=/tmp/apache_1.3.12 --with-mysql=/usr/local/mysql
이 명령은 나머지 다른 항목을 추가 할 경우와 같이 이어서 나열하면 됩니다.
이 같은 방법은 ./setup 설정 파일이 php3 버전에서는 안정 버전이므로 존재했지만, 개발 버전이나 아직 진행중인 버전일 경우 직접 configure 해 주어야 합니다. ./setup 설정의 경우는 그냥 실행 하면 대화식으로 설정을 하는 것입니다. php 인스톨 시 추가할 항목들을 yes , no로 답하는 것입니다. 여기서의 설정은 configure로 직접 설정하도록 하겠습니다. 만약 위 configure가 실패했을경우는 (apache와 mysql 지원 설정) php-4.0b 디렉토리 안에 존재하는 config.chche 파일을 제거하고 다시 -with 옵션을 사용해서 configure 해야 합니다. 일단 configure 을 실행 했다면(apache와 mysql 지원설정) 다음의 항목을 확인하는 방법으로 실패 여부를 체크 할 수 있습니다.
<TIP>
----------------------------------------------------------------------------
GD 설치 하기
Gd는 php에서 그래픽 함수를 사용하기 위해 설치 하는 것입니다. 이것을 사용하기 위해서는 php의 ./configure 실행 때 추가 해야합니다.("8)" 항목) ① tmp 디렉토리에 gd 패키지를 copy 하고 압축을 풉니다.

② gd make 하기 압축을 푼 임의의 gd 디렉토리에서 컴파일 합니다.

③ gd 옮기기 컴파일한 gd를 임의의 디렉토리로 옮깁니다. (필자는 /usr/lib로 옮겼습니다.)

④ php의 ./configure 실행 php를 ./configure 할 때 �"--with-gd=/usr/lib" 항목을 추가합니다. 설치 성공 여부는 체크 항목을 찾아 확인합니다.


위 그림에서 아파치 지원 여부를 확인 할 수 있습니다.

위 그림에서 mysql 지원 여부를 확인 할 수 있습니다. 다른 항목을 추가 하려면 -with 옵션으로 다른 부분을 더 추가 할 수 있습니다. 여러분들 중 혹 나중에라도 다시 PHP에 또 다른 지원을 추가할 경우가 생길 경우 해당 패키지를 인스톨 하고 php의 ./configure 실행시에 --with 옵션을 이용해서 기존의 항목과 새로 추가할 항목을 다시 나열해서 해주면 되고 설치 8)번 항목 이후를 반복 하면 됩니다.

9) PHP 컴파일
php의 ./configure를 모두 마쳤습니다. 그럼 본격적으로 PHP를 컴파일 하는 것을 보겠습니다. 임시 디렉토리의 PHP를 /usr/local/php 디렉토리로 복사해서 configure했다면 거기서 make를 실행하면 됩니다. (혹, 필자처럼 /tmp/php-4.0b3 디렉토리에서 make를 해도 무방합니다. )
#make 실행


10) PHP 인스톨
먼저 PHP를 인스톨 하기 전에 apache 디렉토리의 ./configure를 실행해 주고 install을 해야 합니다. 즉, 이것은 php를 인스톨 할 때 apache 디렉토리에서 필요한 파일을 참조 시키기 위함입니다. /php-4.0b3 디렉토리에서 아래와 같이 명령합니다. #make install - PHP를 인스톨 합니다. 그러면 아파치의 src/modules 디렉토리로 모듈이 만들어져 이동합니다.
11) 모듈 확인과 아파치 Configuration 파일을 수정
#ls -l - 아파치 디렉토리밑에 /src/modules/php4 디렉토리의 내용을 살펴 봅니다.

위 그림에서 아파치 디렉토리에 php4 디렉토리가 생성되고 libphp4.module 파일과 나머지 파일들이 생성되는 것을 볼 수 있습니다. (PHP 4.0 의 경우도 마찬가지 입니다.) 다음 tmp/apache_1.3.12/src 디렉토리로 이동합니다. 그리고 Configuration 파일의 내용에 AddModule modules/php4/libphp4.a를 추가해 줍니다.
(*주의 : configure 파일이 아닌 Configuration 파일을 수정해야 됩니다. 또한 libphp4.a는 존재하지 않는 파일이므로 이대로 적어 주세요.)

12) 아파치 Configure 실행과 make 하기
Configuration 파일의 수정을 끝내고 수정 항목의 인식을 위해 /tmp/apache_1.3.12/src/ 디렉토리에서 ./Configure를 다시 실행합니다.
다음 /tmp/apache_1.3.12/src 디렉토리에서 make를 실행합니다.

위에서 중간 부분에 .. o php4_module uses ConfigStart/End 를 확인할 수 있습니다.
위 사항이 없을 경우 다시 뒤의 항목들을 확인하기 바랍니다. ( Configuration 추가 부분의 문제일 가능성이 큽니다.)
대부분의 경우는 맞게 진행 되지만 간혹 실수를 할 수도 있기 때문에 주의하기 바립니다. Apache , php , mysql의 설치는 그다지 어려운 부분이 아니므로 모든 것이 디폴트인 상황에서 대부분 성공적으로 인스톨 될 것입니다.
13) 아파치 install
make 과정을 마쳤다면 /tmp/apache_1.3.12 디렉토리로 이동 합니다.
그리고 make install을 실행합니다.
#make install


"13)" 을 마지막으로 모든 설치는 끝났지만 아직 php를 사용하기 위해서는 몇 가지 설정할 부분이 더 남아 있습니다.
Php make install의 마지막 문구를 보면 /usr/local/apache/conf/httpd.conf의 서버 설정을 변경해서 PHP 스크립트를 사용해야 함을 알 수 있습니다.
14)아파치의 httpd.conf 파일 수정
먼저 /usr/local/apache/conf 디렉토리로 이동 합니다.
그리고 편집기를 이용해서 httpd.conf 파일을 수정합니다. 수정 하는 부분은 아파치에서 php 확장자를 인식시키기 위함입니다. php 말고도 여러 가지 확장자를 설정할 수도 있습니다.
AddType application/x-httpd-php .php .html .htm .inc
이렇게 다른 확장자를 추가합니다. 즉, php 언어를 html이나 기타 다른 확장자 파일로도 사용 가능하게 해줍니다.

이렇게 모든 설정을 마쳤습니다. 이제 확인할 부분은 apache의 정상적인 작동 유무와 모듈들의 정상적인 동작 유무입니다.
Apache_1.3.12 같은 경우 httpd.conf의 설정이 전 버전 보다 조금 다를 수도 있지만 기본적인 설정은 같습니다.
(http.conf 설정에서 php4설정 부분이 추가되어 있습니다.)
15) 아파치 작동 유무 확인
아파치를 실행하는 방법과 멈추는 방법 등의 여러 가지 옵션을 확인해 보겠습니다.
apachectl 사용하기
apachectl 는 /usr/local/apache/bin 디렉토리에 서버와 관련된 유틸리티들이 존재합니다.
./apachectl (start|stop|restart|fullstatus|status|gracefull|configtest|help)
-. start - httpd 데몬을 띄웁니다. -. stop - httpd 데몬을 종료 합니다. -. restart - httpd 데몬이 존재 하면 다시 시작하고 없을 경우 새로 시작 합니다. -. fullstatus - mod_status가 사용 가능할 경우 서버의 상태를 자세히 보여 줍니다. -. status - mod_status가 사용 가능할 경우 서버의 상태를 간략히 보여 줍니다. -. configtest - httpd.conf 파일을 변경 했을 경우 이 내용을 테스트 합니다. -. help - 도움말을 보여 줍니다.
#./apachectl start - httpd 데몬을 실행 합니다.
#./apachectl stop - httpd 데몬을 종료 합니다.
<TIP>
----------------------------------------------------------------------------
pache를 리눅스와 같이 실행하기
Mysql과 같이 시작 설정에 추가해 주면 됩니다. "/etc/rc.d/rc.local" 파일에 아래 항목을 추가 합니다. If [ -f /usr/local/apache/bin/httpd ]; then /usr/local/apache/bin/apachectl start fi----------------------------------------------------------------------------------------------------
이제 httpd 데몬을 띄우고 정상적으로 동작하는지 확인합니다. 확인하는 방법은 브라우저를 통해서 해도 되고, 텍스트 모드에서 #ps -aux | grep apache를 입력해서 확인하는 방법이 있습니다. 먼저, 브라우저 같은 경우, 확인 하는 곳이 서버면 http://localhost를 입력 하면 되고 DNS 설정이 되어 있고 등록된 상태라면 해당 DNS를 입력 하면 됩니다. 만약 확인하려는 곳이 서버가 아니고 클라이언트 PC일 경우 아파치 서버의 IP나 해당 DNS를 입력합니다.

위의 경우 클라이언트에서 아파치 서버로 접속한 예입니다. 아파치_1.3.12 버전의 경우 처음 브라우저로 접속하면 위와 같이 나오니 당황하지 마세요. 위의 화면은 /usr/local/apache/htdocs 디렉토리에 존재하는 index.html을 참조하는 것인데 httpd.conf 파일의 설정 중에 서버의 처음 보여줄 파일설정을 새롭게 해 주면 그 화면만 출력되어 집니다. 아파치_1.3.9의 경우 index.html이 하나만 존재 하므로 그 파일만 출력 되는 것입니다.(1.3.12의 경우 각 언어별 index 파일이 존재 합니다.)

위 그림은 여러 가지 index.html중에 English를 선택한 화면입니다.
16) PHP4 동작 확인과 각 모듈 인식 확인
이제 php4 와 mysql의 모듈들이 제대로 동작 하는지 확인해 보겠습니다. 먼저, mysql 서버를 실행했는지 확인하고, test.php를 만들어 웹 상으로 모듈들의 인식을 확인 하겠습니다. ( phpinfo( ) 함수를 사용합니다. 이 함수는 PHP의 정보를 출력합니다.)
test.php 파일의 내용
<?php phpinfo(); ?>
위의 파일을 편집기를 이용해 만들어 줍니다. 그리고 /usr/local/apache/htdocs 디렉토리에 copy 합니다.
(필자의 경우는 test 디렉토리를 따로 만들었습니다.)
그리고 브라우저를 실행해 봅니다. 위에서 말했듯이 브라우저를 실행 했을 경우 서버는 htdoc 디렉토리를 참조하기 때문에 리눅스 머신에서는 http://localhost/test.php를 입력하면 됩니다.
(필자의 경우 http://192.168.0.1/test/test.php)

위 화면이 보이면 제대로 동작하는 것입니다. 그러나 다시 스크롤바를 내려 php 설정과 mysql 설정들을 확인하기 바랍니다. Php 설정의 경우 php.ini 파일을 이용하는데 위 화면에서 path:/usr/local/lib에 존재함을 알 수 있습니다.
<TIP>
----------------------------------------------------------------------------
HP.INI 가 /usr/local/lib에 없을 경우
php를 처음 풀고 컴파일 했던 디렉토리로 이동해 php.ini-dist 파일을 /usr/local/lib 디렉토리로 copy 하면 됩니다. 물론, php.ini로 이름을 바꾸어 사용해야 합니다.----------------------------------------------------------------------------------------------------
이렇게 모든 설정과 확인을 마쳤습니다. ( "1)" "16)" 번 항목은 몇번 되풀이 하면서 익히세요.)
PHP.INI 설정
PHP를 웹 서버에서 여러 방법으로 실행할 수 있게 설정하는 부분 입니다.
(php4 의 경우 php.ini 이고, php3의 경우 php3.ini 입니다.)

설정들을 수정 할 시에는 on, off 나 해당 값을 추가 또는 삭제하고 웹상에서 test 파일을 다시 확인하면 주어진 설정들이 바뀌었는지 확인할 수 있습니다. 다른 방법도 있겠지만 이 방법이 제일 확실합니다.

<TIP>
----------------------------------------------------------------------------
리눅스에서 Zend 설치하기
Zend optimizer의 설치는 보기 보다 간단 합니다. 리눅스의 모든 패키지 파일은 README라는 파일이 존재 하면 이와 연관된 파일을 자세히 읽었던 사람 이라면 금방 설치 방법을 알아냈을 것입니다.
Zend optimizer는 PHP 4 beta 4 이후 버전만 사용 가능하며 지금 여러분들은 이미 PHP 4.0을 설치 했을 것입니다.
지원하는 시스템
PHP 4 beta 4 버전의 경우
- Linux (glibc 2.1 systems including Redhat 6.1, Slackware 7.0, Suse 2.2, Mandrake 7.0)
- FreeBSD 3.4 (not tested on other versions of FreeBSD)
- Windows NT 4.0 (not tested on other versions of Windows)
설치와 인스톨
ZendOptimizer-Beta1-Linux-glibc2.1.tar.gz 파일을 풀고 /usr/local/Zend/lib 디렉토리를 생성 한다. 그리고 ZendOptimizer.so 파일을 이 디렉토리로 copy 한다.
다음 PHP.INI 파일에 아래의 내용을 추가 한다.
zend_optimizer.optimization_level=1
zend_extension="/usr/local/Zend/lib/ZendOptimizer.so"
위 level은 7번 까지 존재 하며 패키지 README를 읽어 보기 바랍니다.
동작 확인은 phpinfo() 함수를 사용해 PHP.INI 설정을 확인 해서 아래의 내용이 나오면 동작 하는 것입니다.
This program makes use of the Zend scripting language engine: Zend Engine v0.90, Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski with Optimizer v0.95, Copyright (c) 1998-2000, by Zend Technologies Ltd.----------------------------------------------------------------------------------------------------
PHP.INI 내용과 각 옵션의 기능(PHP4 기준)
설정 파일은 총 9개의 항목으로 나누어져 있으며 여기서는 함께 설명하겠습니다.
1. engine - PHP가 아파치 모듈로 설치 되었을 경우 특정 디렉토리에서만 스크립트가 동작하게 합니다. 이것은 아파치 httpd.conf 파일에 아래 항목을 추가합니다. <Directory "해당 디렉토리"> php_admin_flag engine on(PHP3의 경우 php3_engine on) </ Directory> 2. short_open_tag - <? ~ ?> php tag 사용여부를 정합니다. XML과 같이 사용할 경우 이 부분은 on으로 해야 합니다. 3. asp_tags - <% ~ %> ASP 태그의 사용 여부를 설정합니다. 4. y2k_compliance - y2k 문제에 해당하는 브라우저를 위한 설정입니다. 5. safe_mode - php를 안전 모드로 동작 하게끔 하는 설정입니다. safe_mode_exec_dir 지시자의 해당 디렉토리에 존재하는 실행 파일이 아닌 경우 실행 되지 않습니다. (root에 있는 파일만 참조하게 합니다.) 6. safe_mode_exec_dir - 실행 프로그램이 있는 디렉토리 명을 적어 줍니다. "5번"참고 7. max_execution_time - 스크립트 실행 시간을 초단위로 설정합니다. 8. memory_limit - 스크립트 실행 때 메모리 사용을 설정합니다. 9. error_reporting - 에러 출력을 설정합니다. 에러의 종류 1 - 일반적인 에러 출력(Normal function errors) 2 - 일반적인 에러 출력(Normal warnings) 4 - 문법적인 에러 출력(Parser errors) 8 - 버그의 가능성이 있으며 무시할 수 있는 에러 출력(Notices) 10. display_errors - 에러 상황을 html 양식으로 보여줍니다. 11. log_errors - 여러 가지 에러를 로고 파일에 저장합니다. 12. track_errors - $php_errormsg에 마지막의 에러나 경고 메시지를 저장합니다. 13. warn_plus_overloading - 스크립트에서 문자열 결합사용 때 " . " 연산자를 사용하지만 만약 " + "를 사용했을 경우 경고 메시지 출력 여부를 설정합니다. 14. track_vars - GET, POST, COOKIE 등으로 전달된 변수 값을 각각의 $HTTP_GET_VARS , $HTTP_POST_VARS , $HTTP_COOKIE_VARS의 배열 변수로 자동 저장 여부를 설정합니다. 15. magic_quotes_gpc - GET , POST , COOKIE 등으로 전달된 데이터에 ‘ " / 등의 문자가 존재할 경우 자동으로 (\)역슬래쉬를 붙일지 여부를 설정합니다. 이것은 각 문자를 스크립트와 구별 해서 인식시키기 위해 필요한 부분입니다. 16. magic_quotes_runtime - 외부 스크립트나 여타 소스로부터 돌아오는 데이터에 대해 (\)역슬래쉬를 붙일지 여부를 설정합니다. 17. auto_prepend_file - INCLUDE와 비슷한 부분이고, 스크립트의 처음 부분에 포함될 파일명을 적어 줍니다. 18. auto_append_file - "17번"과 같으며 마지막 부분에 포함될 파일명을 적어 줍니다. 19. include_path - INCLUDE, REQUIRE 문의 파일 경로를 설정합니다. 20. doc_root - 서버의 루트 디렉토리를 설정합니다. 안전 모드로 동작할 경우 해당 디렉토리를 벗어나 다른 쪽으로 접근을 할 수 없습니다. 21. user_dir - 서버의 계정을 가진 일반 유저에 PHP 스크립트의 사용을 허가할 수 있습니다. 22. upload_tmp_dir - 파일이 업로드 될 디렉토리를 설정합니다. 기본적으로 /tmp 디렉토리로 업로드 됩니다. 23. upload_max_filesize - 업로드 할 수 있는 최대 파일 크기를 설정합니다. 24. SMTP - mail( ) 함수의 사용을 위해 현 서버의 DNS , IP를 적어줍니다. 25. sendmail_from - 보내는 메일 주소를 설정할 수 있습니다. 26. sendmail_path - sendmail 서버가 있는 위치를 적어 줍니다. 27. debugger.host - 디버거로 사용하는 호스트 명을 적어 줍니다. 28. debugger.port - 디버거로 사용하는 포트 번호를 적어 줍니다. 29. debugger.enabled - 디버거의 사용 여부를 설정 합니다. 30. session.save_handler - 세션과 해당 데이터를 저장하는 방식을 설정하는 부분입니다. 기본적으로 파일 방식 입니다. 세션 항목은 이 책에 사용되는 회원제 부분에서 사용됩니다. 31. session.save_path - 세션 전달 인수를 정의 하는 부분이며 디폴트인 파일 방식일 경우 해당 파일의 경로를 적어 줍니다. 32. session.name - 쿠키 이름으로 사용되어질 세션 이름을 설정합니다. 디폴트는 PHPSESSID입니다. 33. session.auto_start - 세션 요청 시에 자동 모듈 생성 여부를 설정합니다. 0 - off , 1 - on 34. session.lifetime - 해당 세션이 유지 되는 시간을 설정 합니다. 디폴트의 경우 0이며 사용자의 브라우저가 종료 될 때까지 유지됩니다. 35. session.gc_probability - 해당 세션 값이 제거 될 경우 낭비 되는 시스템 메모리 자원을 반납하는 시점을 설정합니다. 36. session.gc_maxlifetime - 해당 세션의 시스템 메모리 자원 반납을 가질 수 있는 시간을 설정합니다.
다음 장에서는 리눅스에서 A.P.M의 설치 과정을 보았습니다. 다음 장에서는 윈도우 환경에서 Apache, Php, Mysql의 설치를 설명하겠습니다.
4. 윈도우 98과 2000(NT)에서 A.P.M 설치
윈도우 98과 윈도우 2000 그리고 NT에서 APACHE , PHP, MYSQL을 설치하는 방법을 살펴 보도록 하겠습니다. Linux와 sloraris에서의
설치 보다는 한결 간편한 부분들이 많고 손쉽게 클릭과 몇 가지 수정 만으로도 간단히 설�"� 이루어 집니다.
하지만 아직 최신 버전의 apache의 경우나 mysql , php , zend Optimizer 경우는 검증이 되지 않은 상태이므로 윈도우 환경에서의 서버 운영은 아직 무리라고 봅니다. 윈도우 환경에서 간편히 작업하고 그리고 스크립트 테스트하는 것에는 무리가 없으므로 그렇게 활용해도 됩니다.
4.1 윈도우용 A.P.M 설치
1) mysql 설치(3.22.34win)
원하는 곳에 mysql을 풀고 인스톨 합니다.

대부분의 일반 인스톨 방법처럼 3가지 인스톨 선택 방법이 있으나 전형적인 방법으로 설치하면 됩니다.

c:\mysql 디렉토리로 이동한 후 제대로 인스톨이 되었나 확인해 봅니다.
2) ODBC 인스톨
ODBC의 경우 nt(2000)용과 98용이 따로 존재하므로 해당 ODBC를 인스톨하면 됩니다.

3) PHP 인스톨 (PHP4 RC1)
PHP의 경우 인스톨러가 없기 때문에 특정 디렉토리를 생성하고 거기에 압축을 풀어 놓아야 됩니다. 여기서는 c:\php 디렉토리에 압축을 풀었습니다.
사용자에 따라 특정 디렉토리로 하면 됩니다.

위 그림에서 c:\php 디렉토리를 보면 php.ini-dist 파일이 존재 하는데 이 파일을 php.ini로 고친 후 (윈도우 98의 경우는 c:\windows에 NT나 2000의 경우는 c:\winnt로 copy 해야 됩니다.) 다음 환경 설정 파일(php.ini)을 메모장 등으로 내용을 수정합니다.

extension_dir = "c:\php"로 수정 합니다.

다음 그림 4-7에서 extension 항목도 수정합니다 enable는 앞의 ;를 제거합니다.

4) APACHE 인스톨 (1.3.12win)
아파치 역시 전형적인 인스톨을 하면 됩니다. 인스톨을 다 하면 c:\program Files\apache Group\apache로 디렉토리가 생성 됩니다.

Linux 에서와 마찬가지로 conf 디렉토리의 httpd.conf 파일에 addtype 항목을 추가 합니다.


원하는 확장자를 아래와 같이 추가해주면 됩니다.
ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .inc AddType application/x-httpd-php .php3 AddType application/x-httpd-php .php AddType application/x-httpd-php .htm AddType application/x-httpd-php .html AddType application/x-httpd-php .phtml AddType application/x-httpd-php-source .phps Action application/x-httpd-php "/php/php.exe"
위에서 addtype 항목은 여러분들이 필요한 만큼 확장자를 추가해 줍니다.
5) ZEND Optimizer 설치 (beta2)
가속기의 설치는 먼저 해당 파일을 c:\Program File\Zend\lib 디렉토리에 복사합니다.

다음 아래 항목을 php.ini 파일에 추가합니다.
zend_optimizer.optimization_level=7 zend_extension_ts="C:\Program Files\Zend\lib\ZendOptimizer.dll"

이제 모든 설치가 완료 되었습니다.
여기서 다시 c:\php 디렉토리를 점검해 봅니다. 최신 버전일수록 앞에서 설정한 부분과 다를 수 있습니다. 위의 절대 디렉토리에 php에 해당하는 모든 파일을 저장해야 됩니다. 물론 앞에서의 설정이 c:\php이기 때문입니다.
이 모든 설치의 정상 동작 확인은 간단한 phpinfo() 함수를 이용해서 스크립트로 확인해 보는 겁니다. 아래의 파일은 리눅스에서 test.php와 같습니다.
<?php phpinfo(); ?>
참고. 윈도우용 mysql을 설치 한 후 데몬을 띄우는 방법에서 많은 부분 어려움을 토하는 사람들이 있을 줄 압니다. 저도 그랬으니까요… 자세한 방법은 mysql 사이트의 도큐먼트 란에 가면 운영체제 별로 보다 자세한 방법이 있으며 참고로 윈도우 98의 경우 bin디렉토리 밑에 존재하는 mysqld-XXXX 파일의 이름을 mysqld 수정 후 standalone 옵셥으로 실행 하면 될것이다.. 의문이 있으면 직접 사이트를 방문해서 더 자세한 내용을 찾아 보기 바랍니다. http://www.mysql.com/mysql/full/
다음 장에서는 Solaris에서의 Apache , Php , Mysql의 설치를 설명하겠습니다.
이장은 개인적으로 제외 했습니다…. 의문점이 있으면 메일로 질문하기 바랍니다.
5. 솔라리스에서 APM설치하기(제외)
6. APACHE 설정과 고급 기능
이 장에서는 아파치의 여러 가지 설정과 고급 기능에 대해 설명하겠습니다. httpd.conf 파일이 설정에 관련된 모든 정보를 가지고 있으므로 이 파일의 옵션을 위주로 설명하겠습니다.
6.1 아파치의 구성
아파치를 성공적으로 설치했다면 /usr/local/apache/에 여러 가지 디렉토리가 생성됩니다. 사용자에 따라 이 디렉토리는 다를 수 있습니다. 우선 기본적인 디렉토리만 나열했습니다.
1) 디렉토리 구성
/bin 디렉토리 - apache 사용 시에 필요한 유틸리티들이 들어 있습니다. /cgi - bin 디렉토리 - cgi 스크립트가 있는 곳입니다. /conf 디렉토리 - apache 서버의 여러 가지 설정 파일들이 있습니다.(httpd.conf) /icons 디렉토리 - apache 서버에 사용되는 아이콘들이 들어 있습니다 /logs 디렉토리 - apache 서버 사용 시 발생하는 여러가지 log들이 들어 있습니다. /conf 안에 httpd.conf 파일의 경우 소스에서 다시 copy 해서 사용 가능하므로 나중이라도 설정 잘못으로 apache를 다시 인스톨 하는 일이 없도록 하세요.
2) httpd.conf 구성
그러면 httpd.conf 파일의 내용을 한번 살펴보면서 설정을 설명하겠습니다. 먼저 이 파일은 apache 전반에 관한 설정이 들어 있고 간단히 옵션만 고쳐서 바꿀 수 있습니다. 고치고 나면 당연히 restart 해야 합니다. 서두 부분은 이 파일의 내용을 담고 있습니다. 먼저 이 파일은 총 3가지로 구분할 수 있습니다.
1. 아파치를 전반적으로 제어하는 부분 2. 가상호스트에서 처리되지 않는 요청을 모두 처리하는 주 서버 또는 기본 서버의 작동을 제어하는 부분 3. 다른 IP와 호스트 이름을 처리하는 가상호스트 설정 부분
apache 1.3.4 이전 버전의 경우 3가지 파일(httpd.conf, srm.conf, access.conf)등의 파일이 존재했지만 지금은 httpd.conf 파일로 통합되어진 상태입니다.
6.2 httpd.conf의 관리
아파치 서버의 전반적인 제어(Section 1)

#서버 타입 - 서버의 시작을 어떻게 할 것인지 설정하는 부분입니다. 두 가지가 있는 데 대부분 Standalone 방식을 사용합니다. Inetd 방식은 새로운 프로세서를 만들 때마다 설정 파일을 참고 하는 단점이 있고 웹 서버를 restart 안 해도 됩니다.
Standalone 방식의 경우 restart 해줘야 하지만 부하에 보다 안정적 입니다.

#서버 루트 - 이 설정은 서버의 설정, 에러, 로그 파일이 기록되는 디렉토리를 말합니다. 위 그림의 /usr/local/apache 가 디폴트 경로 입니다.

#Lockfile - 이 설정은 아파치 컴파일을 USE_FCNTL_SERIALIZED_ACCEPT 나 USE_FLOCK_SERIALZED_ACCEPT 의 옵션으로 했을 경우 잠금 파일의 경로를 설정할 때 사용합니다. 디폴트는 사용 안함으로 설정되어 있습니다. 로그 디렉토리가 NFS 마운트 된 경로로 되어야 이 값을 바꾸어 줍니다.

#PidFile - 웹 서버가 시작할 때 Process id num를 기록하는 파일입니다.

#ScoreBoardFile - 내부 서버 프로세서의 정보를 저장하는 파일 입니다. 그 경로 명과 같이 적혀져 있습니다. 특정 아키텍처에서 필요할 경우 서로 다른 아파치 웹 서버 데몬이 같은 파일을 공유하지 않아야 합니다.

#ResourceCofig / AccessConfig - apache 1.3.4 이전의 버전에서는 srm , access conf
파일을 httpd.conf과 함께 읽었지만 이후엔 httpd.conf 파일에 한데 뭉쳐져 관리하기 편해 졌습니다.
서버가 이 파일의 내용을 무시하게 하기 위해서는 "dev/null"(Unix) 또는 "nul"(Win32) 값을 지정 해야 합니다.

#Timeout - 클라이언트가 서버에 요청한 정보를 받을 때 소요 되는 시간을 정해 줍니다.
디폴트는 300으로 설정되어져 있고 초단위로 설정을 합니다. 서버 성능에 따라 적당한 값을 적어 주면 효율적 입니다.

#KeepAlive - 디폴트 값이 on으로 되어 있습니다. 그 이유는 성능저하 때문인데 자식 프로세서가 한가지 일만 처리하고 죽는 것이 아니라 다음의 일도 처리함으로써 성능 향상을 꾀하는 것입니다.

#MaxKeepAliveTimeout - KeepAlive가 설정되어 있을 때, 클라이언트의 요청을 몇 번 이나 처리하고 다시 처음 상태로 돌아 가는지를 설정 합니다. 만약 이 설정이 "0"일 경우 클라이언트가 접속을 끊을 때까지 계속 연결 상태로 있습니다.
(대부분의 경우 높은 성능 향상을 위해 높은 값을 적어 줍니다.)

#KeepAliveTimeout - KeepAlive 가 설정되어 있을 경우 클라이언트의 요청이 정해진 초안에 없을 경우 접속을 끊습니다.
여러분들의 서버에 맞게 초를 바꾸어 주면 됩니다.

#MinSpareServer , MaxSpareServer - 서버 풀을 설정하는 부분입니다. 여기 설정된 디폴트 값은 대부분의 서버에 적합한 상태입니다.
즉, 클라이언트의 요청이 많은 사이트라면 적당히 이 값들을 증가 또는 감소해서 사용해야 합니다. 아파치는 최소 값과 최대 값을 정해 줌으로써 클라이언트의 요청이 많은 경우든 작은 경우든 쉽게 프로세서를 늘리고 줄일 수 있도록 하는 것입니다. 즉, 아파치는 클라이언트의 요청이 적을 경우 또는 최소 값 보다 프로세서가 적을 경우에 자동으로 최소 여유 서버의 개수를 맞추도록 노력 합니다. 최대 값보다 프로세서가 많을 경우라면 자동적으로 최대 여유 서버의 개수에 맞추어 줍니다.

#StartServer - 아피치 서버를 실행 할 때 같이 생성될 여분의 프로세서의 개수를 정합니다.
디폴트 값은 5 입니다.(6개 생성되어짐)

#MaxClients - 동시에 아파치 서버에 접속할 수 있는 클라이언트의 개수를 설정 합니다.
이 값을 늘리거나 줄일 경우 MinSpareServer , MaxSpareServer ,StartServer 의 값도 조정 해 주어야 합니다. 즉, 최대값을 넘어설 嚥� 클라이언트의 요청은 앞의 요청이 끝날 때까지 대기 상태로 있어야 합니다. 이 설정은 아파치 서버가 많은 자원을 낭비해 서버 부하가 생기는 것을 막기 위해 사용됩니다.

#MaxRequestsChild - 각각의 자식 프로세서가 죽기 전까지 처리할 수 있는 요청 수를 설정 합니다. 대부분의 시스템에서는 하나의 프로세서가 오랫동안 사용되면 메모리 또는 자원 누출 현상이 발생 할 수 있으므로 이 프로세서는 자동으로 제거 됩니다. 하지만 솔라리스 운영체제의 경우 이 설정이 필요합니다.

#Listen - 아피치를 특정IP 또는 포트와 결합 시킬 경우 사용 합니다.
<VirtualHost> 지시자 또한 참고 하세요.

#BindAddress - 이 옵션을 사용해서 가상호스트를 지원할 수 있습니다. 옵션에는 ‘*’ ‘IP address’ ‘인터넷 도메인 이름’을 사용할 수 있습니다.
<VirtualHost>과 Listen 지시자도 참고 하세요.
가상호스트에 관한 자세한 사항은 http://kldp.org로 가시면 한글로 작성된 많은 문서들을 참고하실 수 있습니다.

Dynamic Shared Object (DSO) - DSO(동적 공유 객체)를 사용 하기 위해서 모듈을 지시하는 설정입니다. DSO의 작동 방식을 보려면 아파치 1.3 배포판의 README.DSO 파일을 참고 하기 바랍니다. 여러분들의 httpd 바이너리에 내장된 모듈 목록을 확인하려면 �"http -l" 을 실행하면 볼 수 있습니다.
모듈 적재의 순서는 중요 사항이므로 아무렇게나 순서를 바꾸면 안됩니다.

#ExtendedStatus - "server-status"가 호출 되었을 때 아파�"� 자세한 서버 상태 정보를 만들 것인지 여부를 설정합니다.
Off일 경우 기본적인 사항의 정보만 생성합니다.
아파치의 주 서버 설정(Section 2)
가상호스트에서 처리되지 않는 요청을 모두 처리하는 주 서버 또는 기본 서버의 작동을 제어하는 부분입니다.

#Port - 독립형 서버가 대기하는 포트를 설정합니다. 포트 번호가 1023번 보다 낮을 경우 처음 root 권한으로 httpd가 실행되어야 합니다.
기본적으로 설정된 포트 외에 다른 포트를 설정함으로써 여러분들도 httpd를 운영할 수 있습니다.
<TIP>
----------------------------------------------------------------------------
유동 ip로 공짜 도메인 사용하기
여러분들 대부분의 경우가 케이블 모뎀이나 adsl을 사용한다고 가정 하겠습니다. 일단 바뀌는 유동 ip에 공짜로 도메인을 주는 곳을 보면 http://www.dyndns.org/- 여기의 경우 일단 가입을 한 후 24시간 안에 해당 id의 패스워드를 메일로 받습니다. 그리고 그 패스워드로 접속한 다음 원하는 패스워드로 바꾸어 줘야 합니다. 고정 ip의 경우도 도메인을 제공하고 여러 가지 옵션들이 다양하게 있습니다. 클라이언트를 받아 서버의 가동과 동시에 바뀌는 ip에 따른 도메인 설정을 잡아 줄 수도 있습니다. http://xdomain.neti.org/- 여기는 한국 사이트이고 접속이 자주 끊기는 현상이 있습니다. 하지만 공짜니 불만을 가질 수는 없겠죠? 일단 가입 즉시 사용 가능하고, 친절히 관리자가 게시판에 답도 해줍니다.
----------------------------------------------------------------------------------------------------

#User , Group - 독립형 서버에서 사용되며, 일반적으로 서버에서 작업 프로세서는 nobody로 설정을 해 줍니다.
즉, 제일 권한이 없는 것으로 설정을 합니다. 보안 때문에 이렇게 설정을 하는 것이고, 만약 nobody로 설정 되어진 상태라면 telnet으로의 접근 또한 막아야 됩니다. SCO(ODT 3)의 경우 User nouser , Group nogroup로 설정해 줍니다.

#ServerAdmin - 서버에 문제가 생겼을 경우 메일을 보낼 주소를 적어 주는 곳입니다.
이 주소는 에러 문서와 같이 서버가 생성하는 페이지에 나타납니다.

#ServerName - 만약 여러분들이 등록된 DNS를 가지고 있다면 그것을 적어 주면 됩니다.
만약 클라이언트에 보낼 서버 이름이 다를 경우 호스트의 실제 이름이 아닌 WWW를 사용하게 할 수도 있습니다.(IP를 입력해도 됩니다.) 만일 DNS가 존재하지 않는 것이라면 개인 홈페이지 서비스에도 영향을 줍니다. 그러한 이유 때문에 이 설정은 유의해야 됩니다.

#DocumentRoot - 기본적인 html 또는 php 등등의 관련 문서의 기본 디렉토리를 설정 합니다.
(심볼릭 링크 또는 앨리어스를 사용해 다른 위치를 적어 줄 수도 있습니다.)
<TIP>
----------------------------------------------------------------------------
각 디렉토리별 사용자 인증 설정하기
다음에 설명할 디렉토리 설정과 관련되어 이 부분을 추가 해 주면 됩니다.
AuthType Basic - 사용자 인증 방법 AuthName cry - 인증할 사용자명 AuthUserFile /usr/local/httpd/htdocs/.htpasswd - 패스워드 파일의 위치 AuthGroupFile /dev/null - 사용 그룹을 표시할 파일의 경로
패스워드 파일을 만들려면 아래와 같이 합니다.
/usr/local/apache/bin/htpasswd 파일을 사용하는 방법과 직접 작성하는 방법이 있습니다. bin#.htpasswd -c 패스워드파일명 유저명 위와 같이 실행하면 새로운 패스워드 입력란이 나오고 거기에 패스워드를 입력하면 됩니다. 그리고 생성된 파일을 인증할 디렉토리로 옮기면 됩니다.
----------------------------------------------------------------------------------------------------

#Directory 옵션 - 각각의 디렉토리에 관한 권한 등의 여러 가지 설정을 하는 곳입니다.
<Directory "디렉토리 path"> </Directory>로 설정합니다.
여기에는 여러 가지 옵션이 주어지는데 차례로 보겠습니다.
옵션의 사용
Option 옵션명 옵션명 … 입니다.
옵션 종류
- None - 옵션을 주지 않습니다.
- All - 모든 옵션을 줍니다.
- Indexes - 해당 디렉토리 안에 DirectoryIndex 지시자 부분의 파일이 없을 경우 디렉토리와 파일들을 목록화해서 보여 줍니다.
- Includes - Server Side Includes를 가능하게 합니다.
- FollowSymLinks - 심볼릭 링크로의 이동을 가능하게 합니다.
- ExecCGI - CGI 풀그램을 실행 가능하게 합니다.
- AllowOverride 옵션명 - None일 경우 .htaccess 내용이 access.conf의 옵션에 의해 효력이 없어 집니다.(해당 디렉토리 안에 .htaccess 파일이 존재할 경우) 즉, access.conf 설정의 어느 부분을 무시 할건지의 여부를 설정합니다.
- order 옵션명 - 해당 디렉토리에 대한 IP , DNS 필터링의 순서를 설정합니다.

#UserDir - 개인 홈 페이지 서비스를 위한 개인 홈페이지 디렉토리 설정 부분입니다.
즉, 개인의 디렉토리에 public_html 디렉토리를 만들면 홈페이지 서비스를 받을 수 있습니다. Ex>http://skycry.ath.cx/ userid 위의 디폴트 디렉토리 말고 다른 디렉토리를 추가 함으로서 여러 개의 디렉토리 서비스를 할 수 있습니다.

#UserDir 옵션 - 개인 홈페이지 디렉토리에 대한 접근 권한 등을 설정 합니다.
<Limit> </Limit> 로 각각의 접근을 제어 할 수도 있습니다. 옵션들은 앞 부분에서 설명한 대로 하면 됩니다. 물론 사용자 인증도 할 수 있습니다.

#DirectoryIndex - 브라우저가 아파치 서버로 처음 접근 했을 때 보여줄 문서를 설정합니다.
한 개 이상 나열이 가능하고, 앞에 설명한 디렉토리 설정에서 Option indexes로 되어 있고, DirectoryIndex 지시자에 표시한 파일이 디렉토리에 없을 경우 해당 디렉토리와 파일들은 목록화 되어 브라우저에 나타납니다.

#AccessFileName - 각각의 디렉토리의 접근을 제어하는 정보를 가진 파일 이름 입니다.
즉, 이 파일을 제어 하려는 디렉토리에 넣어 사용 합니다. 앞의 디렉토리 지시자와 연관하여 참고 하세요.

#.htaccess 파일에의 접근 - <Files 파일명> </Files>로 설정을 하며, 사용 되는 옵션은앞에서 설명한 것과 같습니다.
그리고 파일명을 .htaccess 가 아닌 다른 이름으로 앞의 AccessFileName에서 바꾸었다면 그 이름을 적어 줘야 됩니다.

#CacheNegotiatedDocs - 아파�"� 기본적으로 협상된 문서에 대해서는 <Pragma: no-cache> 내용을 보냅니다.
즉, 프락시 서버들이 문서를 캐쉬하지 못하게 요청 합니다. # 를 제거하고 옵션을 실행 하면 모든 프락시가 문서를 캐쉬할 수 있게 합니다.

#UseCanonicalName - 아파치 1.3 버전에서 새롭게 등장한 기능이고, 이 옵션이 켜져 있을 경우
자기 참조 URL(응답이 오는 서버를 다시 가리키는 URL)을 만들 필요가 있을 때마다 공식적인 이름을 만들기 위해 ServerName와 Port를 사용 합니다. off 일 경우는 아파치는 가능할 경우 클라이언트가 제공하는 hostname:port를 사용 합니다. 이것은 또한 CGI 스크립트의 SERVER_NAME와 SERVER_PORT에도 영향을 줍니다.

#TypeConfig - mime.type 파일의 위치를 설정합니다.

#DefaultType - 서버에서 사용되는 문서중 MIME 타입으로 알 수 없는 문서에 대해 적용할 기본 MIME 타입을 설정합니다.
디폴트 값은 text/plain 이며 이 값은 주로 서버에 문서 파일이 많을 경우에 사용 합니다. 만일 바이너리나 실행 파일이 많을 경우라면 이 옵션은 application/octet-stream으로 적어 주면 됩니다. (웹 브라우저가 실행 파일 등을 텍스트 문서로 착각하고 브라우저 상에 표시하지 않기 위함 입니다.)

#mod_mine_magic - mod_mine_magic 모듈을 사용할 경우 해당 파일의 내용으로 파일 타입 힌트를 얻는 역할을 합니다.
이것을 사용하기 위해서는 해당 모듈을 탑재 해야 합니다. <IfModule> </IfModule> 지시자는 이 모듈이 있을 때 가능합니다.

#HostnameLookups - 아파치는 클라이언트의 요청을 받아 들이면서 IP를 확인하고 확인한 주소를 DNS 서버에 다시 의뢰 하는 작업을 하기 때문에 상당한 시간을 요하게 됩니다. 디폴트 값인 off로 두고 사용하길 권장 합니다.

#ErrorLog - 에러를 기록할 파일의 위치를 적어 줍니다. <VirtualHost> 지시자에서 ErrorLog 설정을 하지 않았다면 여기서의 설정을을 따릅니다. 로그 파일의 경우는 계속 용량이 증가하기 때문에 수시로 용량을 줄여야 합니다.

#LogLevel - 로그메세지의 크기를 제어 하는 부분 입니다.
옵션에는 debug , info , notice , warn , error , crit ,alert , emerg 등이 있습니다.

#LogFormat - CustomLog 지시자에서 사용할 별명을 정의 합니다.
%h - 호스트명 %l - 리모트 로그 이름 %u - 사용자 인증에 사용된 유저명 %t - 시간 %r - 요청한 내용의 첫번째 줄 %s - 서버 상태 %b - 전송량(헤더 포함) %{헤더} - 요구된 헤더 내용 %U - 요구한 URL

#CustomLog - access_log 파일의 위치를 설정 합니다. <VirtualHost> 지시자에서 이 설정 부분이 없을 경우 여기서 설정한 위치로 모두 저장됩니다.
가상 호스트별로 따로 접근 로그 파일을 만들고 싶으면 이 설정을 각각의 <VirtualHost> 지시자 안에 넣어 줘야 합니다.

#agent_log , referrer_log - 만약 여러분들이 agent_log , referrer_log 파일을 생성 하고자 할 경우 #를 제거합니다.

#single logfile - 만약 여러분들이 access , agent , referrer 정보를 하나의 파일에 모두 저장 하기를 원한다면 combined 옵션을 이용 합니다.

#ServerSignature - 아파치 서버가 생성하는 페이지(에러문서 , FTP 디렉토리 list , mod_status , mod_info output , CGI 생성문서 제외)에 서버 버전과 가상 호스트 이름을 포함하는 행을 넣는 것을 설정합니다.
옵션에는 On | Off | Email 등이 있고 Email의 경우 ServerAdmin으로의 mailto: 링크도 포함 됩니다.

#Alias - 별칭을 설정하는 부분 입니다.
별칭의 설정은 Alias /별칭/ "path" 하면 됩니다.
별칭 사용 시에 별칭 다음에 "/"를 적어주면 별칭을 표현할 때 /별칭/ 이렇게 표현해야 됩니다. 디렉토리 설정은 앞에서 사용한 옵션을 사용하면 됩니다. 별칭은 하나 이상 여러 개 만들어 사용 가능하기 때문에 필요한 만큼 만들어 사용하면 됩니다. 물론, 주의 할 부분은 별칭 다음의 "/"를 적어 줬느냐 하는 것입니다. 서버가 URL에 "/"이 있어야 처리하기 때문입니다.

#ScriptAlias - 서버 스크립트를 포함한 디렉토리를 제어하는 설정 입니다.
Alias와 설정 하는 부분은 같지만 이 설정은 가리키는 디렉토리 안의 문서를 실행하는 프로그램으로 인식하여 실행하게 됩니다.

위 그림의 디렉토리 설정 path 부분은 ScriptAlias 로 별칭 처리된 실제 CGI 디렉토리로 설정 해야 됩니다.

#Redirect - 서버에 존재하지 않는 문서로 접근이 올 경우 현재 존재하는 문서로의 위치를 바꿔 주는 설정 입니다.
즉, 옛날에 사용하던 URL로 접속하는 사용자를 위해 새로운 URL로 이동하게 해주는 것입니다. 사용 방법은 "Redirect 옛날URL 새로운URL" 하면 됩니다.

#IndexOptions - DirectoryIndex 지시자에서 표시한 파일이 존재하지 않을 경우 디렉토리 와 파일들의 목록을 보여 줄 때 디렉토리와 파일의 속성에 따른 아이콘을 사용할지 여부를 설정 합니다.

#AddIcon - IndexOptions에서 FancyIndexing로 설정 되어 있을 경우 사용 되며 각각의 확장자에 따른 아이콘의 모양을 정해 줍니다.

#DefaultIcon - AddIcon에서 설정 되지 않은 기본 아이콘을 설정 합니다.
디폴트 아이콘은 unknown.gif 입니다.

#AddDescription - 이 설정은 서버 자동 생성 인덱스 파일의 뒤에 간단한 설명을 추가할 때 사용 합니다. (FancyIndexing 설정 일 때 가능합니다.)
방법은 AddDescription "설명" 파일명

#ReadmeName , HeaderName - ReadmeName은 서버가 디렉토리 목록 뒤에 붙여 넣을 README 파일의 이름을 설정하며, HeaderName은 디렉토리 인덱스 앞에 내용을 넣을 파일의 이름을 설정합니다.
서버는 처음 name.html 파일 찾고 존재 하면 그 내용을 포함합니다. 만약 파일이 존재하지 않는다면 name.txt를 찾고 txt 내용으로 포함 합니다.

#IndexIgnore - DirectoryIndexing에서 목록에서 제외할 파일명을 설정 합니다.
쉘 스타일과 와일드 카드 사용이 가능 합니다.

#AddEncoding - 특정 브라우저(Mosaic/x 2.1+)가 자료를 받으면서 압축을 풀 수 있도록 해 줍니다.
이것은 모든 브라우저가 가능 한 것은 아닙니다. (FancyIndexing의 Add 지시자와 지금부터 나열하는 Add 지시자와는 관련이 없습니다.)

#AddLanguage - 문서의 언어를 표시 합니다. 즉, 내용 협상 과정을 통해 브라우저가 이해하는 언어의 문서를 제공할 수 있습니다.
폴란드어의 경우 펄과 구분 하기 위해 pl .po로 표기 합니다.

#LanguagePriority - 문서 문장 을 읽어 들이는 동안 여러 가지 언어가 존재 할 경우 우선되는 언어를 나열해 줍니다.
설정은 내림차순으로 나열 합니다.

#AddType - php 확장자를 사용 하기 위해서는 꼭 필요한 설정 부분 입니다.
즉, mime.types의 수정 없이 mime를 설정 가능하게 해줍니다. 아파치 1.3.12일 경우는 php를 설정하는 부분이 따로 나와 있습니다. 그 이전 버전일 경우 위와 같이 설정을 하면 됩니다. 해당 확장자에 대해 특정 타입으로 실행 되게 하는 것입니다, 여러분들의 목적은 php를 사용 하는 것이므로 알맞게 고치면 됩니다. (php3 .htm) 이 부분은 .htm 확장자를 php3타입으로 실행 한다는 말입니다.
AddType application/x-httpd -php .php - .php 확장자를 php타입으로 실행 AddType application/x-httpd -php .html - .html 확장자를 php타입으로 실행 AddType application/x-httpd -php .inc - .inc 확장자를 php타입으로 실행 AddType application/x-httpd -php-source .phps - .phps 확장자들은 php 소스를 보게합니다.

#AddHandler - 특정 파일 확장자나 처리기에 연결하거나 특정 파일 타입에 특정 동작 연결을 설정 합니다.
서버 안에 있거나 또는 action 명령을 사용해서 추가 가능 합니다.
CGI 스크립트를 사용 AddHandler cgi-script .cgi 서버 처리 HTML 파일 사용 AddType text/html .shtml AddHandler server-parsed .shtml 아파치의 send-asis HTTP 파일 기능 사용 AddHandler send-as-is asis 서버 처리 imap 파일을 사용 AddHandler imap-file map Type map을 사용 AddHandler type-map var

#Action - 매칭되는 파일이 불려질 때마다 해당 미디어 타입에 맞는 스크립트를 실행할 수 있습니다.
이 설정은 자주 사용되는 CGI 파일 프로세서에 대해 반복적으로 URL을 사용하지 않아도 됩니다.

#MetaDir , MetaSuffix - MetaDir는 아파�"� 메타 정보 파일을 찾을 디렉토리 이름 입니다.
이 파일에는 문서를 보낼 때 추가할 추가 HTTP 헤더 정보가 있습니다. MetaSuffix는 메타 정보를 가지고 있는 파일의 접미어를 설정 합니다.

#Customizable error response - 존재하지 않는 페이지를 요청 받을 경우 또는 해당 디렉토리의 퍼미션이 없을 경우 보여 주는 에러 메시지 설정 입니다.
관리자 임의로 다음 3가지 중 선택 해서 출력해 줄 수 있습니다.
1) plain text - 보통 텍스트 화면 2) local redirects - 내부 Url로 방향 전환을 합니다. 3) external redirects - 외부 Url로 방향 전환을 합니다.
일반적으로 원래 요청과 관계된 환경 변수의 대부분이 스크립트에 전달되지 못합니다.

#BrowserMatch - HTTP 응답 방식을 수정합니다.
첫번째 지시자는 Netscape 2.x 와 유사한 브라우저에 대해 KeepAlive 기능을 사용하지 못하게 하는 설정입니다. (해당 브라우저는 KeepAlive기능 구현에 문제점이 있습니다.) 두번째 지시자는 HTTP/1.1을 잘못 구현하며 301, 302(redirect) 응답에 대해 KeepAlive을 제대로 지원 못하는 MS Explorer 4.0b2를 위한 설정입니다.

# BrowserMatch - HTTP/1.1 응답도 제대로 처리 하지 못해 HTTP/1.1 spec를 위반하는 브라우저에 대해 HTTP/1.1 응답을 하지 않게 하는 설정입니다.

#server status , server info reports - 서버 상태 정보를 허용할 servername을 적어 줍니다.
server status 방법은 http://servername /server-status 입니다.
여기서 servername을 적절히 바꾸어 사용하면 됩니다.
server info 방법은
http://servername /server-info 입니다 (mod_info.c 가 로드되어 있어야 합니다.)

#버그 이용 방지 - 이전 1.1버전에서 있던 버그를 악용 하려는 사람이 있는데, #를 제거하면 버그를 이용한 공격이 있을 때 phf.apache.org상의 기록 스크립터로 방향 전환을 시키게 합니다. 또 다른 방법은 직접 support/php_abuse_log.cgi 스크립트를 이용해 여러분 자신이 저장하는 것입니다.

#Proxy Server - 프락시 서버 사용을 설정하는 부분입니다.
프락시 서버 모듈을 포함 했을 경우 #를 제거하면 프락시 서버 사용이 가능 합니다.

#ProxyVia - HTTP/1.1 <Via:> 헤더를 처리할지 여부를 설정하는 부분입니다.
옵션에는 Off | On | Full | Block 등이 있으며 Full은 서버 버전을 포함 하며, Block는 나가는 모든 자료에 <Via:>를 제거 합니다.

#cache - 캐쉬 기능을 enable 하기 위해서는 #을 제거 합니다.
(CacheRoot가 없으면 캐쉬하지 않습니다.)
아파치의 가상 호스트 설정(section 3)
다른 IP와 호스트 이름을 처리하는 가상호스트 설정 부분

여러분들이 웹 서버에 다수의 도메인/호스트이름을 관리하길 원한다면 해당하는 호스트를 VirtualHost 지시자에 포함 시켜야 합니다.
#NameVirtualHost - 이름 기반의 가상 호스트를 사용하려면 적어도 하나의 IP(port 번호)를 정의 해야 합니다.

# VirtualHost - <VirtualHost 호스트 명> < /VirtualHost > 이렇게 설정 하며 보다 자세한 가상 호스트에 관한 자료는 http://www.apache.org/나 http://kldp.org 에서 찾을 수 있습니다.
다음 장에서는 PHP의 기본 문법과 프로그램 작성 방법을 설명하겠습니다.
7. PHP 기본 문법
7.1 PHP 문법 구성과 작성
이 장에서는 php의 기본적인 문법 구성과 작성하는 요령을 살펴 보겠습니다. 대부분의 경우 C언어를 접한 경험이 있을테지만 혹 그렇지 않더라도 쉽게 배울 수 있습니다.
PHP 양식
1. PHP의 시작과 끝은 대부분의 경우 <?php php 문장 ?>이라고 표시합니다. 또는 <? ~ ?> 이렇게 짧게 줄여서 표시할 수도 있습니다. 2. HTML을 스크립트에 표현할 때는 echo(" ~html~ "); 즉, echo문 안에 표현합니다. 이것은 반대로 HTML 문서 안에 스크립트를 사용할 경우 <? ~ ?> 안에 사용할 수도 있습니다. 3. 문장의 끝은 " ; "로 표시해 줍니다. (종종 문장의 종결을 표현하지 않아서 스크립트 오류가 자주 생깁니다.) 4. PHP 함수는 <? ~ ?> 영역 안에서 자유로이 사용 가능하며 변수 선언이 필요치 않습니다. 5. PHP 스크립트에서 주석은 // 또는 /* ~ */를 사용합니다.
변수의 형태
PHP에서 변수는 그 타입이 미리 정의되지 않는 것이 기본입니다. 다른 여러 언어에서는 변수 타입을 설정하지만 PHP는 자신의 값이 선언되면 자동적으로 알아서 타입을 바꾸어주는 것입니다. 그리고 변수를 선언할 땐 몇 가지 유의해야 할 것이 있습니다.
1. 변수의 설명을 나타내는 이름을 사용하세요. 2. 불필요하게 변수 이름에 대문자를 많이 사용하지 마세요. 3. 한가지 형태를 유지해야 합니다. 1~3번 이외에 여러 가지 유의할 부분들이 있을 것 입니다. 위에 부분들은 특히 주의할 부분들이며 항상 상기하기 바랍니다.
· 숫자를 저장하는 변수(정수형, 실수형) $S = 4989 ; // 십진수, 양의 정수 $S = -4989 ; // 음의 정수 $S = 4.989 ; , $S = 4.9E89 ; // 실수형 · 문자열 변수 문자열은 큰 따옴표(") 안에 표시됩니다. 문자열 안에는 여러 가지 형태의 ESCAPED 캐릭터가 들어갈 수 있고, 문자열이 숫자로 인식될 경우는 그 형태가 문자열 안에 있는 숫자나 ‘e’ , ‘E’ 의 표시 여부에 따라 달라집니다.


$S = 4 + "-9.8E9" ; // 실수형을 나타냅니다. $S = 4 + "CRY9" ; // 정수형 4입니다. $S = 4 + "9 CRY" ; // 정수형 13입니다. $S = 4 + "98.9" ; // 실수형을 나타냅니다. $S = "9 CRY" + 4 ; // 정수형 13입니다. $S = "SKYCRYZ" ; // 문자열 SKYCRY 입니다. · 배열에서 변수 여기서도 마찬가지로 변수의 형태를 선언할 필요가 없습니다. $S[0] = "SKY" ; $S[1] = "CRY" ; $S[2] = "SKYCRY" ; $S[3] = "14" ; 결과 -> $S[0] = "SKY" ; $S[1] = "CRY" ; $S[2] = "SKYCRY" ; $S[3] = "14" ; 여기서 $S[] = "SKY" , $S[] = "CRY" , $S[] = "SKYCRY" , $S[] = "14"로 표현해도 결과는 마찬가지입니다. 배열을 표현에는 위의 방법도 있지만 array( ) 함수를 사용하는 방법도 있습니다.


$S = array("NAME" => array(0 => "SKY" 1 => "MY NAME IS CRY"), "NAMESUM" => array( 2 => "SKYCRY" 3 => "14") ) ; 이렇게 1차원 배열을 합해서 여러 형태의 다차원 배열도 만들 수 있습니다. 위 배열을 간단히 아래와 같은 스크립트로 출력할 수 있습니다. <?php // PHP의 시작 $S = array("NAME" => array(0 => "SKY" 1 => "MY NAME IS CRY"), "NAMESUM" => array( 2 => "SKYCRY" 3 => "14") ) ; echo $S["NAME"][1]; echo('<br>'); echo $S["NAMESUM"][2]; ?> …

· 객체형 변수 객체란 관련 함수와 관련 변수의 집합체 입니다. 달리 말하면 CLASS라고 부르기도 합니다 여기서 객체를 생성하는 방법을 간단히 보여드리겠습니다. Class skycry { function cry() { $connection = mysql_connect("localhost","mysql",""); } } // cry() 함수는 mysql 접속 함수입니다. $connet = new skycry ; // new를 사용해서 skycry 객체를 생성합니다. $connet -> cry() ; // 객체 안에 cry( ) 함수를 불러옵니다. 위의 방법으로 여러 가지를 한번 출력해 보았습니다. 여러분은 밑의 방식으로 여러 가지 변수와 함수의 집합인 클래스를 만들어 사용할 수 있습니다.

위 예제의 경우 단순히 함수를 호출해서 출력 하는 부분입니다. 하지만 변수의 전달 인자를 설정하고 각 함수를 출력하게 할 수도 있습니다. 즉, cry($a,$b)와 같이 $a ,$b의 값을 전달해서 해당 인자를 반영하게 할 수 있습니다. 35,36,37행은 객체를 불러와서 출력하는 부분입니다.

· 변수의 사용 범위 PHP의 변수 범위는 선언되어진 부분만 가능합니다. 다시 말해 변수형태가 만들어진 부분에서만 사용가능 합니다. 함수 안에 있는 변수와 전에 선언된 변수는 다르다는 것입니다. $S = 4 function cry() { echo $S ; // 지역 변수 } cry( ) ; // 4가 출력되지 않습니다. 여기서 4가 출력 되게 하려면 함수 안에 변수를 다시 지정해 주어야 합니다. 이것을 global 변수라고 합니다. 함수 안에 global $S ;를 추가 했을 경우 4가 출력됩니다. 이러한 방법 말고 다른 방법은 function cry($S)라 적어주면 됩니다.

위 예 42행의 변수는 함수 안의 변수 값 즉 지역 변수를 나타내고 44행은 함수 밖의 변수 값 즉 , 글로벌 변수 값 입니다.

· 가변 변수 변수의 이름은 PHP에서도 바꿀 수 있습니다. 이 방법을 사용하는 것은 조금 복잡합니다. 구지 이 방법을 사용해야 할 경우 사용하는 것이 좋을 듯 합니다. 표현하는 방식이 어려운 것이 아니라 그 형식의 종류에 따라 혼동될 가능성이 많습니다. $$s = "bye jun" ; //변수에 변수를 줍니다.

위의 가변 변수를 이용할 때 중요한 부분은 ${$s}에서 "{}"를 사용하는 것입니다. "{}" 적절히 사용해서 혼돈을 줄일 수 있습니다. 다른 곳에 적용할 때는 이것을 상기하기 바랍니다.

· Form 형식의 변수 Form 형식의 변수는 자기 자신의 페이지나 다른 페이지로 하나 또는 여러 개의 변수를 전달하는 형식 입니다. Form의 형태를 우선 보면 <form method=~ action=~> <input type=~ name=~ value=~> </form> 각 인자의 역할은 아래와 같습니다. Method는 post(보낼 때)와 get(가져올 때) 인자를 사용합니다 Action는 보내거나 가져올 개체를 적어줍니다. Type는 text(글일 경우), submit(입력 시) 등을 주로 사용합니다. Name는 원하는 명을 적어주면 그 명이 변수가 되어 보내거나 가져옵니다. Value는 name 이 변수로 보내질 때나 가져올 때의 값을 지정합니다. 보다 자세한 form의 형태는 <url url="http://www.irt.org" name="http://www.irt.org"> 가면 상세한 설명이 있습니다.. 이러한 폼 문의 형태는 주로 입력을 요하는 부분에서 사용합니다. 글쓰기의 경우와 메일 등의 내용을 데이터베이스로 옮길 경우 그 변수로의 전달로 사용 하면 편합니다.

위 소스 20행의 경우 name = friend[] 가 복수 변수로 만들어져 보내지는 것을 알 수 있습니다. 이렇듯 폼을 이용해서 자동적으로 변수를 생성할 수 있습니다. 그리고 submit를 이미지로 사용하는 방법은 아래와 같습니다. <intput type=image src= "image.gif" name = "put"> put은 이미지에서 클릭한 위치를 (x , y로) 나눠서 두개로 전달 됩니다. put_x , put_y

소스 20행의 action="4-2-2form.php" 부분은 위 결과 화면에서 친구들을 선택하고 등록 버튼을 눌렀을 때 해당 인자가 보내질 파일 이름입니다. 이 부분은 임의로 여러분들이 정해서 보내면 되지만 현재 위 소스는 자기 자신에게 인자를 전달 해야 해당 선택 항목들이 출력 되게 됩니다. 여기서 4-2-2 form.php부분을 $PHP_SELF를 고쳐 자신에게 다시 인자들이 전달 되게 하는 방법도 있습니다. · 환경 변수 환경변수는 PHP에 접속한 클라이언트의 IP와 웹 브라우저 등을 알아보는 역할을 합니다. $REMOTE_ADDR - 방문자의 IP를 알 수 있습니다. $HTTP_USER_AGENT - 방문자의 웹 브라우저를 알 수 있습니다.


환경 변수를 사용해서 개인 홈페이지나 게시판 사용자의 구분을 표시하면 유용하게 사용할 수 있습니다. · 시간 변수 시간을 나타내야 할 경우 date() 함수를 사용해야 합니다. 이 함수를 호출 하는 선택 사항은 여러 가지가 있는데 아래의 표를 참고하세요. 사용하는 방법은 변수를 만들어 사용할 수 있습니다. $date = date(Y-M-d : h/i/s a : l); 데이터 함수에 사용 하는 인자들 a - "am" 또는 "pm" Y - "0000" 단위로 년도표시 A - "AM" 또는 "PM" w - 일요일부터 "0"으로 숫자로 표시 d - "00" 형식으로 날짜를 표시 y - "00" 형식으로 년도 표시 D - "Mon, Tue" 요일을 3자리로 표시 z - 1월 1일부터 계산된 날수 F - "January" 형식의 달을 표시 H - 시간을 24시간으로 표시 i - 분을 숫자로 표시 h - 시간을 12시간으로 표시 l - "Monday" 형식으로 요일표시 m - 월을 숫자로 표시 M - "Jan" 형식의 달을 약어로 표시 j - "0"형식으로 날짜를 표시 s - 초를 숫자로 표시

위의 소스를 보면 여러 가지 데이터 인자를 사용해서 출력 하는 것을 볼 수 있습니다. 여기서 date()함수 말고 중요히 여길 것이 있습니다. 바로 함수를 만들고 변수를 호출하는 것입니다. 소스 11행의 경우 함수 안의 $d1을 출력 하기 위해 변수 값을 할당하는 부분입니다. 함수에 변수를 전달하는 방법이 global 명령 대신 이렇게 사용하는 것도 가능합니다.

연산자
연산자의 경우는 만들어진 변수의 값끼리 연산을 하는 것입니다. 여러 가지 연산자를 이용해서 보다 간결하면서 명쾌한 표현을 하는 게 모든 이들이 추구하는 것입니다. 대부분의 문장은 표현식으로 이루어지므로 연산자는 꼭 들어�"� 마련입니다. 여기서 표현식이라 함은 하나의 변수에 특정한 값을 주는 것을 말합니다.
$a=4 이런 식으로 말이죠. 그리고 이 변수로 연산을 해도 마찬가지 입니다.
그럼 구체적으로 연산자의 종류와 기능을 알아 보겠습니다.
· 산술연산자 산술연산자는 말 그대로 산술연산(�"㉬쩝�)을 수행합니다. $a + $b : $a 와 $b 의 합입니다. $a - $b : $a 와 $b 의 뺀값 입니다. $a * $b : $a 와 $b 의 곱한값 입니다. $a / $b : $a 와 $b 의 나눈값(몫) 입니다. $a % $b : $a 와 $b 의 나눈 나머지 입니다. · 문자열 연산자와 대입 연산자 문자열 연산자는 문자열 끼리 연결하는 역할을 합니다. (".")로 표현 합니다. 대입 연산자는 $a = 4와 같이 피연산자($a)에 (4)의 결과를 대입하는 것을 말합니다. (4) 부분은 여러분들이 어떠한 연산자를 사용해서 대입하는 겁니다. 이러한 표현식은 위에서부터 보아온 소스를 참고하면 됩니다. · bit 단위 연산자 bit단위 연산자의 경우는 정수의 개별적인 bit를 on, off 하는 역할을 합니다. $a & $b : AND : $a 와 $b가 1인 bit만 1이 됩니다. $a | $b : OR : $a 와 $b 중 하나라도 1인 bit면 1이 됩니다. ~$a : NOT : $a 와 $b 의 뺀값 입니다. $a << $b : Shift Left : $a 와 $b 의 곱한값 입니다. $a >> $b : Shift Right : $a 와 $b 의 나눈값(몫) 입니다. · 논리 연산자 논리적인 연산을 수행 합니다. $a and $b : AND : $a 와 $b가 모두 참이면 참입니다. $a or $b : OR : $a 와 $b중 하나라도 참이면 참입니다. $a xor $b : XOR : $a 와 $b중 하나만 참이면 참입니다. !$a : NOT : $a 가 참이 아니면 참입니다. $a && $b : AND : $a 와 $b가 모두 참이면 참입니다. $a || $b : OR : $a 와 $b 중 하나라도 참이면 참이빈다. "&&" 와 "and" 연산자 그리고 "or" 과 "||" 연산자는 대입하는 변수의 우선 순위가 다르기 때문에 각각의 기능이 다릅니다. · 비교 연산자 둘의 값을 비교해 줍니다. 위의 논리 연산자와 함께 비교 연산자 역시 제어 구조에 주로 사용됩니다. 이 둘은 자주 사용할 것입니다. 능숙하게 적용하려면 자주 해보는 방법뿐이 없습니다. $a == $b : $a 와 $b가 같으면 참입니다. $a != $b : $a 와 $b가 다르면 참입니다. $a < $b : $a 가 $b보다 작으면 참입니다. $a > $b : $a 가 $b보다 크면 참입니다. $a <= $b : $a 가 $b보다 작거나 같으면 참입니다. $a >= $b : $a 가 $b보다 크거나 같으면 참입니다. · 연산자 우선 순위 동일한 상황에서 연산을 할 경우 우선하는 순위를 말합니다. 3+4*4 = 19입니다. "*" 연산자가 우선 순위를 가지기 때문입니다. 이러한 경우는 학교에서 배운 것과 같습니다. 하지만 몇 가지 추가될 부분이 있어 표를 첨부했습니다. Associativity operators ------------------------------------------------------------------------------- Non associativity New Right [ Right ! ~ ++ -- (int) (double) (string) (array) (object) @ Left * / % Left + - . Left << >> Non associativity < <= > >= Non associativity == != Left & Left ^ Left | Left && Left || Left ? : Left = += -= *= /= .= %= &= != ~= <<= >>= Right Print Left And Left Xor Left Or Left . -------------------------------------------------------------------------------

30행과 42행은 if문을 사용해서 비교연산을 한 것입니다. "$a" 와 "$b" , "$e"가 같거나 같지 안을 때를 비교해서 안의 내용을 출력하는 것입니다. 그리고 44행의 경우는 (" . ") 연산자를 사용해서 문자열을 대입해 보았습니다. 여러분도 여러 가지 만들어 보세요.


여기선 30행 과 42행의 if 문에 "xor" 과 "&&" 연산자를 사용해 보았습니다. 전자는 대입된 둘의 변수 중에 하나만 참이어야 실행되고, 후자는 둘 모두가 참이어야 실행됩니다. 그래서 첫번째(30행)의 if 문은 실행되지 않습니다. 그 다음의 35행이 실행되는 것입니다. 그리고 42행까지 실행하는 것입니다.

제어구조
제어 구조는 앞으로 여러분들이 많이 접하고 고민하는 부분일 것입니다. 제어 구조를 잘 파악하고 PHP 문장을 만들었을 때 무엇보다 그 문장들은 빛이 날 것입니다. 제어구조는 여러 가지가 있는데 조건문, 반복문, 함수 호출등 c언어와 유사한 부분이 많이 있습니다. 형태는 거의 C 문장이니 여러분들은 낯설지 않을 것입니다. 그러면 구문형태를 살펴 보도록 하겠습니다.
· if 문 앞에서 if문을 잠시 보았을 것입니다 형식 - if(조건) { 문장 ; } 해당 조건이 참이면 문장을 실행하고, 거짓이면 넘어갑니다. · else 문 이 문은 if의 조건이 거짓이면 실행 하게끔 하는 것입니다. 형식 - else{ 문장 ; } · elseif else와 if를 합쳐 놓은 것과 같습니다. 전의 if 문이 거짓이고, 나머지 elseif 문이 거짓이면 이 문장을 실행합니다. 형식 - elseif(조건){ 문장; } c와 같이 여러 개의 문을 사용해도 무관합니다.

여기서 elseif는 if의 조건이 거짓 이므로 자신의 조건을 검사한 후 출력하게 됩니다 그리고 두 번째 if문은 마찬가지로 거짓이므로 else문을 출력합니다. 이렇듯 "if" 와 "else" , "elseif" 문은 표현식에서 전체적인 구조를 잡아주는 역할을 합니다. 즉, 다시 그 안에 다른 제어구조 문이 들어가는 형태가 됩니다.

참고로 if 문과 while 문의 경우 "{ }" 대신에 " : "를 사용하는 방법도 있습니다. · while 문 while문은 조건에 충족 될 때까지 문을 반복합니다. 형식 - while( 조건 ) { 문장 }

위 소스는 1에서 5까지 출력을 하는 루프입니다. 이러한 소스는 여러 가지 다른 루프와 같이 사용할 수 있는데 필자는 " ,"를 추가해 보았습니다. 마지막 if 문을 보면 $a가 한번씩 증가 할 때마다 " , "를 출력해 주는 루프임을 알 수 있을 것입니다.

· do .. while 문 do .. while 루프의 경우는 do 문장을 한번 실행하고 다음 while문을 수행 합니다. (최초 한번은 do 문장을 실행합니다.) 형식 - do { 문장 }while( 조건 )

소스를 보면 일단 do 문(18행)은 한번 실행하는 것을 볼 수 있습니다.

· switch 문 이 문은 if 문을 나열한 것과 형태를 같이 합니다.

위 소스에서 switch문의 조건이 일치하는 case문을 실행 합니다. $i가 2보다 작을 때까지 $i는 1씩 증가하며 switch문을 실행합니다. 처음 " 0"일 때 모두를 출력하고 다음 "1"일 때 case 0 이후의 모든 것을 출력합니다.

위 결과에서 switch 문을 사용하면서 문의 실행을 중지 시킬 필요가 있을 땐 " break ; " 을 사용해서 중지시킬 수 있습니다. 가령 $i 가 " 0 " 일 때 문 전부를 실행하지 않으려면 이 항목을 추가하는 것입니다. · for 문 자주 사용 해야하는 구문 중에 하나이고, 물론 해석 하기에 따라 어려운 구문일 수 있습니다. 하지만 몇번 되풀이 하고 연습한다면 충분히 소화할 수 있습니다. 형식 - for( 인자 ; 인자2 ; 인자3 ) { 문장 } 여기서 "인자"의 경우는 처음 시작할 때 일단 한번 실행을 합니다. 그리고 "인자2" 의 경우 반복 될 때마다 한번씩 실행합니다. 마지막으로 "인자3"은 "인자2"의 결과에 따라 실행되어집니다. "인자2"가 거짓일 경우까지 계속 실행이 되는 것입니다. 다시 말하면, "인자2"가 참일 경우 끝없이 실행되는 무한 루프도 있다는 말입니다. ("인자2"는 비워두고 for 문을 만들 수도 있습니다.) for문의 예는 지금까지 배운 것과 나머지 것들을 응용해서 게시판에서 page 할당하는 것과 page 링크 수 할당하는 것등을 설명하겠습니다.

먼저 위 소스에서 변수들의 역할을 설명하겠습니다. $p_dip는 페이지당 글 수를 말합니다. $t_num은 총 글 수를 말합니다. $p_page는 한 page당 page 링크 수를 말합니다 ( [1] [2] [3] .. ) $p_pagex는 "ceil()"로 계산하는 page링크 수 평균 값입니다. 이 함수는 인자 값보다 작지 않은 최소의 정수를 구해 줍니다. $page는 현재 page 수를 나타냅니다. $pt_page는 시작할 page링크 숫자를 말합니다. 여기서도 ceil을 사용했는데 사용하지 않아도 됩니다. 주로 " / "를 할 때 사용하는 것입니다. $next_p는 다음 페이지를 나타냅니다. $pre_p 는 이전 페이지를 나타냅니다. $start_num은 총 글 수에서 현재 page와 페이지당 글 수의 곱을 뺀 값입니다. 그리고 이 변수는 현재 page에 출력될 글의 시작 번호를 가집니다. $last_num은 현재 page에 출력될 글의 마지막 번호를 가집니다. 이 변수는 여기서 직접 대입해서 사용 하지 않았습니다. 그럼 차례로 문을 읽어보도록 하겠습니다. 처음 21행에서 if문은 $page가 거짓일 때 "1"을 할당 합니다. 처음 실행하면 물론 $page는 거짓이니 "1"이 할당 됩니다. 그리고, 26행의 if문의 경우 38행의 $pt_page를 구하기 위해 사용합니다. 잘 보시면 page 링크 평균 수보다 작을 경우 이 값에 "1"을 더해서 ( [1]..) 이 출력 되게 합니다. 다음 30행은 나머지 경우 $p_start 값을 정해 줍니다. 32행은 아직 미숙한 면이 있습니다. 여러분이 잘 수정해 보시기 바랍니다.

드디어 45행에 for문이 나왔습니다. 이 행은 $pd의 값을 $start_num으로 하고 시작글 수에 한 page당 출력될 글 수를 더한 값 보다 작거나 같을 때까지 증가 시키는 문 입니다. 즉, 한 page당 출력될 글 수를 계산 하는 것입니다. ($start_num 에서 $start_num+$p_dip까지) 하지만 여기서 중요한건 48행의 if문 입니다. 만약 출발 페이지가 ( - ) 일 경우 출력 되지 말아야 되기 때문에 "0" 보다 클 때 라는 조건을 준 것입니다. 60행의 시작 글 수는 ( - )값이 나와도 출력되는 것이 아니기 때문에 걱정하지 않아도 됩니다. 제일 마지막 page란에 가면 이 경우가 생깁니다. (시작 번호를 보여주기 위해서 60행을 두었습니다) 그리고 각각 56, 57행에 총page 수, 64, 65행에 현재 page 수를 나타내도록 했습니다.

69행의 for문은 ( [1] [2] [3]..)을 출력하기 위해 존재합니다. $pp는 링크 page의 시작 호를 나타내며 할당된 링크 page 수 만큼 계속 증가 합니다. 73행의 if문은 현재 page일 경우 링크를 주지 않게 하는 것이고, 그 음 79행의 else문의 if문은 ( - )는 표시하지 않고 현재 page에 출력될 링크 수 만큼 표시 하기위한 조건입니다. 연산자를 사용해서 둘의 조건 모두가 참이어야 실행됩니다.

여기서는 ( [1] [2] )의 표시 말고 "다음 page"와 "이전 page"를 표시해 주는 소스입니다. 한 page씩 다음 page나 이전 page로 넘어갈 때 사용하는 링크입니다. 103행의 if문은 $page가 "1"일 경우 "처음 page" 를 표시하고 링크를 주지 않는 것이고, 107행의 그 밖의 경우는 링크를 시켜 줍니다. 115행의 if문의 경우도 $page가 총 page와 같을 경우 "마지막 page" 를 표시해 주고, 120행의 그렇지 않을 경우 page를 링크 시켜 줍니다. 이 소스를 다른 방식으로 여러분이 다시 만들어 보기 바랍니다. 특히 page 링크 부분은 마지막 page 부분에서 할당된 page 수가 출력되지 않는 문제점이 있습니다. 이점 숙지하시고 결과를 확인하겠습니다.

결과를 보면 모든 링크가 잘 이루어져 있는 것을 확인 할 수 있습니다. 하지만 앞에서 말한 문제점이 있습니다. 뒷부분의 경매 게시판이나 주가 게시판 등의 소스를 보시면 조금 수정한걸 볼 수 있습니다. 하지만 이 소스에는 몇 가지 고쳐야 할 부분이 있습니다. 다음의 그림을 보면서 설명 하겠습니다.

여기서 마지막 page는 링크가 할당된 수보다 2개 모자란 만큼 나타나는 것을 볼 수 있습니다. 이 소스는 db에 연결만 하면 바로 사용 가능 하지만 마지막 페이지 링크의 문제점만 해결 된다면 더 좋은 소스가 될 것입니다. 이번 장에서는 PHP 문법이 어떻게 구성되는지 알아보았습니다. 이 내용은 PHP 프로그래밍의 기본이므로 확실히 이해을 해야 합니다. 다음 장은 이 장에 이어 본격적으로 PHP의 함수를 비슷한 기능별로 설명하겠습니다. 참고 , 여기서 언급한 소스가 존재하지 않을 수 있으며 의문점은 메일로 질문하기 바랍니다.
8. PHP 함수들과 예제
8.1 PHP 함수
PHP 함수는 900여가지 이상이 현재 존재합니다. 여기서는 모두를 다루지 않고 자주 사용하며 꼭 필요한 함수 부분만 설명 하겠습니다. 이 장에서 사용하는 소스는 대부분 간단한 소스입니다. 하지만 조금 난해한 소스의 경우 cd에 포함시켰습니다.
수학함수
1. Abs(x) 절대값을 리턴해 주는 함수입니다. 실수 값을 입력하면 실수 값을 리턴합니다. 나머지의 경우 int로 리턴합니다.

9행의 abs() 함수를 출력해 줍니다. 이 예는 Form문을 사용했는데요 앞으로의 설명에도 이form문을 자주 사용하게 됩니다.

음의 실수형으로 입력 했을 경우 양의 실수로 리턴하는 걸 볼 수 있습니다. 2. Acos(x) 아크 코사인 값을 리턴해 줍니다. 대입하는 값이 (-1 ~ 1) 사이가 아니면 NAN 값을 리턴합니다. (X는 라디안 값)


위에서 입력란에 "1"을 입력 했을 경우 Acos, Asin, Atan 함수의 수행 결과를 볼 수 있습니다. 3. Asin(x) 아크 사인 값을 리턴해 줍니다. 대입하는 값이 (-1 ~ 1) 사이가 아니면 NAN값을 리턴합니다. (X는 라디안 값) 4. Atan(x) 아크 탄젠트 값을 리턴합니다. (X는 라디안 값) 5. Atan2(x,y) x와 y사이의 아크 탄젠트 값을 리턴합니다. 이것은 Atan(y/x) 한 것과 같습니다.(X는 라디안 값)


6. base_convert(string num, int fromnum, tonum) string num을 fromnum에서 tonum으로 변환한 후 출력합니다. 7. bindec(string bin_string) 바이너리를 10진수로 전환해서 출력해 줍니다. 반대의 경우는 decbin(int num)입니다.


위에서 2진수 "1010"을 입력하면 10진수 "10"을 출력 하는 것을 확인 할 수 있습니다. 8. ceil(float num) float num보다 작지않은 최소 정수를 출력해 줍니다. 유사한 반대 함수는 floor(x)입니다.


9. Cos(x) 코사인 값을 리턴해줍니다 (X는 라디안 값입니다.) 10. Dechex(int num) 10진수에서 16진수로 리턴해줍니다. 반대의 경우는 Hexdec(string hex_num)입니다.


위에서 10진수 "44"를 입력한 결과 16진수 "2c"가 출력 되는 것을 볼 수 있습니다. 11. Log(float x) 자연 로그 값을 리턴해 줍니다. 12. Log10(float x) 상용 로그 값을 리턴해 줍니다.


13. Max(x , y , …) 주어진 값을 비교해서 최대값을 리턴해 줍니다. 만약 주어진 값 중 하나 또는 그 이상이 double이면 double로 계산하며 이 값으로 리턴합니다. 만약 double 값이 없다면 정수로 계산되며 이 값으로 리턴합니다. 14. Min(x , y , …) 주어진 값을 비교하여 최소 값을 리턴해 줍니다. 만약 주어진 값 중 하나 또는 그 이상이 double이면 이 값으로 계산하며 이 값으로 리턴합니다. 만약 double값이 없다면 정수로 계산되며 이 값으로 리턴합니다.


15. mt_rand(int최소값 , int최대값) 정수 값을 비교해서 더 좋은 난수 값을 리턴해 줍니다. 16. mt_srand(int x) 주어진 정수의 더 좋은 난수의 초기 값을 리턴해 줍니다.


17. mt_getrandmax(void) 최대의 난수 값을 리턴해 줍니다. 18. number_format(float_num, int_dec, string dec_point, string thousands_sep) 주어진 값에 1000단위와 소수점 수에 관해 "," 와 "." 을 넣어 리턴해 줍니다.


위에서 소스 5행을 보면 "3"의 경우 1000단위로 숫자를 구분 하며 소수점 이하는 "~"로 표현 하는 것을 볼 수 있습니다. 19. Exp(x) e의 X제곱값을 리턴해 줍니다. 20. Floor(x) 주어진 값을 넘지 않는 최소값을 리턴합니다.


위에서 floor_num 입력란에 "4.44"을 입력 했을 경우 최소의 정수인 "4"을 출력하는 것을 볼 수 있습니다. 21. getrandmax(void) 난수의 최대값을 리턴합니다. 22. Srand(int x) 난수 생성시의 초기값을 리턴합니다. 23. rand(int 최소값, int최대값) 주어진 값을 비교해 더 좋은 난수 값을 리턴합니다.


24. Octdec(x) 주어진 값을 8진수에서 10진수로 변환해서 리턴합니다. 25. Pi(x) 주어진 값을 파이 값으로 변화해서 리턴합니다. 26. Pow(x,y) x의 y승 값을 리턴해 줍니다.


27. round(x) x의 반올림한 값을 리턴해 줍니다. 28. sin(x) 사인 값을 리턴해 줍니다. 29. sqrt(x) x의 제곱근을 리턴합니다.


30. tan(x) 탄젠트 값을 리턴해 줍니다. 여기서 대부분의 함수는 고등학교나 중학교 때 배운 수학의 기억이 있다면 간단히 이해가 될 것입니다. 그 중 난수 발생에 대한 예를 한번 더 보이겠습니다. 난수는 주로 임의의 수를 무작위로 추출할 때 사용합니다. 복권 당첨 경우를 생각하면 될 것입니다. 먼저 주어진 수의 가장 좋은 난수를 찾고 다시 이 값을 다른 값과 비교해 무작위로 난수를 발생 하는 등 여러 가지 방법이 있습니다.

역시 폼 문을 사용했습니다. 폼 문은 단순한 것부터 복잡한 것 까지 종류가 여러 가지 있고 배우기 또한 쉽습니다. 앞으로의 소스를 보면서 익히기 바랍니다.

결과를 보면 43의 제일 좋은 난수 값을 얻은 다음 "324"와 비교해서 다시 가장 좋은 난수를 표시해 줍니다.
파일시스템 함수
1. basename(string path) 패스중에 name 부분을 구해 줍니다. 관련 함수는 dirname() 입니다.


2. chgrp(string filename , mixed group) 파일의 그룹을 바꾸어줍니다. 3. chmod(string filename, int mode) 해당 파일의 모드를 바꾸어 줍니다. 4. chown(string filename, mixed user) 해당 파일의 소유자를 바꾸어 줍니다. 관련 함수는 chmod() 입니다. * 참고 : 2, 3, 4 번의 경우 실제 웹 서버의 루트권한이 있는 경우 바꿀 수 있으며 해당 파일의 주인일 경우 가능합니다.
<TIP>
----------------------------------------------------------------------------Chmod 권한 설정과 구조
해당하는 디렉토리와 파일에 관한 권한 설정은 리눅스에서 중요한 부분 입니다. 여기서 쉽게 이해하고 설정하는 방법을 보여 드리겠습니다. drwxrwxrwx - 이것은 차례로 디렉토리(d), 소유자(rwx), 그룹(rwx), others(rwx)를 표현 하는 것입니다. 물론 디렉토리가 아닐 경우 "-" 로 표현되며 나머지 부분도 마찬가지 입니다. r - 읽기, w - 쓰기, x - 실행 을 표현합니다. 그럼, 간단한 예로 특정 파일의 권한을 설정 보겠습니다. #chmod 777 test.txt - test.txt 파일의 권한을 777로 합니다. 여기서 777은 소유자,그룹, others의 8진수를 더한 숫자 이며 -rwxrwxrwx 입니다. 즉, 777 은 소유자(400 + 200 + 100), 그룹(040 + 020 + 010), others(004 + 002 + 001) 을 더한 값 입니다. 각 모드별 8진수를 정리 하면 아래와 같습니다. 400 - 소유자 읽기( r ), 200 - 소유자 쓰기( w ), 100 - 소유자 실행( x ) 040 - 그룹 읽기( r ), 020 - 그룹 쓰기( w ), 010 - 그룹 실행( x ) 004 - others 읽기( r ), 002 - others 쓰기( w ), 001 - others 실행( x )----------------------------------------------------------------------------------------------------
5. clearstatcache(void) 파일의 cache stat를 clear 해줍니다. 즉, 마지막으로 메모리에서 불리어진 결과를 이 함수를 사용해서 제거해 줍니다. 관련 함수로는 stat() , lstat() , file_exists() , is_writeable() , is_readable() , is_executable() , is_file() , is_dir() , is_link , filectime() , fileatime() , filemtime() fileinode() , filegroup() , fileowner() , filesize() , filetype() , fileperms() 등입니다. 6. copy(string source, string dest) 순서대로 원본 파일에서 바꿀 파일로 카피해 줍니다. 관련 함수로는 rename() 입니다.


위에서 path의 "/home/ftp/test" 디렉토리와 "test1.txt" 파일의 chown는 nobody.nobody 이며 chmod는 777로 설정한 상태 입니다. 아파치 서버에서 copy함수를 실행 하기 위해서는 copy하고자 하는 디렉토리와 파일의 권한에 연관 합니다. 출력이 "1"인 것은 참을 말합니다. 7. unlink(string filename) 파일을 제거하는 함수입니다. 관련 함수로는 디렉토리를 지우는 rmdir()입니다.


위에서 Unlink함수 역시 권한에 연관해서 실행 되어지며 "1"은 해당 파일이 삭제 되었음을 나타냅니다. 8. unset(mixed var) 함수의 값을 지워 줍니다. 관련 함수로는 isset()과 empty()입니다. 9. dirname(string path) 패스의 디렉토리 이름을 리턴해 줍니다.


10. diskfreespace(string directory) 디렉토리의 사용 가능한 남은 용량을 리턴해 줍니다.


11. fclose(int fp) 파일 포인터를 닫습니다. 12. feof(int fp) 파일 포인터가 EOF인지 검사합니다. 13. fgetc(int fp) 파일 포인터에서 문자를 읽습니다. 14. fgetcsv(int fp, int lengyh, string [delimiter]) 파일에서 csv 필드로 된 라인을 읽어와 분석합니다. 15. fgets(int fp, int length) 파일 포인터에서 한 라인을 가져 옵니다.


위에서 "test1.txt" 파일의 내용은 "ff i love cry" 입니다. 먼저 fgetc( ) 함수에 의해 f가 출력 되고 다음 파일 포인트부터 fgets( ) 함수에 설정한 17byte 길이 만큼 문자를 출력 합니다. 16. fgetss(int fp, int length) 파일 포인터에서 한 라인을 읽어 들여 html을 코드들을 떼어 냅니다. 그리고 php를 읽어 들입니다.


위 소스를 보면 5행의 fopen 함수를 이용해 "test2.txt" 파일을 읽기 모드( r ) 로 엽니다. 다음 11행의 while문은 파일 포인트가 끝이 아닐 때 까지 반복합니다. 출력된 결과를 보면 해당 파일의 내용 중 html 코드는 제거되고 PHP 코드와 문자만 출력 되는 것을 볼 수 있습니다. 17. file(string filename) 한 파일을 읽어 들여 배열로 리턴해 줍니다.


위 소스에서 12행은 file 함수의 수행 결과(8행) 파일의 내용 중 처음 줄에 해당 하는 글을 출력 합니다. 18. file_exists(string filename) 해당 파일이 존재 하는지 여부를 리턴해 줍니다.

여기서 작성한 소스는 test.php 파일로 작성해서 결과를 실행 했습니다. Cd안의 소스의 경우 해당 함수 순으로 나열되어 있습니다. 8행의 변수는 해당 디렉토리에 파일이 존재 하는지 여부를 확인 하고 아래 12행의 조건을 만족하는 부분에서 출력 됩니다.

19. fileatime(string filename) 해당 파일에 마지막으로 액세스한 시간을 리턴해 줍니다.


20. filectime(string filename) 해당 파일의 inode가 마지막으로 변경된 시간을 리턴해 줍니다.


위 결과에서 시간은 유닉스 타임입니다. 21. filegroup(string filename) 해당 파일 소유주의 그룹 id를 리턴해 줍니다. 22. fileinode(string filename) 해당 파일의 inode num을 리턴해 줍니다.


23. filemtime(string filename) 해당 파일의 마지막으로 수정된 시간을 리턴해 줍니다.


24. fileowner(string filename) 해당 파일의 소유주 id를 리턴해 줍니다.


25. fileperms(string filename) 해당 파일의 퍼미션(권한)을 리턴해 줍니다.


위 결과는 비트로 출력된 결과입니다. 이 함수를 이용해서 파일의 읽기, 쓰기, 실행 여부를 확인하기 위해서는 bit 값으로 조건을 만들어야 됩니다. 26. filesize(string filename) 해당 파일의 크기를 리턴해 줍니다.


27. filetype(string filename) 해당 파일의 type를 리턴해 줍니다.


28. flock(int fp , int operation) 해당 파일 포인터로의 접근을 제어할 수 있습니다. 옵션에는 4가지가 있는데 1. reader 2. writer 3. shared or exclusive 4. flock() 등이 있습니다. 29. fopen(string filename , string mode) 해당 파일을 열거나 URL을 엽니다. 옵션에는 r - (읽기만 가능)파일 포인터의 시작은 파일의 시작부분 , r+ - (읽기와 쓰기 가능)r과 동일 , w - (쓰기만 가능)파일 포인터의 시작은 파일의 시작부분이며 그리고 파일을 제로 길이로 자르고 파일이 존재하지 않을 땐 그것을 만들려고 시도합니다. w+ -(읽기와 쓰기 기능) w와 동일합니다. a - (쓰기 기능)파일 포인터의 장소는 파일의 끝부분이며, 만약 파일이 존재 하지 않으면 만들려고 시도합니다. a+ - (읽기와 쓰기) a와 동일합니다. 30. fpassthru(int fp) 파일 포인터에서 EOF를 읽어 들여(남아 있는 자료를 읽어) 출력합니다.


위에서 test.txt 파일의 내용은 "i love cry ~ ^^" 입니다. 먼저 fgetc( ) 함수의 수행으로 "i" 문자를 출력 하고 다음 나머지 문자열을 fpassthru( ) 함수에 의해 출력 합니다. 31. fputs(int fp , string str , int [length]) 해당 파일 포인터에 쓰기 기능을 해줍니다. 옵션으로 문자열을 제어합니다. Length만큼 쓸 수 있습니다. 없을 경우는 상관 없습니다.


위 소스 5행의 fopen( ) 함수를 이용해 test.txt 파일의 내용을 "a+" 모드로 엽니다. 이것은 읽기와 쓰기 모드 이며 글을 추가할 경우 마지막 파일 포인트에서 추가 합니다. 7행의 fputs( ) 함수는 14byte만큼 입력된 글을 test.txt 파일에 추가 합니다. 32. fread(int fp , int length) 파일을 length byte 만큼 binary로 읽어 들입니다.


위 소스 7행을 보면 fread( ) 함수는 test.txt 파일 내용 중 14byte만큼 문자를 읽어 출력 하는 것을 볼 수 있습니다. 33. fseek(int fp , int offset) 파일 포인터를 옮기고 리턴해 줍니다. 34. ftell(int fp) fp를 참조해 파일포인터의 위치(읽고 쓰는 위치)를 리턴해 줍니다.


위 소스를 보면 7행에서 fread( ) 함수가 test.txt 파일의 내용을 16byte만큼 읽었습니다. 그리고 14행의 ftell( ) 함수로 현재 파일 포인트 위치를 보면 "16" 임을 알 수 있습니다. 35. fwrite(int fp , string string , int [length]) 파일을 binary로 쓰기 기능을 합니다. 만약 length 인자가 주어지면 이것만큼 쓰고 쓰기를 멈춥니다.


위 소스에서 5행은 test1.txt 파일을 "a" 모드로 실행 하며 7행은 입력한 문자열을 파일에 저장 합니다. 9행은 다시 해당 파일의 전체 내용을 출력 합니다. 36. set_file_buffer 해당하는 파일 포인터에서 파일의 버퍼링을 지정해 줍니다. 37. is_dir(string filename) 해당하는 파일 이름이 존재하고 디렉토리인지 여부를 리턴해 줍니다.


위 결과에서 해당 함수가 11행의 조건에 해당 하므로 13행의 글을 출력합니다. 38. is_executable(string filename) 해당 파일 이름이 존재 하고, 실행 가능한 것인지를 리턴해 줍니다.


8행의 변수 값이 파일이 아니고 실행 할 수 없는 디렉토리이기 때문에 18행의 결과를 출력합니다. 39. is_file(string filename) 해당 파일 이름이 존재하고, 일반적인 파일인지 여부를 리턴해 줍니다.


40. is_link(string filename) 해당 파일 이름이 심볼릭 링크인지 여부를 리턴해 줍니다. 아래 소스는 56번 심볼릭 생성 함수를 사용해서 보였습니다.


심볼릭 링크의 경우 원본 파일을 링크 시켜주는 역할을 합니다. 이것은 삭제해도 무방한 파일이며 링크를 이용해 보다 편하게 작업할 수 있습니다. 위 심볼릭 생성 함수의 경우 해당 디렉토리의 권한이 있을 때만 생성 가능합니다. 42. is_readable(string filename) 해당 파일 이름이 있고, 이것이 읽기 가능한 파일 또는 디렉토리 인지 여부를 리턴해 줍니다.


위 소스에서 5행의 수행으로 10행과 17행의 조건을 검색 합니다. 즉 is_readable( ) 함수로 전달 되어온 파일이나 디렉토리가 읽기 가능한지 여부를 검사 하고 해당 조건의 글을 출력 합니다. 43. is_writeable(string filename) 해당 파일 이름이 있고, 이것이 쓰기 가능한 파일인지 여부를 리턴합니다. 만약 디렉토리에 쓰기를 체크 하려면 파일 이름 인자에 디렉토리명을 적으면 됩니다.


44. link(string target , string link) hard 링크를 만들어 줍니다. hard링크의 경우 심볼릭 링크와 달리 디렉토리는 링크 할 수 없으며 원본 데이터와 링크는 같이 공존하므로 링크를 삭제하면 원본도 삭제 됩니다. 45. linkinfo(string path) 해당 패스에 대한 링크 정보를 리턴해 줍니다. 46. mkdir(string pathname , int mode) 패스 이름에 해당하는 디렉토리를 모드인자로 만들어 줍니다. 47. pclose(int fp) 해당 process 파일 포인터를 닫습니다. 48. popen(string command , string mode) 해당하는 process 파일 포인터를 열어 줍니다. 49. readfile(string filename) 해당 파일을 읽어 들여 출력합니다. 만약 파일 이름 인자가 http:// , ftp:// 일 경우 해당 하는 사이트에 접속해서 그 파일에 접근합니다. 50. readlink(string path) 심볼릭 링크의 내용을 반환해 줍니다. 51. rename(string oldname , string newname) 파일 이름을 바꾸어 줍니다. 52. rewind(int fp) 파일 포인터의 위치를 파일의 처음 부분으로 표시해 줍니다. 53. rmdir(string dirname) 해당 디렉토리를 제거합니다. 54. stat(string filename) 해당 파일의 통계를 리턴해 줍니다. 이 통계에는 다음의 내용들이 있습니다. device, inode, num of link, 소유자, 그룹, device type if inode device *, size in byte, 마지막 액세스 시간, 마지막 기록 시간, 마지막 바뀐 시간, blocksize for filesystem i/o *, num of blocks allocated 55. lstat(string filename) 해당 파일이나 심볼릭 링크의 통계를 리턴해 줍니다. 통계는 stat의 내용과 같습니다.(배열로 리턴합니다.)


위 결과는 소스 11행 for문에 의해 저장되어진 배열 인자를 차례로 리턴한 결과입니다. 인자의 경우 54번의 인자 순서 입니다. 56. symlink(string target , string link) 해당 링크로 타켓을 심볼릭 링크시켜 줍니다. (40번 참고) 57. tempnam(string dir , string prefix) 해당 디렉토리에 유일한 파일 이름을 만들어 줍니다. 만약 디렉토리가 존재하지 않는다면, temporary 디렉토리에 파일을 생성합니다. 58. touch(string filename , int time) 해당 파일의 수정 시간을 설정해 줍니다. time 인자가 없을 경우 현재 시간으로 설정합니다.


위 결과에서 8행의 time 인자를 주지 않았기 때문에 현재 시간으로 수정해서 리턴합니다. 59. umask(int mask) 현재의 umask로 변경합니다. 60. unlink(string filename) 해당 파일을 지웁니다. 여기까지 60개의 파일 시스템 함수를 살펴 보았습니다. 여기서 몇 가지를 예로 더 만들어 보았습니다. 중요한건 여러분들이 이 함수들을 어디에 사용 하는가 하는 것입니다. 물론 이 함수들의 역할이 뭔지를 파악하는 것도 중요합니다.

위에서 파일을 열 때 chmod를 읽고 쓸 수 있는 권한 인지 먼저 확인해야 합니다. 나머지 함수들의 사용 부분은 위에 나열한 함수에 관한 설명들을 보면 이해가 빠를 것입니다. 위에서 fopen() 함수의 경우 불러올 파일의 내용은 지워지고 다시 입력한 내용이 저장 되어 집니다. fwrite() 함수를 이용해서 입력한 내용을 쓰고, 파일을 닫습니다. 그 다음 오늘의 이슈를 출력합니다. file() 함수의 경우는 해당 파일의 내용을 배열로 리턴해 줍니다. 위 소스의 경우 잘 보시면 0~3까지 배열을 출력하게끔 했습니다. 물론 입력하는 창도 4행만 입력 가능하도록 만들었습니다. 이것 역시 나중에 이 소스를 바탕으로 홈의 알림판 등에 적용하면 수시로 변하는 중요한 사항들을 쉽게 올릴 수 있습니다. 이 같이 간단한 내용은 데이터베이스 연결보다 더 간결합니다. 위와 같은 방법으로 파일 시스템 함수들을 한번씩 테스트하는 방법 또한 빼먹지 말아야 됩니다. 중요한건 한번 직접 만들어 보는 것입니다. 지금까지 작성된 소스는 처음 test.php로 만들어졌기 때문에 폼 부분에 파일명을 바꿔 줘야 됩니다. (지금의 파일로) 다른 방법은 파일명을 $PHP_SELF로 바꿔 주는 것입니다. 그럼 결과를 확인해 보겠습니다.

MYSQL 함수
여기에 소개하는 함수는 PHP에서 mysql 서버에 접속해서 작업할 수 있는 함수들입니다. 그래서 여기 나열한 함수는 mysql의 명령어와 유사합니다. 보다 자세한 내용은 http://www.mysql.com 에서 얻을 수 있습니다. 여기서 참고 예제를 위해 test 데이터베이스에 test 테이블을 만듭니다. 이 테이블에는 필드 (content와 tel) 두가지를 다음처럼 만듭니다.

그 다음 데이터를 추가합니다. 방법은 여러 가지가 있지만 여기서는 파일을 생성해서 해당 테이블(test)에 넣도록 하겠습니다. 파일의 각 필드는 구분은 tab 키로 구분 합니다.
#cat > test.txt
이홍일 21447483647 박병준 124234234 강호경 21447483647 김주미 21447483647
위와 같이 test.txt 파일을 생성 했다면 이제 test 데이터 베이스의 test 테이블에 파일 내용을 아래와 같이 입력 합니다. Mysql>load data local infile "test.txt" into table test ; 그럼 test 테이블에 추가한 4가지 항목을 확인해봅니다.

이제 이렇게 데이터를 입력한 상태에서 PHP에서 접근 가능한 함수를 살펴보겠습니다.
1. mysql_affected_rows (int [int link_identifier]) 최근 질의에 관한 row의 수를 리턴해 줍니다.

위 소스에서 먼저 mysql에 접속은 mysql_connect 함수를 사용 했고, 데이터베이스 선택은 mysql_select_db 함수를 사용 했습니다. 다음 mysql_query 함수를 이용해서 sql 질의를 했고, 나머지 mysql_affected_rows와 mysql_num_rows 함수의 값을 구했습니다. 위 소스 부분들은 일반적이고도 아주 쉬운 문장들이기 때문에 금방 이해 되리라 생각합니다.

위에서 row의 수가 정확하게 4개 나오는 것을 확인 할 수 있습니다. 2. mysql_close(int [link_identifier]) mysql 접속을 끊습니다. 3. mysql_connect(string [hostname [:port] [:/path/to/socket] ] , string [username] , string [password] ) 인자의 사용은 위 나열된 그대로 입력하면 되고 차례로 호스트명, 유저 이름, 패스워드를 입력하면 됩니다. 4. mysql_create_db(string database name , int [link_identifier]) mysql database를 만들어 줍니다. 5. mysql_data_seek(int result_identifier, int row_num) 첫번째 인자의 결과에서 row_num으로 이동합니다. 즉 mysql 데이터베이스를 검색한 결과 중 row_num인자에 해당하는 포인터로 이동합니다. 6. mysql_db_query(string database , string query , int[link_identifier]) mysql query를 수행합니다. string database 부분은 데이터베이스 명을 적어 줍니다. 다음 query 인자는 데이터베이스의 검색 명령어를 사용합니다. 나머지 인자의 경우는 데이터베이스에 접속하는 명령을 사용합니다. 대부분 두 번째 세 번째 인자는 변수를 만들어 사용합니다. 7. mysql_drop_db(string database_name , int[link_identifier]) 데이터베이스의 해당 데이터베이스를 제거합니다. Mysql에 직접 접속해서 해보신 분은 다 아시겠지만 여기 나열되는 모든 함수는 데이터베이스의 대화식 모드에서 하는 명령어랑 같다고 생각하면 됩니다. Php에서 mysql의 명령어들을 지원 하는 것입니다. 첫번째 인자는 지울 데이터베이스의 이름을 그리고 두번째 인자는 연결 모드를 적습니다. 8. mysql_errno(int [link_identifier]) 이전에 mysql 실행시 발생한 에러번호를 리턴해 줍니다. 9. mysql_error(int [link_identifier]) 이전에 mysql 실행시 발생한 에러 메시지를 리턴해 줍니다. 10. mysql_fetch_array(int result , int [result_type] ) 인자에 대해 한 줄씩 정렬 수집된 자료를 배열로 리턴해 줍니다. 이 함수의 경우는 게시판 등의 사용 시에 자주 사용되는 함수입니다. 대분의 함수도 마찬가지지만 자주 사용됩니다.

위 소스를 보면 변수 $rows를 이용해 for 루프를 실행합니다. For문 안에mysql_fetch_array 함수를 사용해 해당 테이블의 한 행을 배열로 만들어 줍니다. 그리고 루프가 rows 수 만큼 반복 될 때마다 테이블의 내용을 출력합니다.

11. mysql_fetch_field(int result , int [field_offset]) 해당 필드의 정보를 리턴해 줍니다. 두 번째 인자의 옵션에는 name - column name table - column 이 소속된 테이블 name max_length - column 의 최대 길이 not_null - 만약 column이 null로 안되면 1 primary_key - 만약 column이 primary key면 1 unique_key - 만약 column이 unique key면 1 multiple_key - 만약 column이 non-unique key면 1 numeric - 만약 column이 numeric면 1 blob - column이 blob형이면 1 type - column의 type zerofill - 만약 column이 zero-filled면 1 12. mysql_fetch_lengths(int result) 마지막으로 한 줄씩 정렬된 각각의 필드 크기를 배열로 리턴해 줍니다. 13. mysql_fetch_object(int result , int [result_type]) 한 줄씩 정렬된 자료를 객체로 리턴해 줍니다. 14. mysql_fetch_row(int result) 한 줄씩 정렬된 자료를 배열로 리턴해 줍니다. 15. mysql_field_name(int result , int fild_index) 특정 필드의 이름을 리턴해 줍니다. 즉, 두 번째 인자의 값에 해당하는 필드이름을 리턴합니다. 16. mysql_field_seek(int result , int field_offset) 특정 필드의 offset을 설정합니다. 17. mysql_field_table(int result , int field_offset) result에서 두 번째 인자에 해당하는 필드가 있는 테이블의 이름을 리턴해 줍니다. 18. mysql_field_type(int result , int field_offset) result에서 두 번째 인자에 해당하는 필드의 타입을 리턴해 줍니다. 19. mysql_field_flags(int result , int field_offset) result에서 두 번째 인자에 해당하는 필드의 flags를 리턴해 줍니다. 20. mysql_field_len(int result, int field_offset) 특정한 필드의 길이를 리턴해 줍니다, 물론 result에서 두 번째 인자에 해당하는 필드의 길이를 리턴합니다. 21. mysql_free_result(int result) result에 해당하는 스크립터를 실행하면 생기는 메모리 점유를 이 함수를 사용함으로써 실행한 다음 제거해 줍니다. 22. mysql_insert_id(int [link_identifier] ) 최근의 insert문을 실행하고 난 뒤 발생한 id를 리턴해 줍니다 23. mysql_list_fields(string database_name, string table_name, int [link_identifier] ) mysql result field 들을 나열해 줍니다. 주어진 데이터베이스와 테이블 이름의 정보로 검색합니다. 24. mysql_list_dbs(int [link_identifier] ) mysql server의 database들을 나열해 줍니다. 25. mysql_list_tables(string database, int [link_identifier] ) mysql database의 테이블들을 나열해 줍니다. 26. mysql_num_fields(int result) result의 필드 수를 리턴해 줍니다. 27. mysql_num_rows(int result) result에서 row 수를 리턴해 줍니다. 28. mysql_pconnect(string [hostname [:port] [:/path/to/socket] ] , string [username] , string [password] ) mysql server에 지속적으로 연결해주는 함수입니다. 인자의 경우는 차례로 호스트명, 사용자명, 패스워드입니다. 29. mysql_query(string query, int [link_identifier] ) mysql server에 질의를 전송해 줍니다. 이 함수를 이용해서 대부분의 mysql 검색을합니다. 첫번째 인자는 mysql의 질의들을 적어주며, 두 번째 인자는 접속 변수를 적어줍니다. 30. mysql_result(int result, int row, mixed [field] ) result 데이터를 구해서 리턴해 줍니다. 31. mysql_select_db(string database_name, int [link_identifier] ) mysql database를 선택하는 함수 입니다. 꼭 한번은 사용할 함수이며, 차례로 database 이름, 그리고 접속 변수 등을 나열합니다. 32. mysql_tablename(int result, int i) 해당 필드의 테이블 이름을 리턴해 줍니다. 위 함수들의 실제 결과 값들이 어떻게 표현되는지 여러 함수를 사용한 예를 보도록 하겠습니다.

위 소스를 보면 16행 ~ 20행의 경우 각각 필드의 이름, 타입, 길이, flag, 테이블명을 나타내 주는 함수들 입니다. 그리고 이전 예제와는 달리 테이블의 데이터들을 출력 할 때mysql_fetch_object 함수를 사용해서 출력해 봤습니다. 불필요한 html 태그들은 사용하지 않았기 때문에 예제의 결과는 조금 초라할지 모르지만 간단히 스크립트의 형태에 html 태그를 사용하면 더 혼란을 줄 것 같아 예제에는 사용하지 않았습니다.

object를 사용한 결과 역시 array를 사용한 것과 같은 결과임을 확인할 수 있습니다. 그리고 해당 필드(1번)의 정보들을 볼 수 있습니다. 위의 field_len : 20은 int(20)의 숫자입니다. 참고로 mysql_fetch_array 함수와 mysql_fetch_row 함수는 한가지 다른 점이 있는데 후자의 경우 필드의 이름을 줄 때 [0]으로 사용하는 반면 전자는 [content]로 해당 필드 이름을 직접 사용할 수 있습니다. 위 함수들의 사용은 데이터의 많고 적음에 따라 각각의 수행 속도가 달라집니다. 다시 생각해 보면 데이터가 많을 경우 배열로 리턴하면 더 속도가 빠를 것입니다. 객체로 리턴할 수도 있겠지요. 하지만 간단한 내용의 경우 배열로 리턴하던지 한 줄을 그냥 리턴 하던지 속도의 차이는 없을 것입니다. 그러므로 위 함수들을 사용할 때는 항상 많은 데이터의 검색을 생각하고 사용하기 바랍니다. 그럼 해당 mysql지원 함수들 중 몇 가지 예를 더 보여 드리겠습니다.

위 소스를 보면 for루프 안에 mysql_result 함수를 사용해서 데이터 내용을 계속 출력해 주는 것을 볼 수 있습니다. 만약 여기서 특정 데이터를 출력하려면 mysql_data_seek 함수를 사용해서 출력해 볼 수도 있습니다. 하지만 mysql_query 문을 이용한 질의를 이용하는 방법이 더 효율적이며 빠를 수도 있습니다. 위 소스와 그전 소스들을 비교하면서 각각의 함수들의 특징을 �"改歐� 바랍니다.

결과 역시 이전 소스들과 마찬가지 임을 확인할 수 있습니다. 그리고 다른 함수로 같은 결과물을 만들 수 있습니다. 위에서 말 한대로 각각의 함수 사용은 데이터의 양에 따라 조금씩 속도 차가 있을 수 있으므로 거기에 맞는 함수를 사용하면 됩니다.
URL 함수
1. base64_decode(string encoded_data) base64로 encoded된 문자열을 해석하고 원래 데이터를 리턴합니다. 2. base64_encode(string data) 해당 데이터를 base64방식으로 인코딩합니다. 관련 함수로는 chunk_split( )가 있습니다.


위 base64 함수는 해당 데이터의 MINE 타입을 지원하는 역할에 사용합니다. 3. parse_url(string url) 해당하는 URL을 배열로 저장해 줍니다. 배열 저장에 포함 되는 부분은 scheme, host, port, user, pass, path, query, fragment 등이 있습니다. 4. urldecode(string str) %와 ##등으로 인코딩된 URL을(str) 원 상태의 URL로 리턴해 줍니다. 5. urlencode(string str) 해당 문자열을 URL 인코딩 방식으로 바꿔 리턴해 줍니다. 다음 설명할 예제의 경우 Url 함수 사용의 예를 보여주기 위해 array 함수들을 사용했습니다. 만약 이해가 안되면 Array 함수를 참조 하세요.

위 소스는 parse_url( ) 함수를 이용해 해당 URL의 scheme, host, user, port, pass, path, query, fragment 등을 리턴합니다. 여기서 각각의 KEY값은 결과를 보면서 확인하기 바랍니다. 화면으로의 출력은 array 함수를 사용했고, array_keys( )는 해당 배열의 key 값을 리턴하며, array_values( )는 해당 배열의 값을 리턴합니다. 역시 for문을 사용해서 각 배열만큼만 출력되게 했습니다. Sizeof( ) 함수는 해당 배열의 수를 리턴합니다.

Urlencode와 Urldecode는 스크립트의 조작으로 인한 에러를 막기 위해 사용되기도 하며 여러 가지 응용해서 사용 가능한 Url 함수입니다.

해당 문자열의 인코딩은 % 와 두자리 헥사 코드로 이루어 집니다. 이것은 또한 알파벳이 아닌 문자에 한해 이루어 집니다.

ARRAY 함수
1. array(...) 배열을 만들어 줍니다. Php 기초 부분에서 이 함수를 사용하는 방법을 보았습니다.

위 소스는 array( ) 함수를 이용한 2차원 배열 형태입니다. 배열은 여러 차원으로 구성할 수 있기 때문에 아주 요긴하게 사용할 수 있습니다. 게시판 루트 기능 중 게시된 글을 선택해서 원하는 글만 삭제할 때 이 방법이 사용 됩니다. ( array( ) 함수는 PHP 기본 문법 장을 참고 하세요)

2. array_count_values(array input) 배열의 전체 수를 구해 줍니다. php 4.0에서 추가 되었습니다.


3. array_flip(array trans) 배열의 값 모두에 플립을합니다. Php 4.0에 추가 되었습니다. 4. array_keys(array input, mixed [search_value]) 배열의 모든 키 값을 리턴해 줍니다. 관련 함수로는 array_values() 입니다.


5. array_merge(array array1, array array2, [ ...] ) 두개 또는 그 이상의 배열을 하나로 합쳐줍니다. Php 4.0에 추가 되었습니다.


위 결과에서 소스 10행의 $cnt 배열이 $a , $b를 병합한 것임을 알 수 있습니다. 6. array_pad(array input, int pad_size, mixed pad_value) 첫번째 인자(배열)를 추가하면서 두 번째 인자 크기만큼 배열을 만듭니다. 만약, 두 번째 인자 크기 만큼 안될 경우 세 번째 인자를 채워 넣습니다. 7. array_pop(array array) 해당 배열의 마지막 원소를 리턴하고 그 원소를 제거합니다. Php 4.0에 추가되었습니다.


위 결과는 소스 13행의 해당 배열의 마지막 원소를 삭제하는 부분에 의해 22행이 출력되지 않습니다. 8. array_push(array array, mixed var, [...]) 해당 배열에 하나 또는 그 이상의 원소를 추가합니다. Php 4.0에 추가 되었습니다.


9. array_reverse(array array) 해당 배열을 하나의 배열로 리턴해 줍니다. Php 4.0 beta3에 추가 되었습니다.


10. array_shift(array array) 해당 배열의 처음 원소를 리턴하고 그 원소를 삭제합니다. Php 4.0에 추가 되었습니다.


위 결과에서 기존의 a[0] 원소를 삭제한 후 배열 a는 원소 하나만 존재하게 됩니다. 11. array_slice(array array, int offset, int [length] ) 배열의 특정 원소를 리턴해 줍니다. Php 4.0에 추가 되었습니다. (Offset의 경우 정수를 사용하며 양수일 경우 offset 값의 그 다음 원소부터 출력하며 음수일 경우 마지막 원소에서 offset 값부터 출력합니다.)


12. array_splice(array input, int offset, int [length] , array [replacement]) 해당 배열의 특정 원소를 제거하고 거기에 새로운 다른 원소를 대체합니다. Php 4.0에 추가되었습니다.


13. array_unshift(array array, mixed var, [...]) 해당 배열의 처음 부분에 하나 또는 그 이상의 원소를 추가합니다. Php 4.0에 추가되었습니다.


14. array_values(array input) 해당 배열의 모든 값들을 리턴합니다. Php 4.0에 추가되었습니다. 15. array_walk(array arr, string func, mixed userdata) 해당 배열 원소에 각각의 개인 함수들을 적용해 줍니다. Php 4.0에 추가되었습니다. 16. arsort(array array) 해당 배열을 역순을 정렬 하며, index association을 유지합니다. 17. assort(array array) 해당 배열을 정렬 하고, index association을 유지합니다. 18. compact(string varname | array varnames, [...]) 해당 변수 이름과 해당 변수의 값을 포함하는 배열을 만듭니다. Php 4.0에 추가되었습니다.


19. count(mixed var) 해당 배열 변수의 원소의 수를 리턴해 줍니다.


20. current(array array) 해당 배열의 현재 원소를 리턴해 줍니다. 21. each(array array) 해당 배열에서 다음 (key , value)쌍을 리턴합니다. 이 쌍에는 네가지 요소를 리턴하는데 0, 1, key, value 입니다. 여기서 0, key는 각각의 변수의 key 이름을 가지고 1, value는 해당 변수의 값을 가집니다.


22. end(array array) 해당 배열의 내부 포인터를 마지막 원소로 옮깁니다.


23. extract(array var_array, int [extract_type] , string [prefix] ) 해당 배열의 내용을 심볼 테이블로 가져와 일반 변수로 리턴해 줍니다.


위 결과에서 8행의 함수 실행으로 각 배열 원소가 변수로 대입되어 출력됩니다. 24. in_array(mixed needle, array haystack) 해당 배열에 해당 변수가 존재하면 true를 리턴합니다.


소스에서 5행의 배열에 7행의 조건에 맞는 인자가 존재하기 때문에 8행이 출력됩니다. 25. key(array array) 해당 배열의 현재 position의 index 원소를 리턴합니다. 즉, associative 배열에서 가리키는 원소의 키 값을 리턴합니다.


26. krsort(array array) 해당 배열을 역key 순으로 정렬합니다. 27. ksort(array array) 해당 배열을 key 순으로 정렬합니다. 28. list(...) 해당 변수들을 배열처럼 만듭니다.


소스에서 12행 함수 수행으로 해당 배열을 key 순으로 다시 정렬해서 출력합니다. 29. next(array array) 해당 배열의 내부 배열 포인터를 전진시킵니다. 30. pos(array array) 해당 배열의 현재 원소를 리턴해 줍니다. 31. prev(array array) 해당 배열의 내부 배열 포인터를 후진시킵니다. 32. range(int low, int high) 두 인자 범위의 정수를 포함하는 배열을 만들어 줍니다.


33. reset(array array) 해당 배열의 내부 포인터를 첫 번째 원소로 set합니다. 34. rsort(array array) 해당 배열을 역순으로 정렬합니다. 35. shuffle(array array) 해당 배열을 섞어 줍니다. 36. sizeof(array array) 해당 배열의 원소 개수를 구해 줍니다. 37. sort(array array) 해당 배열을 정렬합니다. 38. uasort(array array, function cmp_function) 해당 배열을 사용자가 정의한 비교 함수로 정렬하고 index association을 유지합니다. 39. uksort(array array, function cmp_function) 해당 배열을 사용자가 정의한 비교 함수로 key순으로 정렬합니다. 40. usort(array array, function cmp_function) 해당 배열을 사용자가 정의한 비교 함수로 value순으로 정렬합니다.
directory 함수
1. chdir(string directory) 해당 디렉토리로 옮겨 줍니다. 2. dir(string directory) 해당 디렉토리의 객체를 생성합니다. 즉, 이 함수를 이용해 객체를 생성할 경우 두개의 메소드가 주어지는데 하나는 handle , 또하나는 path 입니다. 이 두개의 속성을 이용해 뒤에 설명할 readdir(), rewinddir() , closedir() 함수와 같은 기능의 3개의 메소드를 사용할 수 있습니다. 차례로 read() , rewind() , close() 입니다. 3. closedir(int dir_handle) 해당 디렉토리 핸들을 닫습니다. 4. opendir(string path) 해당 디렉토리 핸들을 open합니다. 즉, 이 핸들을 이용해 closedir(), readdir(), rewinddir() 등에 적용합니다. 5. readdir(int dir_handle) 해당 디렉토리 핸들로부터 해당하는 디렉토리와 파일의 내용을 읽어 리턴합니다. 6. rewinddir(int dir_handle) 해당 디렉토리 핸들을 처음의 위치로 되돌립니다. 즉, readdir() 함수를 이용해 해당 디렉토리와 파일들을 출력했다면 디렉토리 핸들은 마지막에 위치할 것입니다. 다시 한번 더 디렉토리를 읽어 출력하려면 핸들을 처음으로 되돌려야합니다. 디렉토리 함수를 이용한 예제는 리눅스의 ftp 디렉토리중 pub 디렉토리를 읽어들여 화면에 출력하는 것을 보여 드리겠습니다. 이것을 이용해 간단히 디렉토리의 자료 목록을 만들어도 됩니다. ftp의 자료량과 목록을 한눈에 볼 수 있다면 사용자가 편할 것입니다. 이것은 자료실의 운영에 도움이 될 것 입니다. 다른 함수를 사용해서 이름순으로 정렬을 하면 더 보기 편할 것입니다. 하지만 이런 방법은 하나의 방법 일뿐 꼭 이렇게 하라는 법은 없습니다.

그림. 8-97을 보면 opendir( ) 함수를 사용해 해당 디렉토리를 열고, readdir( ) 함수를 사용해서 해당 디렉토리 내용을 읽어 들입니다. 그리고 while 구문을 사용해서 해당 디렉토리의 내용을 전부 출력합니다. 다음 closedir( ) 함수를 사용해서 연 디렉토리를 닫아줍니다. 그럼 그림 8-98의 결과를 확인하겠습니다.

이 결과를 아파치 웹서버의 디렉토리에 존재하는 파일을 웹으로 뿌려주는 기능으로 보여 주는 방법도 있습니다. 이것은 웹서버의 해당 HTML파일이 없을 경우 디렉토리로 보여주는 기능입니다. 단지 웹서버의 이 같은 기능이 존재 하기에 웹서버의 기능으로 스크립트의 디렉토리 함수를 대신 할 수는 없습니다. 스크립트로 만들어 줄 수 있는 부분이 아니기 때문에 엄연히 웹서버의 디렉토리 출력과 이것은 다른 것입니다.
DATE와 TIME 함수
날짜와 시간 함수들은 mysql 함수와 비슷한 부분이 많이 있으므로 대부분 다 이해하리라 생각합니다. 1. checkdate(int month, int day, int year); 해당하는 년 , 월 , 일 의 타당성을 검사해 결과를 리턴합니다. 타당하면 true 거짓이면 false를 리턴합니다. 2. date(string format, int [timestamp] ) 해당 timestamp를 지정한 format에 맞게 리턴해 줍니다. 만약 timestqmp가 주어지지 않을 경우 현재의 timestamp값이 주어집니다. Format의 종류에는 a - "am" 또는 "pm" A - "AM" 또는 "PM" d - 일을 2자리 형식으로 표현합니다. ( 01 , 02 , 31 ) D - 요일을 짧은 영문 표기로 표현합니다. (Mon , Fri) F - 달을 긴 영문 표기로 표현합니다. (January) h - 시간을 12시간 형태로 표현합니다(01 ~ 12) H - 시간을 24시간 형태로 표현합니다.(00 ~ 23) g - 시간을 12시간 형식으로 표현합니다.(1 ~ 12) G - 시간을 24시간 형식으로 표현합니다.(1 ~ 23) i - 분을 2자리로 표현합니다. (00 ~ 59) j - 일을 표현합니다. (1 ~ 31) l - 요일을 긴 영문 표기로 표현합니다.(Friday) L - 해를 넘기 위한 불 연산으로 표현합니다.(0 또는 1) m - 달을 표현합니다. (01 ~ 12) n - 달을 표현합니다. (1 ~ 12) M - 달을 짧은 영어 표기로 표현합니다.(Jan) s - 초를 표현합니다. (00 ~ 59) S - 영어식 숫자를 표현합니다. (th , nd) 즉, 2nd 이런 식입니다. t - 주어진 달의 일 수를 표현합니다. (28 , 31) U - 주어진 시기로 부터의 초를 표현합니다. W - 해당 요일을 숫자로 표현합니다.( 0 -> Sunday , 1 -> Monday) Y - 4자리 년도를 표현합니다. ( 2000 ) y - 2자리 년도를 표현합니다. ( 00 , 99 ) z - 그 해의 몇 번째 일인지 표현합니다. (0 ~ 365)


3. getdate(int timestamp) 해당 timestamp의 date/time 정보를 연관 배열로 리턴합니다. 연관 배열의 요소에는 seconds - 초를 표현합니다. minutes - 분을 표현합니다. hours - 시간을 표현합니다. mday - 그 달의 일을 표현합니다. wday - 그 주의 요일을 숫자로 표현합니다. mon - 달을 숫자로 표현합니다. year - 년도를 숫자로 표현합니다. yday - 그 해의 몇 번째 일인지 표현합니다. (0 ~ 365) weekday - 요일을 긴 영어 표기로 표현합니다.(Friday) month - 달을 긴 영어 표기로 표현합니다. (January)


4. gettimeofday(void) 현재의 시간 정보를 연관 배열 형태로 리턴합니다. 배열 인자에는 sec - 초를 표현합니다. Usec - 마이크로 초를 표현합니다. minuteswest - 그린위치 분을 표현합니다. dsttime - 정확한 dst 타입을 표현합니다.


5. gmdate(string format, int timestamp) 해당 timestamp(GMT/CUT date/time)를 주어진 format 인자에 맞게 리턴합니다. Format 인자는 date() 함수의 인자 설명과 같습니다. 6. gmmktime(int hour, int minute, int second, int month, int day, int year, int [is_dst]) GMT date로 UNIX timestamp를 구합니다. 7. gmstrftime(string format, int timestamp) 주어진 timestamp(GMT/CUT time/date)를 locale 설정을 따르는 형태로 리턴합니다. format 인자는 strftime() 함수를 참조하세요. 8. microtime(void) 현재의 UNIX timestamp를 마이크로초(천분의 1초 단위)로 리턴합니다. 9. mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst]) 해당 날짜를 UNIX timestamp로 리턴합니다. 10. strftime(string format, int timestamp) 주어진 timestamp를 locale 설정을 따르는 형태로 리턴합니다. 물론 여기서도 timestamp인자가 없을 경우 현재시간으로 설정됩니다. Format 인자는 %a - 현재 locale 을 따르는 요일을 축약 표현합니다. %A - 현재 locale 을 따르는 요일을 full name로 표현합니다. %b - 현재 locale 을 따르는 달을 축약 표현합니다. %B - 현재 locale 을 따르는 달을 full name로 표현합니다. %c - 현재의 locale에 대한 우선되는 날짜와 시간을 표현합니다. %d - 일을 표현합니다.(00 ~ 31) %H - 시간을 24시간 형식으로 표현합니다. (00 ~ 23) %l - 시간을 12시간 형식으로 표현합니다. (01 ~ 12) %j - 그 해의 몇 번째 일인지 표현합니다. (001 ~ 366) %m - 달을 표현합니다. (1 ~ 12) %M - 분을 표현합니다. (00 ~ 59) %p - 주어진 시간에 해당하는 "am" 또는 "pm"을 표현합니다. %S - 초를 표현합니다 %U - 올해의 몇 번째 주가 지났는지 표현합니다.(첫 주의 처음 요일은 일요일) %W - 올해의 몇 번째 주가 지났는지 표현합니다. (첫 주의 처음 요일은 월요일) %w - 요일을 숫자로 표현합니다.( 일요일 -> 0) %x - 현재 locale를 따르는 날짜를 표현합니다. %X - 현재 locale를 따르는 시간을 표현합니다. %y - 년도를 두자리 숫자로 표현합니다.(00 ~99) %Y - 네 자리 년도를 표현합니다.(2000) %Z - 현재 타임존을 표현합니다. 11. time(void) 현재의 UNIX timestamp를 리턴합니다. 날짜 함수의 예제는 달력을 만들어 보기로 하겠습니다. 달력은 간단히 함수를 이용하면 이루어 지는 것입니다. 그럼 소스를 보면서 확인 하겠습니다.
달력만들기
<?php if($chanl == day && $m < 13 && $m > 0) { // 달력 화면은 $chanl이 day이고, $m(해당 달)이 13보다 작아야만 출력됩니다. // 이것은 보고 싶은 달을 13 이상으로 입력할 경우 출력이 안되게 하기 위함입니다. $day = 28; // 그 달의 마지막 날을 계산하기 위해 처음 검색할 날짜입니다. while(checkdate($m, $day, 2000)) { $day++; } // 해당 날짜를 검색합니다. Checkdate( ) 함수를 이용해서 28부터 계속 증가하면서 타당한 날짜를 가려 냅니다. // 만약 그 달이 30일까지 라면 31에서 while문은 멈출 것입니다. $day = $day-1; // 날짜 검색의 결과 날짜에서 -1을 함으로써 진짜 날짜를 가려 냅니다. $x = mktime(12,12,12,$m,1,2000); // 2000년 $m(전달 받은 달)월 1일 12:12:12을 나타내는 타임 스탬프 값입니다. // 이 함수를 사용한 것은 단지 예를 보이기 위함이므로 다른 방법을 사용해도 무관합니다. $day2 = date("w","$x"); // 이 함수의 w 인자는 요일을 숫자로 리턴합니다. 0일 경우 일요일입니다. // 즉, 해당 달의 처음 1일의 요일을 알기 위해 쓰여집니다. $hday = mktime(); // 이 함수는 현재 날짜와 시간을 알기 위해 사용합니다. $day3 = date("j", "$hday"); // $hday 변수 값을 이용해 오늘의 날짜를 알아 냅니다. echo ("<b>2000년 $m 월 $day3 일</b><br>"); // 화면에 오늘의 날짜를 출력합니다. echo("<table border=1 cellspacing=2 cellpadding=2 width=400>"); // 달력의 테이블 시작입니다. echo("<tr> <td>일</td> <td>월</td> <td>화</td> <td>수</td> <td>목</td> <td>금</td> <td>토</td> </tr> <tr> "); // 요일 테이블 입니다. 이 테이블 형식으로 날짜들이 만들어집니다. $r="7"-"$day2" ; // 달력의 처음 1일이 무슨 요일인지를 확인하고 달력 처음 부분의 공백을 만들기 위한 공백 칸수를 알아냅니다. //이제 해당 달력의 실제적인 구문은 for문입니다. { // $n은 달력에 표시한 날짜입니다. // 이것은 계속 증가 하면서 화면에 출력하는데 $day(그 달의 마지막 날짜)까지 증가하면서 화면에 출력합니다. if($n ==1) { //만약 해당 날짜가 1 이면 달력의 처음 공백 부분을 표현합니다. for($d=0 ; $d <= $day2-1 ; $d++) { // 공백의 수는 그 달의 1일을 숫자로 받은 $day2 변수에 -1한 값 만큼 만듭니다. echo("<td> </td>"); } } if($n == $r+1 || $n == $r+8 || $n == $r+15 || $n ==$r+22 || $n == $r+29) { // 위 if문은 날짜를 출력 하면서 해당 날짜 이후 다음 칸에 출력 하게 하기 위한 조건 입니다. echo("</tr><tr>"); } if($day3 == $n) { // 이 조건은 만약 달력 테이블을 출력 하면서 날짜가 오늘 날짜일 경우 진하게 표현 하기 위한 문입니다. echo("<td><b>$n</b></td>"); } else { // 그 밖의 경우 날짜는 보통 크기로 출력 됩니다.// echo"<td>$n</td>"); } } }// 처음 if문의 끝입니다. echo("</tr> </table><br> "); echo("<b>보고 싶은 월을 입력 하세요<b><br> <form method=post action=/test/test.php> <input type=text size=4 name=m>월 <input type=hidden name=chanl value=day> <input type=submit value=View> </form> "); // 여기서 form문에 사용해 보고 싶은 달을 입력 하면 화면에 해당 달의 오늘 날짜를 볼 수 있습니다. // 이 문은 select문을 사용해서 12월 이후로 입력을 못하게 만들 수도 있지만 조건식의 학습에 도움을 // 주기 위해 text 입력 폼으로 만들었습니다. // Form문의 인자들을 전달할 action 부분은 $PHP_SELF를 사용해서 여러분은 해보기 바랍니다. // 이것은 현재의 스크립트 파일 자신�"韜� 인자들을 전달하는 것입니다. ?> 여기 까지 달력 소스를 보았습니다. 그럼 결과를 보면서 소스와 한번 다시 비교해 보기 바랍니다.

결과를 보면 해당 날짜가 찐하게 표시 되는걸 볼 수 있습니다. 이렇게 여러분들도 나름대로 새로이 달력을 만들어 보길 바랍니다. 보기에는 화려하지 않지만 HTML의 조금의 수정으로 도 충분히 화려해 질 수 있습니다. 문제는 이렇게 출력하게 하는 스크립트의 구성을 하는 것입니다. 먼저 함수를 읽어 보고 난후 이 달력 소스를 참고 하지 않고 만들어 봤으면 합니다. 무엇이든 몰두해서 만들어 보는 것이 중요합니다. 이것이 쌓이면 실력이 되는 것입니다. 필자는 이런 달력 소스를 만드는데 꼬박 하루를 허비했습니다.
STRING 함수
mysql의 문자열 함수들과 같이 문자열을 다루는 함수들은 데이터베이스로의 입력과 관련해 중요한 부분입니다. 하지만 필자의 경우 이 부분이 조금 소홀한 면이 있습니다. 뒤 소스 부분에서 확인되겠지만 전혀 문자열과는 관계 없는 듯 열심히 스크립트를 만들었습니다. 여러분들은 부디 이 부분에 신경을 쓰기 바랍니다. (참고로 문자열 함수를 추가하고 작동하는 것에는 그렇게 어렵지 않습니다. 여러 경우의 조건을 입력 하려면 물론 비슷한 문자열 함수들을 나열 해야만 하겠죠)
1. addslashes(string str) 해당 문자열이 작은, 큰Quote(따옴표) , 역슬래쉬(\)와 같은 문자가 있을 경우 이 문자 앞에 역슬래쉬(\)를 추가해서 리턴합니다. 2. bin2hex(string str) 해당 문자열을 2진에서 16진으로 바꿔 리턴합니다. 3. chop(string str) 해당 문자열의 뒤 쪽 공백을 제거합니다. 4. chr(int ascii) 해당 ascii를 포함하는 특정 문자를 리턴합니다. 5. chunk_split(string string, int [chunklen] , string [end] ) 해당 문자열을 작은 크기로 쪼개서 리턴합니다. 6. convert_cyr_string(string str, string from, string to) 해당 문자열을 Cyrillic 문자에서 또 다른 문자로 바꾸어 리턴합니다. k - koi8-r w - windows-1251 i - iso8859-5 a - x-cp866 d - x-cp866 m - x-mac-cyrillic 7. crypt(string str, string [salt]) 해당 문자열을 encryption 형식으로 변환해서 리턴합니다. 8. echo(string arg1 , string [argn] ….) 해당 하는 인자를 출력해 줍니다. 9. explode(string separator, string string) 해당 문자열을 separator 문자열을 기준으로 나눠서 배열로 저장합니다. 10. flush(void) output buffer을 flush합니다. 11. get_meta_tags(string filename, int [use_include_path]) 해당 파일의 모든 메타 tag의 content 속성을 가져와 배열 형태로 저장합니다. 12. htmlspecialchars(string string) 해당하는 특정 문자를 HTML entity로 변환해서 리턴합니다. 13. htmlentities(string string) 해당 하는 문자열의 모든 문자들을 HTML entity로 변환해서 리턴합니다. ‘&’ -> ‘&’ ‘"’ -> ‘"’ ‘<’ -> ‘<’ ‘>’ -> ‘>’ 14. implode(string glue, array pieces) 해당 하는 배열의 원소들을 특정 문자열(glue)을 이용해서 연결하고 새로운 문자열을 리턴합니다. 15. join(string glue, array pieces) implode함수와 기능이 같습니다. 해당 배열의 원소를 문자열을 이용해 연결합니다. 16. ltrim(string str) 해당 문자열의 앞 공백을 제거합니다. 17. md5(string str) 해당 문자열의 md5 hash 값을 계산해서 리턴합니다. 18. nl2br(string string) 해당하는 문자열에서 newline을 <BR>로 바꿔 리턴합니다. 19. ord(string string) 해당하는 문자열의 ASCII 값을 리턴합니다. 20. parse_str(string str) 해당 문자열을 변수로 해석해 줍니다.


21. print(string arg) 해당 문자열을 출력합니다. 22. printf(string format, mixed [args]...) 해당 format에 따라 문자열을 출력합니다. 23. quoted_printable_decode(string str) quoted_printable 문자열을 8bit 문자열로 바꿔서 리턴합니다. 24. quotemeta(string str) 해당 하는 문자열에서 meta 문자들을 백슬래쉬(\)가 첨가된 문자로 리턴합니다. 25. rawurldecode(string str) URL encoded 문자열을 디코드해서 리턴합니다. 26. rawurlencode(string str) RFC1738을 따르는 URL encode를 해서 리턴합니다. 27. setlocale(string category, string locale) locale 정보를 설정해서 리턴합니다. 28. similar_text(string first, string second, double [percent]) 두 문자열의 비슷한 점을 찾고 리턴합니다. 29. soundex(string str) 해당 문자열의 soundex key를 리턴합니다. 30. sprintf(string format , mixed [args]…) 해당하는 format으로 문자열을 리턴합니다. Format 양식에는 % - 해당 포맷의 앞에 붙입니다. b - 2진수를 표현합니다.(integer) c - ASCII 값을 표현합니다.(integer) d - 10진수를 표현합니다.(integer) f - 실수를 표현합니다.(double) o - 8진수를 표현합니다.(integer) s - 문자열을 표현합니다. x - 16진수를 표현합니다.(lowercase 문자도 포함) X - 16진수를 표현합니다.(uppercase 문자도 포함) 31. strchr(string haystack, string needle) 해당하는 문자가 처음으로 나타나는 부분을 찾아 줍니다. 32. strcmp(string str1, string str2) binary 방식으로 해당 문자열들을 비교합니다. 33. strcspn(string str1, string str2) mask와 매칭되지 않는 initial segment의 길이를 리턴합니다. 34. strip_tags(string str) 해당 문자열에서 HTML과 PHP tag를 제거하고 리턴합니다. 35. stripslashes(string str) addslashes로 역슬래쉬된 해당 문자열에서 이를 제거하고 리턴합니다. strlen(string str) 해당 문자열의 길이를 리턴합니다. 36. strrpos(string haystack, char needle) 해당 문자열에서 찾을 문자가 나타나는 마지막 위치를 리턴합니다. 37. strpos(string haystack, string needle, int [offset]) 해당 문자열이 나타나는 처음 위치를 리턴합니다. 38. strrchr(string haystack, string needle) 해당 문자열이 마지막으로 나타나는 위치 다음의 문자열을 리턴합니다. 39. strrev(string string) 해당 문자열을 reverse 해서 리턴합니다. 40. strspn(string str1, string str2) 해당 mask와 매칭 되는 initial segment의 길이를 리턴합니다. 41. strstr(string haystack, string needle) 해당 문자열이 처음 나타나는 위치의 문자열을 리턴합니다. 42. strtok(string arg1, string arg2) 해당 문자열을 tokenize 해서 리턴합니다. 43. strtolower(string str) 해당 문자열을 소문자로 리턴합니다. 44. strtoupper(string string) 해당 문자열을 대문자로 리턴합니다. 45. str_replace(string needle, string str, string haystack) 해당 문자열에서 원하는 문자열을 바꾸고 싶은 문자열로 대체해서 리턴합니다. strtr(string str, string from, string to) 해당 문자열에서 원하는 문자를 바꾸고 싶은 문자로 대체해서 리턴합니다. 46. substr(string string, int start, int [length]) 해당 문자열에서 특정 부분만 리턴합니다. 47. trim(string str) 해당 문자열의 앞과 뒤 공백을 제거해서 리턴합니다. 48. ucfirst(string str) 해당 문자열의 처음 문자를 대문자로 만들어 리턴합니다. 49. ucwords(string str) 해당 문자열의 각 단어의 처음 문자를 대문자로 만들어 리턴합니다. 문자열 함수의 예 또한 폼 문을 사용해서 보여 드리겠습니다. 이것은 간단히 문자열을 입력해 보면 해당 함수의 결과를 확인 할 수 있습니다. 앞에서 말한바 있지만 PHP 문자열 함수 역시 mysql의 함수와 유사한 역할들이 대부분 존재합니다. 이것은 둘의 같은 부분을 더 쉽게 익힐 수 있는 면이기도 합니다. 그럼 먼저 소스를 확인하겠습니다. 여기 함수의 사용은 정규표현식이 사용된 부분도 있으며 그 부분은 다음 정규 표현식을 보기 바랍니다. <?php $array = array("$str","cry","crygood"); //$str은 폼 문에 입력한 문자열 변수입니다.// $exp = explode("r",$str); $exp2 = implode("~",$array); $exp3 = split("[rR]{1}",$str); $exp4 = substr("$str",3,-1); $exp5 = strchr($str,"c"); $exp6 = strrchr($str,"c"); $exp7 = strpos($str,"c"); $exp8 = strrpos($str,"c"); $exp9 = strlen($str); $exp10 = strtolower($str); $exp11 = strtoupper($str); $exp12 = ucfirst($str); $exp13 = ucwords($str); $exp14 = strrev($str); $exp15 = strtr($str,"cry","byeju"); $exp16 = str_replace("cry","hicry",$str); $exp17 = quotemeta($str); $exp18 = ord($str); $exp19 = chr($exp18); echo("<b>STRING_Test</b><br><br>"); if($chanl == sub) { // 만약 문자열 변수가 전달되지 않으면 실행되지 못하게 하기 위함입니다.// echo("explode[0] : $exp[0]<br> explode[1] : $exp[1]<br> implode : $exp2<br> split[0] : $exp3[0]<br> split2[1] : $exp3[1]<br> substr : $exp4<br> strchr : $exp5<br> strrchr : $exp6<br> strpos : $exp7<br> strrpos : $exp8<br> strlen : $exp9<br> strtolower :$exp10<br> strtoupper : $exp11<br> ucfirst : $exp12<br> ucwords : $exp13<br> strrev : $exp14<br> strtr : $exp15<br> str_replace : $exp16<br> quotemeta : $exp17<br> ord : $exp18<br> chr : $exp19<br> "); } echo(" <form method=post action=$PHP_SELF> <input type=text size=44 name=str> <input type=hidden name=chanl value=sub> <input type=submit value=Sub> </form> "); ?> 위 소스는 단순히 함수의 나열과 전달된 문자열을 문자열 함수를 이용해서 화면에 뿌려주는 역할만 할뿐 입니다. 단지 함수의 작동을 확인 하기 위한 스크립트 입니다. 여러 가지를 입력해 보고 문제점과 각각의 함수들의 특징들을 다시 확인하기 바랍니다. 소스에 관한 설명은 하지 않겠습니다. 여러분들도 아시다시피 위 소스는 단지 함수의 나열 입니다. 아래 결과와 비교하면서 익히기 바랍니다.

그림 8-108에서 각각의 함수들이 처리하는 문자열의 결과를 확인하세요.
Regular expression 함수
여러 가지 복잡한 문자열 다루기 위해 PHP는 정규 표현 함수가 있습니다. 문자열 처리 함수로 해결 될 수 없는 부분을 정규 표현 함수를 이용 해서 간단히 해결합니다. 1. ereg(string pattern, string string, array [regs]) 해당 문자열에서 주어진 정규 표현식 패턴과의 일치 되는 문자열을 검색합니다. 2. ereg_replace(string pattern, string replacement, string string) 해당 문자열에서 주어진 정규 표현식 패턴과의 일치 되는 문자열을 검색하고 바꿀 문자열로 대체합니다. 3. eregi(string pattern, string string, array [regs]) ereg() 함수와 동일하나 검색을 할 때 대, 소 문자를 구분하지 않습니다. 4. eregi_replace(string pattern, string replacement, string string) ereg_replace()와 동일하나 검색을 할 때 대, 소 문자를 구분하지 않습니다. 5. split(string pattern, string string, int [limit]) 지정한 패턴과 일치하는 문자열을 경계로 해당 문자열을 나누고 배열에 저장합니다. 정규 표현식 패턴의 종류 정규 표현식은 주로 게시판의 입력 사항에서 사용 되어 집니다. 가령 비밀번호나 기타 이름 등을 입력할 때 주어진 조건에 맞게 입력하게끔 하는 것입니다. " . " - 이 표현은 c.y처럼 표현하기도 하고 .cy로 하기도 합니다. 즉, 전자는 c로 시작 하면서 y로 끝나는 문자를 나타냅니다. (cry , cay , cat) 물론 여기서 . 은 한 문자만을 가리키는 것입니다. 후자는 문자열이 cy로 끝나는 문자열을 나타냅니다(xcy, xcy). 잘못된 표현은 전자의 경우 csdy, cfgy , cy입니다. " . " 은 한문자 만을 나타냅니다. " ? " - ?앞의 문자가 있거나 없음을 나타냅니다. 즉, sc?y 는 sy , scy , scyf , frsy …와 일치합니다. " + " - +는 앞의 문자를 가리키며 최소 하나 이상의 문자임을 나타냅니다. 즉, c+ry는 cry, ccry, cccry, cryhj … 와 일치합니다. " * " - * 는 앞의 문자가 없거나 하나 이상의 문자임을 나타냅니다. 즉, c*ry 는 ry, cry, cccry … 과 일치합니다. 또 cry* 는 y가 없거나 하나 이상 문자임을 나타냅니다. cr, cry, cry, cryyy …. 와 일치합니다. " $ " - $는 해당 문자열의 마지막 부분을 가리킵니다. 즉, c?ry$ 는 ry로 끝나는 문자열에서 앞의 문자가 c가 있거나 없는 문자열을 나타냅니다. cry , ry , skycry …와 일치합니다. c?r+$ 는 앞의 문자 c 가 있거나 없는 문자이며 r로 적어도 하나이상 끝나는 문자열을 나타냅니다. r , cr , crr , crrr … 와 일치합니다. " ^ " - ^ 는 뒤 문자열로 시작되는 모든 문자열을 나타냅니다. 즉, ^cry 는 cry is good, cry is very good, crypdf … 와 일치합니다. 또 ^cry?df는 y가 있거나 없는 crydf , crdf로 시작하는 모든 문자열을 나타냅니다. crydf is good, crdfgg …와 일치합니다. 이렇게 이 기호들은 상호 같이 사용해서 문자열을 표현합니다. " [ ] " - [ ] 는 이 안의 문자 중에 하나의 문자를 표현합니다. 그리고 [ ] 안의 문자의 표현은 "-" 를 사용해서 합니다. 즉, [a-z] 는 영문의 소문자 한글자를 포함하는 모든 문자열을 나타냅니다. A2sdr , skycry , cry , zzzz …. 와 일치합니다. 또 [a-zA-Z0-9] 는 영문 대,소문자 와 십진수 한자를 포함하는 모든 문자열을 나타냅니다. a4df, Cry44 is passw , 4ded … 등과 일치합니다. [cC][yY] 는 cy , cY , Cy , CY 를 포함하는 문자열을 나타냅니다. Cycap , Cyclub … 등과 일치합니다. 만약 해당하는 문자를 제외한 문자열과의 일치를 나타내려면 ^기호를 [] 안에 사용합니다. [^a-z]는 영문 소문자를 제외한 한글자를 포함하는 문자열을 나타냅니다. Cry44, skycryGood, 444 is passw … 와 일치합니다. 물론 영문 자체의 입력을 하지 못하게 하려면 [^a-zA-Z]로 표현할 수 있습니다. [ ] 는 일정한 문자의 표현은 간단하게 표현할 수도 있습니다. 클래스화된 방법을 사용합니다. 즉, [[:space:]]는 공백 문자를 나타냅니다 ( ) 와 일치합니다. [[:digit:]]는 숫자 하나를 나타냅니다. [0-9]와 일치합니다. [[:alpha:]]는 영문 알파벳 하나를 나타냅니다. [a-zA-Z] , [a-Z]와 일치합니다. [[:alnum:]]는 영문 알파벳 문자와 숫자 중 하나를 나타냅니다. [a-zA-Z0-9]와 일치합니다. " { } " - { }는 {숫자}로 표현하며 중괄호 안의 숫자는 앞의 문자의 개수를 나타냅니다. C{4}ry는 C가 ry 앞에 4개 존재하는 문자열을 나타냅니다. CCCCry를 나타냅니다. C{4,}ry는 C가 ry 앞에 적어도 4개 이상인 문자열을 나타냅니다. CCCCry , CCCCCry , CCCCCCry … 와 일치합니다. C{1,4}ry 는 C 가 ry 앞에 1 ~ 4개 존재하는 문자열을 나타냅니다. Cry , CCry , CCCry , CCCCry 와 일치합니다. " ( ) " - ( ) 는 이 안의 문자를 그룹화합니다. sky(cry)* 는 sky 뒤에 cry 가 하나 이상 있거나 없는 문자열을 나타냅니다. sky , skycry is good , skycrycrydd …. 와 일치합니다. " | " - | 는 OR 연산을 나타내 줍니다. sky|cry 는 sky 나 cry 를 나타내는 문자열을 나타냅니다. sky is good , cry is good..와 일치합니다. sky(cry|g)* 는 sky 뒤에 cry 나 g 가 없거나 하나 이상 존재하는 문자열을 나타냅니다. sky , skycry , sky is good , skygjjh … 등과 일치합니다. 특수 기호 패턴에 비교하기 - 특수 기호 " ^ . [ ] $ ( ) | * + ? { } \ " 앞에 \를 붙여 표현합니다. 하지만 [ ] 안에서 특수 기호를 사용할 경우 \를 붙이지 않고 그냥 표현합니다. \$+ 는 문자열 앞에 $ 기호가 하나 이상 포함된 문자열을 나타냅니다. $cry , $$$sky … 등과 일치합니다. [^.[]?*{}/\] 는 문자열 중에 "^" , " ." , " [" , " ]" , "? " , " * " , " { " , " } " , "/ " , "\"문자가 포함된 문자열을 나타냅니다. Hi? , {cry} , … 등과 일치합니다.
Image 함수
PHP는 이미지 함수를 사용해서 새로 생성하거나 여러 형태로 만들 수 있습니다. 이 함수를 사용하기 위해서는 GD 라이브러리를 설치해야 되고 이 라이브러리 없이 사용가능한 함수도 있습니다. 지원하는 이미지 확장자는 jpeg , gif , png 등이 있습니다. GD를 구하려면 www.boutell.com/gd/ 에서 다운 받을 수 있습니다. (GD 1.5버전 이하에서 GIF를 지원하며 그 이후 버전에서는 GIF를 지원하지 않습니다.)
1. getimagesize(string filename, array [imageinfo]); jpeg , gif , png 파일의 이미지 크기를 구해서 리턴합니다. GD 라이브러리 없이 사용 가능 하며 4개의 배열 형태로 리턴합니다. 0 - 해당 이미지 width(픽셀 단위) 1- 해당 이미지 height 2- flag ( 1 - gif , 2 - jpg , 3 - index) 3- 해당 이미지의 width , height를 문자로 리턴(width = 344 , height = 342) 2. imagecreate(int x_size , int y_size); 해당 x, y (가로 , 세로)크기의 새로운 이미지를 생성합니다.(픽셀 단위) 3. imagecreatefromgif(string filename); 해당 파일 이름을 가진 이미지를 가지고 와서 새로이 이미지를 생성하며, 기존의 이미지 크기는 같습니다. (GD1.5 이하 버전에서 사용) 4. imagegif(int im , string filename); 새로이 생성한 이미지를 브라우저 또는 파일로 출력합니다.(GD 1.5이하 버전에서 사용) 5. imagepng(int im , string filename); 새롭게 생성한 이미지를 브라우저나 파일로 출력합니다. (GD 1.5 이후 버전에서 GIF 이미지 대신 PNG를 사용합니다.) 6. imagedestroy(int im); imagecreate( ) 함수로 생성된 이미지가 점유하는 메모리를 해제합니다. 7. imagecolorallocate(int im , int red , int green , int blue); 해당 이미지에 RGB 값을 리턴합니다. (192,192,192) - 회색 (0,0,0) - 검정 (255,255,255) - 흰색 (255,0,0) - 적색


소스 3행에서 PNG 이미지(100x100)를 생성하고 4행에서 해당 이미지의 배경을 red로 설정합니다. 7행에서 PNG 이미지를 브라우저에 출력하고 8행에서 해당 이미지를 메모리에서 제거합니다. 8. imagerectangle(int im , int x1 , int y1 , int x2 , int y2 , int col); x, y 4개 인자를 좌표로 사각형을 해당 색으로 출력합니다. (x1, y1은 사각형 좌측 좌표이고 x2 , y2는 사각형 우측 좌표입니다.) col 인자는 imagecolorallocate( ) 함수를 사용한 변수를 적어 사용합니다.


소스 4 , 5행의 경우 4행이 우선해서 해당 이미지의 배경을 지정합니다. 7 ~ 10행의 함수 수행으로 적색 사각형이 4개 만들어 집니다. 9. imagefilledrectangle(int im , int x1 , int y1 , int x2 , int y2 , int col); 8번 함수와 기능은 비슷하지만 이 함수는 해당 인자로부터 좌표를 얻고, 해당 사각형을 만들어 지정한 색으로 사각형을 색칠합니다.


소스 8 , 10행의 수행으로 해당 사각형이 적색으로 칠해져 출력됩니다. 10. imagepolygon(int im , array points , int num_points , int col); 해당 배열의 포인터 와 꼭지점의 수로 다각형을 출력합니다. 배열의 포인터는 순서대로 꼭지점의 x, y 좌표를 지정합니다.


소스 6행의 배열을 이용해 8행의 다각형을 출력합니다. 11. imagefilledpolygon(int im , array points , int num_points , int col); 해당 다각형을 지정한 색으로 칠해서 출력합니다.


소스 8행의 실행으로 해당 다각형이 적색으로 칠해져 출력됩니다. 12. imageline(int im , int x1 , int y1 , int x2 , int y2 , int col); 해당 이미지 안에 지정한 색으로 선을 그어 줍니다.


소스 7, 8행의 결과로 x 표의 선을 출력합니다. 13. imagedashedline(int im , int x1 , int y1 , int x2 , int y2 , int col); 해당 이미지에 전선을 그립니다.


소스 7 , 8행의 실행으로 점선 x를 출력합니다. 14. imagesetpixel(int im , int x , int y , int col); x ,y 인자를 좌표로 해당 위치에 지정한 색으로 점을 찍습니다.


소스에서 13행 for문의 실행으로 함수 결과에서 진하게 표시된 점선이 출력 됩니다. 이것은 픽셀이 촘촘히 있을 때 그냥 선을 긋는 것과 같이 보입니다. 7~11행의 경우는 작은 픽셀로 출력되는걸 볼수 있습니다. 15. imagestring(int im , int font , int x , int y , string , int col); 해당 x ,y 위치에 지정한 색의 문자열을 출력합니다.


7행의 font인자 크기 만큼 해당 문자열이 출력됩니다. 16. imagestringup(int im , int font , int x , int y , string , int col); 15번과 같으나 해당 문자열을 세로로 출력합니다.


소스 7행의 수행으로 문자열이 세로로 출력됩니다. 17. imagechar(int im , int font , int x , int y , char , int col); 15,16번 함수와 같지만 문자열이 아닌 문자 하나만을 출력합니다.


소스에서 7행의 문자열의 처음 캐릭터만 출력 되는걸 볼 수 있습니다. 18. imagecharup(int im , int font , int x , int y , char , int col); 해당 문자를 화면에 지정한 색으로 세로로 출력합니다. 19. imagesx(int im); 해당 이미지의 width를 구해 줍니다. 20. imagesy(int im); 해당 이미지의 height를 구해 줍니다. 21. imagearc(int im , int cx , int cy , int w , int h , int s , int e ,int col); 인자들에 해당하는 타원을 출력합니다. cx,cy - 타원의 중심 좌표 w - 타원의 너비 h - 타원의 높이 s- 타원의 시작점(단위는 각으로 표시) e- 타원의 끝점


소스 7~10행의 실행으로 4개의 타원이 생성되고 화면에 출력됩니다. 22. imagefill(int im , int x , int y , int col); 좌표가 포함되는 영역을 지정한 색으로 색칠합니다.


소스 9행의 좌표에 해당하는 부분이 적색으로 색칠되어 출력됩니다. 23. imagecolortransparent(int im , int col); 해당 이미지의 투명 처리 색깔을 설정합니다.


소스 14행에 의해 적색 부분을 투명하게 출력합니다. 23. imagecopyresized(int dst_im, int src_im, int dst x, int dst y, int src x, int src y, int dst w, int dst h, int src w, int src h); 원본 이미지의 특정 부분을 대상 이미지로 copy합니다. dst_im - 대상 이미지 src_im - 원본 이미지 src x, y - 원본 이미지 좌측 상단 좌표 src w,h - 원본 이미지 가로와 세로 크기 24. imageTTFText(int im, int size, int angle, int x, int y, int col, str fontfile, str text); 트루 타입 폰트를 사용해서 이미지에 해당 문자열을 출력합니다. (이 함수를 사용하기 위해서는 FreeType 라이브러리를 GD와 같이 설치해야 합니다.) 25. imageTTFBBox(int size, int angle, str fontfile, str text); 문자열에 해당하는 위치를 픽셀 단위를 담은 배열로 리턴합니다. (FreeType 라이브러리 설치 시 사용 가능) 26. imagecolorat(int im , int x , int y); 해당 좌표에 위치한 픽셀이 가지고 있는 색의 인덱스를 리턴합니다. 인덱스 값 - GIF의 경우 0~255 27. imagecolorsforindex(int im , int index); 해당 이미지의 컬러 인덱스의 RGB값을 배열 형태로 리턴합니다. 28. imagecolorexact(int im , int red , int green ,int blue); 특정 색의 color인덱스 값을 리턴합니다. 29. imagecolorclosest(int im , int red , int green , int blue); 해당 RGB와 제일 일치하는 color 인덱스 값을 리턴합니다. 30. imagecolorset(int im , int index , int red , int green , int blue); 해당 color 인덱스에 해당하는 색을 red , green , blue 인자로 지정한 색으로 변환합니다. 31. imagecolorresolve(int im , int red , int green , int blue); 해당 인자로 지정한 특정 색의 color 인덱스를 리턴합니다. 32. imagecolortotal(int im); 해당 이미지에 사용 된 총 색의 수를 리턴합니다. 33. imageinterlace(int im , int [interlace]); 해당 이미지의 interlace 값을 설정합니다. Interlace = 0 - 이미지가 브라우저에 출력될 때 위에서부터 천천히 출력합니다. Interlace = 1 - 이미지가 브라우저에 출력될 때 전체 이미지가 서서히 나타납니다.
기타함수
1.exec(string command , string [array] , int [return_var]); 외부 프로그램을 실행합니다. 두 번째 인자를 설정하면 명령의 모든 라인을 리턴받을 수 있고 디폴트는 결과만 리턴받습니다. 세 번째 인자는 해당 리턴 값을 저장합니다.


소스에서 5행의 실행으로 해당 명령의 결과를 배열로 저장합니다. 이것을 화면에 보여 주기 위해 7행의 while를 실행합니다. 2. system(string command , int [return_var]); 외부 프로그램을 실행하고 결과를 화면에 출력합니다, 두 번째 인자는 실행 상태 값을 저장합니다.


3. setcookie(string name , string value , int expire , string path , string domain , int secure); 쿠키 설정을 하도록 브라우저에 보냅니다. 쿠키의 설정은 데이터의 어떠한 것보다 우선해서 실행해서 보내야 됩니다. 이것은 스크립트에서 헤더 보다도 우선 해야합니다. 설정된 쿠키를 강제로 종료하려면 쿠키를 한번 더 실행하면 됩니다. 예) setcookie("username",$user,time()+3600); 이것은 $user의 쿠키를 1시간 동안 유지하는 설정입니다. 시간 설정은 초단위 이며 0일 경우 브라우저를 종료하면 쿠키가 제거됩니다. 4. session 함수 php4에서 새롭게 등장했으며 쿠키와 함께 같이 유용하게 쓰입니다. 예) 세션의 경우 PHP.INI의 설정 부분에 시간과 나머지 관련 설정할 수 있습니다. (PHP 설치 부분 참고) 세션 시작 - session_start( ); 세션 등록 - session_register("해당 세션 값"); 세션 종료 - session_destroy("해당 세션 값"); 5. connection_status(void); 연결 상태를 bit단위로 값으로 리턴합니다. 6. connection_timeout(void); 스크립트가 설정 시간을 초과 해 time out 되면 true를 리턴합니다. 7. connection_aborted(void); 클라이언트가 접속을 끊을 경우 true를 리턴합니다. 8. die(string message); 해당 메시지를 출력하고 스크립트 실행을 중지합니다. 9. sleep(int seconds); 스크립트의 실행을 지정한 초 만큼 지연합니다. 10. exit(void); 지금 스크립트의 실행을 중지합니다. 11. ignore_user_abort(int [setting]); 클라이언트의 접속이 끊겼을 경우 해당 스크립트의 실행 여부를 설정합니다. 12. register_shutdown_function(string func); 해당 스크립트가 종료 때 실행될 함수를 설정합니다. 13. usleep(int micro_sec); 스크립트의 실행 시간을 마이크로 초단위로 지연시킵니다. 다음 장에서는 Mysql 기본 문법을 설명하겠습니다.
9. MYSQL 기본 문법
Mysql은 대화식 db입니다. 주로 서버에 연결을 하고 질문을 실행하며 결과를 화면에 출력해주는 일을 합니다. 무엇보다 아파치와 php를 연동했을 때 그 진가를 발휘합니다. 여기서는 리눅스용 mysql을 위주로 설명할 것이며 다른 db의 함수도 비교하겠습니다.
9.1 Mysql을 시작하기 전에
사용 가능한 이름
mysql을 한글 지원으로 컴파일했다면 한글 이름을 줘도 되지만 이것은 사용하지 않는 편이 좋습니다. 그리고 이름엔 "." 문자를 사용할 수 없고 첫 글자는 영문으로 사용해야 합니다. 또, 최대 64자까지 지원되며, 별명은 최대 256자까지 지원됩니다. 이름의 구성은 영문,숫자, "_" , "$"로 이루어져야 합니다. Mysql을 유닉스나 리눅스 계열에서 사용한다면 그 운영체제의 환경을 따르기 때문에 대소문자를 구별해서 데이터베이스 이름, table 이름이 저장됩니다. Win32계열의 경우는 대소문자를 구분하지 않지만 하나의 문에서 대소문자를 같이 사용할 수는 없습니다. 하지만 별명은 대소문자를 구분해 줍니다.

9.2 주석의 사용
각 라인의 끝에 오는 "#"과 여러 라인을 사용할 수 있는 "/* */"가 있습니다.
9.3 컬럼 타입
mysql의 컬럼은 종류가 다양합니다. 그래서 보기 쉽게 아래 표를 만들어 보았습니다. Type Option (B)-최대표시, (F)-소수점이하자릿수 --------------------------------------------------------------------------------------------------------------------- TINYINT 정수형(-128~127), (B), [UNSIGNED]-정수형(0~255) SMALLINT 정수형(-32768~32767), (B), [UNSIGNED]-정수형(0~65535) MEDIUMINT 정수형(-8388606~8388607), (B), [UNSIGNED]-정수형(0~16777215) INT 정수형(-2147483648~2147483647), (B), [UNSIGNED]-정수형(0~4294967295) INTEGER INT와 동일 BIGINT 정수형(-9223372036854775808~9223372036854775807), (B), [UNSIGNED]-정수형(0~18446744073709551615) FLOAT(정밀도) 부동소수점실수, (정밀도)-"(4,8)", (4)-단정도 부동소수점실수, (8)-배정도 부동소수점실수, 범위는 FLOAT, DOUBLE과 같습니다. FLOAT(L, F) 단정도 부동소수점 실수, (B,F), (-3.402823466E+38 ~ 1.175494351E-38, 0, 1.175494351E-38 ~ 3.402823466E+38) DOUBLE 배정도 부동소수점 실수, (B,F), (-1.7976931348623157E+308 ~ -2.2250738585072014E-308,0, 2.2250738585072014E-308 ~ 1.7976931348623157E+308) DOUBLE PRECISION~REAL PRECISION(B,F), REAL(B,F) DOUBLE와 동일 DECIMAL 부동 소수점 실수 CHAR 형태로 동작, (B,F), F가 0이면 소수점이하는 저장되지 않습니다. 범위는 DOUBLE와 같습니다. NUMERIC ECIMAL과 동일 DATE 날짜형(1000-01-01 ~ 9999-12-31) 기본타입 - YYYY-MM-DD DATETIME 날짜와 시간형(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59) 기본타입 - YYYY-MM-DD HH:MM:SS TIMESTAMP 타임스템프형(1970-01-01 ~ 2037년 임의 시간), (B) - (14,12,8,6) B 값이 없을 경우 INSERT, UPDATE시 동작된 시간으로 자동적으로 저장됩니다. 기본형식 - YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD,YYMMDD TIME 시간형(-838:59:59 ~ 838:59:59) 기본형식 - HH:MM:SS YEAR 년도형(1901 ~ 2155, 0000) CHAR 고정폭 문자열, (B) - (1~255) B 만큼 오른쪽으로 공백 채워 저장 출력 시 공백은 출력안됨, [BINARY] - 검색 시 대소문자 구분 VARCHAR 가변폭 문자열, (L) - (1 ~ 255) 문자열 공백이 제거된 후 저장, [BINARY] - 검색 시 대소문자 구분 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개 이상을 얻을 수 있습니다. ---------------------------------------------------------------------------------------------------------------------
9.4 접속 하기
./mysql -h 호스트명 -u 유저 -p ("mysql>" 프롬프트가 나타나고 쿼리를 실행하면 됩니다.) 디폴트 인스톨을 했다면 "/usr/local/mysql/bin" 디렉토리에서 접속 명령을 실행합니다. 물론 -p 옵션은 유저에 해당하는 비밀 번호입니다. 위 명령을 실행하고 엔터를 치면 passw 입력 란이 뜨고 거기에 passw를 입력하면 됩니다.
9.5 접속 끊기
"mysql>"에서 "quit" 또는 " ctrl + d "를 누르면 됩니다. 여기서 "quit" 명령은 " ; " 없이 실행합니다. ("quit" , " use")

9.6 mysql 버전과 지금 날짜 알아보기
mysql> select version( ), current_date( );

위 그림에서 1 row는 하나의 쿼리 결과를 말하며 (0.03 sec)는 쿼리 시간을 말합니다.

위 그림에서 각 명령의 연결은 " , "로 하며 select 실행 때 명령의 마지막을 " ; "로 표시합니다. " ; " 이 없을 경우 위와 같이 명령을 계속 입력하게끔 합니다.
9.7 데이터베이스 만들기(database와 table 만들기)
그럼 이제 직접 database를 만들고 여러 가지 사용하는 방법을 알아보겠습니다. 먼저 만들기 전에 기본적으로 만들어진 database를 확인해 봅니다.
데이터베이스 보기
mysql>show databases ;

(해당 데이터베이스의 테이블을 확인하려면 "show tables;" 명령으로 확인 가능합니다.) 위 그림을 보면 현재 database 항목이 여러 개 나오는 것을 볼 수 있는데 디폴트 값은"mysql" 과 "test" 값만이 나올 것입니다. 사용자에 따라 다르게 나올 수도 있습니다. "mysql" db - 사용자 접근권한 정보를 가지고 있습니다. "test" db - 말 그대로 test를 해볼 수 있는 db 입니다. (지금부터 하는 모든 명령은 root 계정으로 실행합니다. 뒷 부분에 계정의 설정과 권한 등을 설명 하겠습니다.)
database 선택해서 사용하기
mysql>use database명; test를 선택하고 실행하면 test database를 선택하고 changed 되는 것을 볼 수 있습니다.
특정 database로 바로 접속하기
"./mysql -h 호스트명 -u 유저명 -p 데이터베이스명" 이제 database를 만들어 보겠습니다. 일단 만들기 전에 중요한 부분은 설계를 해봐야 한다는 것입니다. 이 데이터베이스를 어디에 사용할 것이며 어떤 항목들을 넣어야 하나 여러 가지를 시험한 후 작성하는게 안전합니다. 물론 만들고 난 후 수정할 수도 있습니다. 만들 database명은 "work"로 임의로 정했습니다. 이 데이터베이스의 역할은 어느 누가 맡은 일을 몇번 했나 알아보는 간단한 database입니다.
데이터베이스 만들기
mysql>create database work ;

"show" 명령으로 확인하면 work가 만들어진 것을 볼 수 있습니다.

work 데이터베이스의 사용을 위해 use 명령을 실행하고 다음 테이블을 확인합니다. 물론 새로 만든 데이터베이스이기 때문에 테이블은 비었다고 나옵니다. (자! 그럼 table를 만들어 보겠습니다. 다른 방법도 있지만 여기선 직접하는 방법을 택했습니다. 다른 방법은 txt 파일을 만들어 파일을 실행하는 방법입니다. table명은 "works"로 하겠습니다.)
테이블 만들기
mysql>create table 테이블명 ( 열이름 자료형, 열이름 자료형, ... ) ;

테이블을 만들 때의 자료형은 앞 부분의 표를 확인해 보기 바랍니다. 자료형의 형태는 alter table를 사용해서 바꾸어줄 수 있습니다. 그럼 지금까지 만든 테이블의 자료형과 열의 이름을 확인하는 방법을 알아보겠습니다.
테이블 자료형 알아 보기
mysql>describe 테이블명 ;

(여기서 name은 이름, hab는 취미, own은 담당, sex는 성 , work는 마지막 작업일, no는 작업할 횟수로 표현했습니다.)
9.8 테이블에 데이터 입력하기
이제 테이블에 데이터를 입력할 차례입니다. 이것 또한 직접 하나씩 입력하는 방법과 파일로 한꺼번에 입력하는 방법이 있습니다.
테이블에 데이터 입력하기(직접)
mysql>insert into 테이블명 values(‘자료명’ , ‘ ..’ , ‘..’) ; 이것은 해당 테이블을 새롭게 생성했을 경우 처음 입력할 때 주로 사용 합니다. 자료의 입력 순서는 각 열에 해당하는 인자 순으로 나열하면 되고, 만약 해당 열에 자료를 넣지 않으려면 "null" 을 사용합니다.
테이블에 데이터 입력하기(파일)
mysql>load data local infile "파일명" into table 테이블명 ; 모든 자료 입력은 테이블 열의 이름순으로 하면 됩니다. 그리고 중요한 것은 열과 열 사이는 tab 키로 해야 하는 것입니다. 어떠한 에디터를 사용하건 확장자나 이름은 중요하지 않습니다. 또, 빈 공간이 없이 입력을 해야 합니다. 열의 항목을 비워 두려면 " /n "을 사용하면 됩니다.

위 파일을 보면 공백이 없는 것이 확인 될 것입니다. 이 파일은 "works_table.sql"로 만들었고 2) 번의 방법으로 해당 테이블에 입력했습니다.

위 그림에서 해당 파일의 내용을 테이블에 입력하고 테이블 내용을 다시 확인했습니다.
9.9 테이블에서 정보 검색하기
select문을 사용해서 다양한 방법으로 검색을 할 수 있습니다.
기본 형식
mysql>select 검색명 from 테이블명 where 검색조건; 검색명은 여러 개 나열할 수도 있습니다. 가령 name,work, … 이런 식으로 ","를 사용합니다. "*"를 사용해서 전부를 검색할 수도 있습니다. 그리고 검색조건은 사용하지 않아도 무관 합니다. 그럼 where의 여러 가지 형태를 보기로 하겠습니다.
where 검색 조건
mysql>select 검색명 from 테이블명 where 검색조건(and , or, like , regexp) (다른 부분은 뒷 부분 주요함수 부분에서 다루겠습니다.)
where and 사용하기
mysql>select * from works where (no = "4" and sex = "f"); and일 경우 (둘 다 참이어야 합니다.)

위 그림은 여자 중에 일을 4번 한 사람을 찾는 것입니다. mysql>select * from works where (own = "청소" and hab = "잠자기");

where ( own = "청소" and hab = "잠자기" ) 이것은 맡은 일이 청소이면서 취미가 잠자기인 사람을 찾는 것입니다. 여기까지는 검색명을 "*"로 사용했기 때문에 열 전부를 보여 주었습니다. 특정한 열만 보려면 그 열의 이름을 적어주면 됩니다.
where or 사용 하기
mysql>select * from works where (own = "청소" or hab = "농구"); or일 경우는 (둘 중 적어도 하나는 참이어야 합니다)

그리고 위 방법 말고도 and와 or을 같이 사용하는 방법과 한 개 이상을 사용하는 방법 여러 가지가 있습니다.
where and, or 사용하기
mysql>select * from works where (sex = "m" and work >= "2000-01-20") or (sex= "m" and hab= "잠자기");

그림을 보면 "where( 문장 and 문장 ) or ( 문장 and 문장 )" 사용한걸 볼 수 있습니다. 자, 그럼 이제 특정한 문자의 패턴 일치를 비교해서 검사하는 방법을 살펴보겠습니다. 두 가지 방법이 있는데 like와 regexp 입니다. 각각의 패턴을 검사하는 방식을 살펴보겠습니다.
where like 사용하기
mysql>select * from work where 열명 like "찾을문자%", "%찾을문자", "%찾을문자%", "____" ; 여기서 like 다음 나오는 형식은 차례로 찾을 문자로 시작하는 단어, 찾을 문자로 끝나는 단어, 찾을 문자를 중간에 포함한 단어, 4개로 이루어진 문자 식으로 해석하면 됩니다. 이 명령은 주로 게시판의 검색에 사용하면 편합니다. 뒤에 게시판 구현에서 잘 살펴 보기 바랍니다.
where regexp 사용하기
mysql>select * from work where 열명 regexp "^[jJ]" , "^.{5}" ; regexp 형식을 보면 좀 생소한 기호가 있을 것입니다. 이 기호는 이 표현식(정규 표현식)에 사용하는 몇가지 기호입니다. 그리고, regexp 표현은 대소문자를 가리기 때문에 검색 조건을 입력할 때 주의를 요합니다. 위 형식은 차례로 문자 처음이 소문자 j 대문자 J로 시작하는 조건을 검색, 5개의 문자로 이루어진 단어 검색을 의미합니다. Regexp 기호 . - 문자 하나를 나타냅니다. * - 앞에 나온 문자의 0개 이상 반복합니다. ^ - 문자열의 처음을 나타냅니다. $ - 문자열의 끝을 나타냅니다. [,] - 괄호 안의 문자열 일치를 확인합니다. {,} - 반복을 나타냅니다.

위 그림은 works 테이블에서 필드가 name인 항목 중 알파벳 b로 시작하는 사람을 찾아 줍니다.
order by 사용하기
mysql>select 열명 from 테이블명 order by 열명; order by는 인자 순으로 열명에 해당하는 자료를 정렬해 주는 명령입니다. 자료를 순서대로 보기위한 좋은 방법입니다. 게시판을 만들 경우 이 명령을 꼭 한번은 사용해야 할 것입니다.

위 그림을 보면, work 순으로 차례로 정렬한 모습을 볼 수 있습니다. 제일 처음 일을 그만 둔 사람을 위 명령으로 쉽게 찾을 수 있습니다.
order by DESC 사용하기
mysql>select 열명 from 테이블명 order by 열명 desc ; desc 옵션을 사용하면 해당 열명을 역순으로 정렬해 줍니다. 뒤 경매 게시판에서도 볼 수 있지만 이 옵션은 유용하게 쓰입니다. 게시판의 경우 사람들은 순서대로 보다 역순으로 봐야지만 제일 최근 자료를 볼수 있는 것입니다. 이 명령은 제일 최근까지 일했던 사람을 역순으로 제일 위에 오게 출력해 줍니다. mysql의 경우 이 명령이 순차적인 것보다 조금 느리게 출력될 경우도 있습니다. 물론 자료가 많을 경우입니다. 하지만 한번 실행하고 난 뒤는 거의 속도 차이가 없다고 보면 됩니다. 여기서 주의 할 부분은 desc 인자 앞의 열명만 적용이 된다는 것입니다. 그 앞에 다른 열명을 적어 줘도 역순으로 정렬되지 않습니다.

위에서 볼 수 있듯이 desc 인자의 역할은 되지 않고 있습니다.
레코드 수 보기
mysql>select count(*) from work ; 총 레코드 수를 계산해 줍니다.

위 명령과 group by 명령을 같이 사용할 경우 더 강력한 기능을 합니다.
group by 사용하기
mysql>select 열명,count(*) from 테이블명 group by 열명 ; 해당 그룹의 레코드에 관해 숫자를 파악해서 출력해주는 역할을 합니다. (count(*)와 같이 사용할 경우)

출력의 결과를 보면 일의 종류에 따라 배치된 사람의 수를 파악할 수 있습니다.

위 그림을 보면 jun이 물주기 역할을 두개나 받았다는 걸 알 수 있습니다. 또, 총 맡은 일을 볼 수도 있습니다. 이렇게 여러 가지를 그룹으로 출력해 주는 명령은 유용하게 쓰일 수 있습니다.

9.10 테이블 지우기와 수정
만들어진 테이블을 지우거나 다시 수정하는 방법은 몇 가지가 있습니다. 게시판의 사용 시에 이 부분은 꼭 들어갑니다. 데이터의 삭제와 추가 등에 사용됩니다.
테이블 지우기
mysql>delete from 테이블명 ; 해당 테이블을 삭제합니다.
테이블에 필드(열) 추가하기
mysql>alter table 테이블명 add 열명 자료형태 ; 테이블에 다른 열을 추가시킵니다. 만약 게시판의 admin 툴을 만든다면 이 방법을 적용할 수 있습니다. 지금까지 말한 모든 설명들은 데이터베이스 admin 툴을 만들 때 사용하는 중요한 기본 질의들입니다.

위 그림에서 tel 필드가 새롭게 추가된 것을 볼 수 있습니다.
테이블의 특정 필드(열) 삭제하기
mysql>alter table 테이블명 drop 열명 ; 해당 테이블의 특정 필드(열)를 삭제합니다.

위 그림에서 tel 항목이 삭제된 것을 볼 수 있습니다.
테이블 특정 레코드 삭제하기
mysql>delete from 테이블명 where 열명 = ‘레코드명’(데이터명); 해당 테이블에서 특정한 레코드만 삭제합니다.

위 그림에서 name이 glee라는 레코드만 지워진 것을 볼 수 있습니다.
테이블 특정 레코드 수정하기
mysql>update 테이블명 set 열명= ‘레코드명’(데이터명) where 열명= ‘레코드명’; 이 방법은 해당 테이블의 특정 레코드의 내용만 수정할 때 사용합니다.

위 그림에서 name가 bian인 레코드 중 hab가 "?" 에서 컴고치기로 고쳐진 것을 볼 수 있습니다.
9.11 mysql 접근과 권한설정
이제 mysql에 대한 접근하는 방법은 익숙하리라 생각합니다. 그러면 이제 각 데이터베이스 별 접근과 권한에 관한 설정들을 알아 보겠습니다. 뒤의 게시판 등의 소스에는 그냥 root 권한으로 설정했지만 여러분들이 이 부분을 수정하고 여러 가지 다른 방법으로 데이터베이스 접근을 하도록 만들 수 있습니다.
mysql 권한을 설정하기 전에
먼저 mysql 클라이언트에 접속을 합니다. 그리고 디폴트로 설치된 mysql의 데이터베이스 항목을 살펴 보겠습니다.

위 그림은 아직 데이터베이스를 추가로 만들지 않은 여러분들과는 조금 다릅니다. 디폴트는 mysql과 test 데이터베이스만 있습니다. 그럼 mysql의 전반적인 설정들이 들어 있는 mysql 데이터베이스를 선택하겠습니다.

위 그림에서 나열된 테이블 중 db와 user을 살펴 보겠습니다. db 테이블 - 각 데이터베이스의 이름과 호스트, 사용자 등의 권한을 설정합니다. user 테이블 - mysql을 사용할 수 있는 유저와 해당 유저의 권한을 설정합니다.

위 그림은 db 테이블의 속성들입니다. 이 테이블에 해당 유저들이 사용할 데이터베이스를 설정하고 권한을 줍니다.
데이터베이스 사용 user 등록하기
여기서는 test 데이터베이스의 사용자(cry)를 등록해 보겠습니다.

위 그림에서 볼 수 있듯이 db 테이블은 데이터베이스의 소유자를 등록하는 곳입니다. (Test 데이터베이스의 소유자는 지금 아무도 설정되지 않았습니다.) 그리고 user 테이블은 데이터베이스를 사용하는 user을 등록하는 곳입니다. 즉, db 테이블에 소유자가 등록되어 있더라도 user 테이블에 그 소유자(사용자)가 존재하지 않으면 안됩니다. 처음 mysql의 설정에서 root를 설정했습니다. 이 root 계정은 뭐든지 다 할 수 있는 계정이므로 데이터베이스별로 관리를 할 수 있고 모든 권한이 없는 해당 데이터베이스만 관리 하는 계정이 필요로 한 것입니다. db 테이블의 속성을 보면 여러 가지 데이터베이스에서 질의하는 속성 들을 볼 수 있을 것입니다. 그 중 사용하게 할 질의 들은 ‘y’ 그렇지 못하게 할 경우는 ‘n’ 등을 줌으로 해서 데이터베이스 관리자의 권한을 정할 수 있습니다. 해당 질의 권한을 설정하는 부분은 총 10개 항목이 있습니다. 앞에서 insert 문과 update 문을 보았기 때문에 테이블을 다루는 방법은 이제 습득했을 줄 압니다. 여기서는 기존에 존재하는 test 테이블을 수정하는 것이기 때문에 update문을 사용 했습니다. 만약 새로운 데이터베이스를 db 테이블에 추가할 경우는 당연히 insert 문을 이용하면 되겠습니다.

insert into 문을 이용한 새로운 데이터베이스 등록 역시 다음과 같은 식으로 해주면 됩니다. insert into db values("해당 열" , "해당 열" …….); Update 방법은 기존에 있던 행을 말 그대로 업데이트 한 것 입니다. 필자의 경우 update가 조금 헛갈리는 경우가 있어 여러분들도 혹 그런 분이 있을 거 같아 insert 대신 update문을 사용해 봤습니다. 그럼, 해당 항목들이 업데이트 되었는지를 select 문을 이용해 확인해 보겠습니다. select Host,Db, User from db ;

Mysql 사용자 등록하기
user 테이블의(mysql 데이터베이스에서) test 데이터베이스를 사용할 cry 사용자를 등록해 보겠습니다. 우선 user 테이블의 속성들을 확인합니다. user 테이블 역시 해당 질의에 관한 권한이 있습니다. 총 14개 항목이 존재합니다. 여기서는 insert into 문을 사용해서 추가를 하겠습니다.

위 그림에서 유저를 등록하기 전에 상기 할 부분은 각각의 질의에 관한 권한 설정을 명확히 정한 다음 등록하는 것입니다. cry라는 사용자가 test 데이터베이스 만을 관리하는 것이라면 질의 모두 "n"으로 해야 될 것입니다. 하지만 cry가 다른 데이터베이스도 관리하길 원한다면 질의 중 필요한 항목만 "y"로 선택하면 됩니다. 그럼 다음을 입력해서 user 테이블의 등록 상태를 확인해 보도록 하겠습니다. select Host, User, Password from user ;

위 그림에서 Password 항목을 보면 알 수 없는 숫자와 알파벳으로 되어진 것을 볼 수 있습니다. 이것은 mysql이 passwd을 저장할 때 암호화해서 저장하기 때문입니다. 그런 이유로 insert into 문으로 암호 열을 입력할 때는 password() 함수를 사용해서 입력해야 합니다. insert into user (Host,User,Password) values("192.168.0.1", "cry", password("cry98")); 이렇게 실행하면 됩니다.(passwd 부분은 여러분들이 정하는 곳입니다.) 여기서는 Host, User, Password 항목만 추가했습니다. 그것은 나머지 열의 질의 권한 항목은 디폴트가 "n"이기 때문에 입력하지 않아도 됩니다.

위 그림에서 192.168.0.1의 Host와 cry 유저 그리고 암호가 등록된걸 확인할 수 있습니다. 이 설정들은 mysql을 재시동하고 다시 접속할 때부터 적용됩니다.
mysql 사용자 테스트
cry 계정으로 192.168.0.1 호스트로 접속해 보겠습니다.

물론 앞에서 설정한 "cry98" 암호로 접속해야 됩니다.

위 그림에서 cry 계정의 처음 권한 설정에 의해 test 데이터베이스만 사용 가능함을 볼 수 있습니다. 여기까지 대략적인 mysql의 사용자 권한 설정과 추가에 대해 살펴 보았습니다. 이러한 방법들을 이용해서 나중에 게시판에 적용하면 많은 도움이 될 것입니다. 참고로, 뒷 장의 게시판 부분과 나머지 소스들의 mysql 연동은 root 권한으로 설정되어 있습니다. 하지만 여러분들이 원하는 계정을 추가한 다음 입 맛에 맞게 얼마든지 수정할 수 있습니다.
9.12 mysql 데이터의 복구와 backup
데이터의 백업은 정말로 중요한 일 중에 하나입니다. 필자는 컴퓨터를 통째로 날린 적이 있기 때문에 더욱 백업에 열을 올립니다. Mysql 뿐아니라 php 역시 tar로 반드시 백업하는 습관을 가져야 합니다. 요즘의 에디터들은 대부분 작업하다가 종료한 파일에 대해 자동적으로 백업 파일을 생성해 저장합니다. 그 덕분에 필자가 이렇게 소스를 여러분들에게 보여 줄 수 있었던 것 같습니다. 하지만 방심은 금물이듯 하루라도 백업하지 않으면 손가락이 마비될 정도로 백업해도 후회는 안 할 것입니다. Mysql의 복구는 /usr/local/mysql/bin 디렉토리에 존재하는 isamchk를 이용해서 합니다. isamchk의 경우 상당히 세밀한 방법으로 데이터베이스의 파손 여부를 점검하고 복구합니다.
isamchk 사용하기
#isamchk 옵션 테이블명 Mysql의 경우 대부분 isamchk를 돌릴 정도의 에러 발생은 적은 편입니다. 하지만, 기계는 얼마든지 예고없이 정지하거나 말썽 일으킬 소지를 가지고 있기 때문에 꼭 필요한 유틸리티입니다. isamchk 옵션 #isamchk --help로 다양한 옵션을 확인하기 바랍니다. #isamchk 테이블명 - 해당 테이블의 에러를 점검합니다. 상당한 부분까지 에러를 점검해 줍니다. #isamchk -e 테이블명 - 해당 테이블의 모든 데이터를 점검해 줍니다. -i 옵션을 추가할경우 통계도 보여 줍니다. #isamchk -r -q 테이블명 - 해당 테이블의 에러를 쉽고 빠르게 복구해 줍니다. 이 같이 isamchk를 사용함으로써 안전하게 복구할 수 있습니다. 더 상세한 방법은 --help를 사용해서 확인하기 바랍니다.
mysql의 백업하기
#mysqldump -h 호스트명 -u 유저명 -p 데이터베이스명 > 백업되어질 파일명 Mysql 백업의 경우 /usr/local/mysql/bin 디렉토리에 존재하는 mysqldump를 이용하는 방법입니다.

위의 test 데이터베이스를 test_bak.sql 파일로 저장했습니다. 물론 저장된 파일은 /bin 디렉토리에 생성됩니다.
저장된 파일 복구하기
#mysql -h 호스트명 -u 유저명 -p 데이터베이스명 < 백업된 파일명 해당 백업 파일을 다시 원상 복구 시킵니다. 참고로 mysql의 데이터베이스를 삭제하는 방법은 다음과 같습니다. drop database 데이터베이스 명; 간혹 테이블 지우는 명령은 아는데 데이터베이스 지우는 명령을 모르는 분들이 많더군요. 다음 장에서는 Mysql 함수를 설명하겠습니다.
10. MYSQL 주요함수
여기서는 mysql에 사용되는 중요한 몇 가지 기본 함수들을 소개하겠습니다. 대부분의 함수가 php와 연관하여 비슷한 것들이 많이 있습니다. php에서 만약 이 함수를 사용하려면 mysql query 문을 이용하는 방법도 있습니다. (여기서의 설명은 직접 local에서 접속해서 하는 것보다 클라이언트에서 telnet으로 접속해서 사용한 예를 더 많이 들었습니다.)
10.1 연산자
연산자의 경우 일반적으로 사용하는 연산자들을 사용합니다. "+" , "-" , "*" , "/" 등 입니다. 그럼 각각의 수행 결과를 확인 하겠습니다.

위에서 "( )" 사용없이 연산을 했기 때문에 우선 순위가 위인 연산자부터 연산이 이루어 졌습니다. 만약, (1+4)*4로 했다면 결과는 20이 될 것입니다.

위와 다르게 (4-2) 가 (4-4)일 경우 "null" 을 출력합니다.
10.2 비교 연산자
비교 연산자는 결과가 참(1) 과 거짓(0)으로 결과를 출력합니다. 그리고 비교 연산자의 경우 몇 가지 규칙이 있습니다. ~ 인수가 모두 문자열이면 문자열로 비교됩니다. ~ 인수가 모두 정수면 정수로 비교됩니다. ~ 인수가 모두 "null" 이면 연산의 결과도 "null"이 됩니다. ~ 한쪽의 인수가 "timestamp" 이면 나머지도 같이 변환되어 비교됩니다. ~ 한쪽의 인수가 "datetime" 이면 나머지도 같이 변환되어 비교됩니다. ~ 나머지의 경우는 부동소수점 실수로 비교됩니다. 기호로는 "=" - 같다 "!= ,<>" - 같지 않다 "<=" - 작거나 같다 "<" - 작다 ">=" - 크거나 같다 ">" - 크다 "<=>" - 둘 중 한쪽이 "null" 일 경우 0을 출력 인자 between (최소값) and (최대값) - 인자가 최소값과 최대값 사이에 존재 하면 "1"을 그렇지 않을 경우 "0"을 출력합니다. 인자 in (값, 값, …) - 인자가 ( ) 안에 존재하면 "1"을 그렇지 않으면 "0"을 출력합니다.


위 그림은 결과가 거짓 이므로 "0"을 출력 합니다.

그림. 13-5의 결과는 참이므로 "1"을 리턴합니다.

"jun" 항목 안에 없기 때문에 거짓이므로 "0"을 리턴합니다.
10.3 날짜와 시간 관련 함수
날짜와 시간 관련 함수는 여러모로 사용하는 곳이 많은 부분입니다. 대부분의 표현에서 날짜와 시간은 꼭 들어가기 때문에 이 부분을 먼저 다루도록 하겠습니다.
MONTHNAME("날짜") - 해당하는 날짜의 월을 영어로 리턴합니다.

QUARTER("날짜") - 해당하는 날짜의 분기를 리턴해 줍니다.

YEAR("날짜") - 해당 날짜의 년도를 리턴해 줍니다.

HOUR("시간") - 해당하는 시간을 리턴합니다.

MINUTE("시간") - 해당 시간의 분을 리턴합니다.

SECOND("시간") - 해당 시간의 초를 리턴합니다.

PERIOD_ADD(날짜, N) - 해당하는 날짜에의 개월에 "N"개월을 더 합니다. (날짜는 YYMM, YYYYMM형식으로 주어지면 YYYYMM 형식으로 리턴합니다.)

CURDARE( ) - 오늘 날짜를 YYYY-MM-DD 또는 YYYYMMDD 형식으로 리턴해 줍니다. 함수가 문자열 또는 숫자로 사용됨에 따라 리턴 값은 달라 집니다.


CURTIME( ) - 현재 시간을 HH:MM:SS 또는 HHMMSS 형식으로 리턴해 줍니다. 이 함수 역시 함수가 문자열 또는 숫자로 사용됨에 따라 리턴 값이 달라 집니다.


NOW( ) - 현재의 날짜와 시간을 리턴합니다.


UNIX_TIMESTAMP( ) - 유닉스 타임스탬프를 리턴합니다. 날짜 인자가 있을 경우 해당 날짜의 유닉스 타임스탬프를 리턴하고, 인자가 없을 경우 현재의 유닉스 타임스탬프를 리턴합니다.(초 단위로 나타냅니다.)


FROM_UNIXTIME (유닉스 타임스탬프) - 유닉스 타임스탬프 날짜에서 일반 형식의 날짜와 시간으로 리턴합니다. 이 함수를 이용해서 원하는 데이터 형태로도 출력이 가능합니다. (DATE_FORMAT( ) 함수는 날짜와 시간을 여러 가지 형태로 표현 가능하게 합니다. 다음 함수를 참고 하세요.)



DATE_FORMAT(날짜, 형태) - 형태의 종류에 맞게 여러 가지 양식으로 날짜와 시간을 리턴해 줍니다. 특히 이 함수는 자주 사용 되므로 관심있게 보기 바랍니다. 형태의 종류는…. %M - 월 이름을 영어로 리턴합니다.(January) %D - 접미사를 사용해 영어로 일을 리턴합니다.(1st , 2nd ..) %W - 요일을 영어로 리턴합니다. (Monday) %y - 2자리 연도를 리턴합니다. %m - 월을 숫자로 리턴합니다.(01 , 02 , 03) %d - 일을 숫자로 리턴합니다. (00 , 01 ,02 ) %a - 요일을 짧은 영어로 리턴합니다. (Mon) %e - 일을 숫자로 리턴합니다.(0 , 1 , 2) %c - 월을 숫자로 리턴합니다. (1 , 2 , 3) %j - 한해의 몇 번째 요일인지 리턴합니다. (001 ~ 366) %b - 월을 짧은 영어로 리턴합니다. (Jan) %H - 24시간 형식의 시간을 리턴합니다. (00 ~ 23 ) %h - 12시간 형식의 시간을 리턴합니다. (01 ~ 12) %k - 24시간 형식의 시간을 리턴합니다. (1 ~ 23) %l - 시간을 리턴합니다. (1 ~ 12) %i - 분을 리턴합니다. (00 ~ 59) %T - 시분초의 24시간 형식을 리턴합니다. (hh:mm:ss) %r - 시분초의 12시간 형식을 리턴합니다. (hh:mm:ss) %s - 초를 리턴합니다. (00 ~ 59) %p - AM , PM을 리턴합니다. %w - 일주일 중 몇 번째 요일인지 리턴합니다.(0 - 일요일) %U - 한해 중 몇 번째 주인지 리턴합니다.(일요일이 시작) %u - 한해 중 몇 번째 주인지 리턴합니다.(월요일이 시작) 그럼 여러 가지 형태의 데이터 출력을 보겠습니다.


TO_DAYS(날짜) - 해당 날짜를 "0000" 부터 일수로 리턴해 줍니다.


FROM_DAYS(일수) - 해당 일수로부터 날짜를 리턴해 줍니다.


DATE_ADD(날짜,INTERVAL,추가분) - 해당 날짜와 시간에 특정 날짜와 시간을 더해줍니다.

위 그림을 보면 하루가 추가된 것을 볼 수 있습니다. 여기에서 추가분의 종류에 대해 알아 보고 계속 예를 보여 드리겠습니다. second - 초를 추가 합니다(interval 1 second) minute - 분을 추가 합니다.(interval 1 minute) hour - 시간을 추가 합니다.(interval 1 hour) day - 일을 추가 합니다.(interval 1 day) month - 달을 추가 합니다. .(interval 1 month) year - 년을 추가 합니다. .(interval 1 year) minute_second - 분과 초를 추가 합니다. (interval "1:1" minute_second) hour_minute - 시간과 분을 추가 합니다. (interval "1:1" hour_minute) day_hour - 일과 시간을 추가 합니다. (interval "1 1" day_hour) year_month - 년과 월을 추가 합니다. (interval "1-1" year_month) hour_second - 시간과 분, 초를 추가 합니다. (interval "1:1:1" hour_second) day_minute - 일과 시간, 분을 추가 합니다.(interval "1 1:1" day_minute) day_second - 일과 시간, 분, 초를 추가 합니다.(interval "1 1:1:1" day_second)


만약 날짜와 시간을 빼기를 원한다면 " - "를 사용하면 됩니다. 또 다른 방법은 DATE_SUB( ) 함수를 사용하는 것입니다.


PERIOD_DIFF(날짜1, 날짜2) - 날짜1 과 날짜2 사이의 개월 수를 리턴합니다.

10.4 문자열 관련 함수
php 스크립트 프로그래밍을 하면서 php에서 지원하는 함수를 이용한 방법으로 많은 문자열 처리하게 될 것입니다. Mysql 역시 문자열을 처리하는 여러 가지 함수가 있습니다. 여러분들은 데이터를 데이터베이스에 저장할 때 php 함수에서 지원하는 함수를 사용할 수도 있지만 여기서 설명할 mysql 함수를 사용해도 됩니다. (문자열 함수는 결과 값이 정의된 길이보다 클 경우 NULL을 리턴합니다.)
HEX(n) - 해당 10진수를 16진수로 리턴해 줍니다. (NULL은 NULL로 리턴)

OCT(n) - 해당 10진수를 8진수로 리턴해 줍니다.(NULL -> NULL로 리턴)

BIN(n) - 해당 10진수를 2진수로 리턴합니다. (NULL -> NULL로 리턴)

CONV(n , a , b) - 해당 숫자를 a 형식의 진수에서 b 형식의 진수로 변환해서 리턴합니다. 앞에서 설명한 각 진수별 변환 방법의 기능을 다 가지고 있는 함수입니다. (인자중 NULL이 있으면 NULL을 리턴합니다. 2 ~36진까지 가능)


ASCII(문자열) - 해당 문자열의 처음 위치의 ASCII 코드를 리턴합니다.(NULL -> NULL로 리턴 합니다.)

FIELD(Nstring , string , …) - Nstring에 해당하는 문자열이 몇 번째 인지 리턴합니다.

LOWER(문자열) - 해당 문자열을 소문자로 변환해서 리턴합니다.(컴파일 시 선택한 문자 설정)

UPPER(문자열) - 해당 문자열을 대문자로 변환해서 리턴합니다. (컴파일 시 선택한 문자 설정)

LOAD_FILE(파일명) - 64kb 보다 작은 내용의 파일을 읽어 들여 문자열로 리턴합니다. (64kb보다 클 경우 NULL을 리턴합니다.)

SPACE(n) - 해당 인자의 수 만큼 공백을 리턴합니다.

REVERSE(문자열) - 해당 문자열의 순서를 바꾸어 리턴합니다.

INSERT(문자열, a , b , 문자열1) - 해당 문자열을 a 위치부터 b 크기 만큼 문자열1을 넣어 리턴합니다.

SUBSTRING_INDEX(문자열, a , count ) - 해당 문자열을 a로 구분해서 배열로 만들고 count 수만큼 리턴해 줍니다. 오른쪽부터 출력하길 원하면 음수를 적으면 됩니다.

REPEAT(문자열 , c ) - 해당 문자열을 c 만큼 반복해서 리턴합니다.

LTRIM(문자열) - 해당 문자열의 왼쪽 공백을 제거합니다.

RTRIM(문자열) - 해당 문자열의 오른쪽 공백을 제거하고 리턴합니다.

TRIM(옵션 a FROM 문자열) - 주어진 옵션에 따라 a 문자를 제거하고 리턴합니다. 옵션에는 LEADING | TRAILING | BOTH 등이 있으며 각각 앞쪽 공백제거 | 뒤쪽 공백 제거 | 앞뒤 공백 제거입니다.



CONCAT(문자열, 문자열 …..) - 해당 문자열을 이어 줍니다. 이 함수는 php의 " . "을 이용한 문자열 연결 방법과 유사 합니다. (NULL -> NULL로 리턴합니다.)

LEFT(문자열,n) - n 만큼 해당 문자열을 왼쪽부터 리턴합니다.

RIGHT(문자열, n) - n만큼 해당 문자열을 오른쪽부터 리턴합니다.

LOCATE(a , b) - a(문자열)가 b(문자열)에서 처음부터 몇 번째 위치인지 리턴합니다.

LPAD(문자열 , a , b) - 해당 문자열에 a 길이 만큼 b 문자를 왼쪽부터 넣어 리턴합니다.

RPAD(문자열, a , b) - 해당 문자열에 a 길이만큼 b 문자를 오른쪽에 넣어 리턴합니다.

여기까지 문자열 함수의 대부분을 설명했습니다. 몇 가지 빠진 함수들도 있지만 여기 있는 것만으로도 대부분을 표현하기는 충분합니다.
10.5 기타 함수들
mysql의 수학 함수는 여기서 다루지 않도록 하겠습니다. 대부분의 경우 php 함수가 대신 할 수 있기 때문에 구지 mysql 함수를 이용해 수학연산을 할 필요는 없습니다. 하지만 어느 경우든 꼭 사용해야만 할 경우는 mysql 매뉴얼을 보시기 바랍니다. 짧은 영어 실력으로도 충분히 보실 수 있는 매뉴얼이기 때문에 걱정은 필요 없습니다. 그럼, 여기서는 자주 사용되는 나머지 함수들을 설명하겠습니다.
USER() - 현재 mysql에 접속 중인 사용자 이름을 리턴합니다.

VERSION( ) - mysql의 버전을 리턴해 줍니다.

PASSWORD(문자열) - 이 함수는 mysql의 데이터 베이스에 문자열을 암호화 해서 저장해 줍니다. 대부분의 경우 사용자 인증에 이용합니다. 즉, 암호화된 문자열끼리 비교함으로 해서 인증을 하는 것입니다. 뒤에 설명할 admin tool의 사용자 인증 역시 이 방법을 이용했습니다.

이렇게 중요하게 사용되는 몇 가지 함수들을 봤습니다. 대부분의 프로그램과 스크립트들은 거의 비슷한 양식의 함수를 가지고 있습니다. 그래서 다른 곳에서 비슷한 함수를 보면 그 기능이 무엇인지는 어느정도 예상할 수 있습니다. 꼭 필요한 것을 확실히 이해하는 것도 중요합니다. 여러 가지를 두서 없이 배우면 혼란스러워서 그만큼 손해 보는 부분도 있습니다. 아무쪼록 이 책에 나열된 함수에만 국한되지 말기를 바랍니다. 다음 장에서는 소스 부분의 각 화면을 설명하겠습니다. 참고. 11장은 원래 앞으로 만들어볼 사이트의 각 화면을 설명한 부분 입니다. 본 내용과 조금 다를 수 있으며 만들어볼 소스는 지금은 아주 초보적인 것이며 쿠키와 세션 사용등에서 잘못된 점이 있습니다. 이 부분은 공부해 보기 바랍니다. 정말로 php프로그래밍을 하려면 모든 html 태그는 얼마 보여지지 않습니다. 그것은 <td> 태크 과 여타 태그 하나 까지 언어로 만들어 버리기 때문입니다. 하지만 여기서 소개하는 소스는 정말 허접한 것이며 처음 접하는 이에게는 이보다 좋은 소스는 없을 듯 합니다. 모든게 html태그며 부분 부분 언어가 들어 갑니다. 이 모든걸 이해 했다면 이제 여러분들은 class 방식으로 모든걸 프로그래밍 해보기 바랍니다. 그리고 진정한 언어(C,C++,java)를 시작하세요…
11. 사이트 둘러보기
이 장에서는 여러분들이 만들어볼 스크립트의 형태를 그림으로 확인 할 수 있게 했습니다. 먼저 사용자의 로그인과 로그아웃 , 각 게시판의 정보를 보여 주는 사이트 메인 화면과 간단한 파일을 공유하는 자료실 그리고, 개인의 물건을 사고 파는 경매 게시판, 또 다양한 상품을 진열해서 구입 할 수 있는 쇼핑 몰 마지막으로 사이트 전반에 걸친 관리를 하는 admin영역 등을 살펴 보겠습니다.
11.1 메인 화면
사이트의 메인 화면은 대부분의 상업적인 사이트의 경우 광고와 간단한 뉴스와 정보를 제공 합니다. 우리가 만들어볼 메인 화면은 사용자의 로그인과 로그아웃 , 각 게시판의 TOP글 등을 출력 합니다. 이것은 다소 상업적인 사이트보다는 미약 하지만 조금의 수정만으로도 충분히 상업적인 사이트로 변모할 수 있습니다.
메인화면
사이트에 처음 접속 했을 때 화면 입니다. 먼저 등록된 아이디나 guest로 로그인이 가능 하고, 로그인 했을 경우 화면에 로그인 ID를 출력합니다. 로그인을 안했을 경우나 guest로 로그인 했을 경우는 회원가입 링크 를 생성하며 등록된 ID , guest 모두 채팅은 가능합니다. 다음 차례로 자료실 , 경매 , 쇼핑 몰 의 링크를 생성 하고, 자료실과 경매의 TOP 글을 출력 합니다. 메인 화면의 마지막 부분은 admin영역에서 생성한 자료실과 경매 게시판의 나머지를 모두 출력 합니다.

회원 가입
메인 화면에서 회원 가입을 클릭 하면 보여주는 화면 입니다.

채팅 모드
등록된 ID나 guest로 로그인 했을 경우 채팅을 하는 모드 입니다. 이 채팅 모드는 간단히 해당 사이트에 접속한 사람 끼리 글을 주고 받을 수 있는 기능 이며 메타 테그를 이용해 파일을 일정 주기로 읽어 들이는 방법을 택했습니다. 이것은 사람이 많을 경우 부하가 생기는 단점이 있습니다.

11.2 자료실
자료실은 guest의 경우 자료의 다운만 가능 하며 등록자의 경우 파일의 등록과 다운 모두 가능 합니다. 간단한 파일을 주고 받는기능을 가지며 자료실의 공개를 목적으로 합니다. 자료실 메인 화면은 등록 자료를 게시판 형식으로 보여 주며 자료의 설명을 볼 수 있고, 등록일 , 등록자 , 등록일 , 자료의 삭제 , 자료의 등록 , 자료 응답 글 , 자료의 검색 기능이 있습니다.

자료 설명 보기
특정 자료 제목을 클릭 하면 해당 자료에 대한 설명과 응답 글을 볼 수 있습니다.

응답 글 올리기
특정 자료에 대한 응답 글을 올리는 화면 입니다.

자료 수정 하기
등록된 자료의 파일을 제외한 부분을 수정 합니다.

자료 삭제 하기
등록한 자료를 삭제하는 부분이며 등록자의 패스워드를 입력해야 합니다.

자료 등록하기
자료실에 새로운 자료를 등록 하는 화면 입니다.

11.3 경매 게시판
경매 게시판은 먼저 회원 가입을 한 후 사용이 가능 합니다. 물론 guest로는 화면만 볼 수 있으며 나머지 경매 기능은 사용할 수 없습니다. 등록자인 경우 경매를 등록 하고 해당 경매의 글을 수정 , 삭제 할 수 있습니다. 경매는 마감 날짜에 종료 되며 다시 재개 하기 위해서는 등록자가 날짜를 수정 하면 됩니다. 마감 날짜에 해당 경매가 자동 삭제 되는 기능은 없습니다. 단지 경매의 종료를 알리는 메일이 매도자와 낙찰자에게 배달됩니다. 개선할 부분은 보다 사용자 중심의 메일 전송과 자동 삭제 기능의 추가 입니다.

경매 내용 보기
메인 화면에서 특정 경매 제목을 클릭 하면 보여주는 부분입니다. 경매 등록자의 신상과 입찰 , 경매 수정 , 삭제 , 입찰 삭제 등의 기능이 있습니다.

입찰 하기
해당 경매에 대한 입찰을 하는 기능 입니다. 기본 금액 이하일 경우 입찰을 할 수 가 없고,입찰은 한번만 가능합니다. 만약 다시 입찰을 할 때는 기존의 입찰을 삭제 해야 합니다.

경매 수정 하기
등록한 경매의 내용을 수정 하는 기능 입니다. 이것은 기존의 입찰과 달리 매도자가 임의로 가격을 조정하거나 내용을 수정할 수 있습니다.

경매 지우기
등록한 경매를 삭제 하는 부분 입니다. 여러 가지 이유로 경매 진행을 못할 경우 등록자가 경매를 삭제 할 수 있습니다.

경매 마감 알리기
해당 경매가 설정한 마감 날짜일 경우 경매 게시판 메인 화면에 "마감" 표시를 하며 제목을 클릭했을 경우 보여주는 화면 입니다.

11.4 쇼핑 몰
쇼핑 몰은 사이트의 메인 화면에서 각 상품의 종목을 선택 하면 여러 상품들을 구매 하는 화면을 출력 합니다. 구매자가 선택한 상품은 바구니 항목에 저장 되며 바구니 화면에서는 선택한 물건을 다시 비울 수 있습니다. 바구니에 담은 상품을 주문할 경우 주문서 작성 화면으로 이동하며 주문한 상품을 확인 할 수 있고 다시 주문 취소를 할 수 있습니다.
쇼핑 몰 메인 화면
여러 종목의 상품이 있겠지만 여기서는 가전제품 항목을 보겠습니다.

바구니 보기
구매자가 선택한 상품을 보여주는 항목 입니다. 바구니는 선택한 상품을 보여주고 주문을 할 수 있으며 선택한 상품을 삭제 할 수 있습니다.

주문 하기
바구니의 상품을 주문하는 항목 입니다. 로그인한 ID 세션을 이용해서 구매자의 정보를 출력해 주며 받을 주소와 구매자 이름 , 상품 도착 날짜 , 입금 은행을 입력 하는 항목이 있습니다.

주문서 확인(계산서)
신청한 상품의 항목을 확인 할 수 있습니다.

주문취소
상품 신청을 취소하는 항목 입니다. 위 계산서 항목에서 주문 취소를 선택할 경우 신청한 상품이 모두 삭제 됩니다. 쇼핑 몰의 메인 화면에서 "주문 내역/취소" 항목을 선택할 경우 위 계산서 항목으로 이동되며 주문한 상품이 없을 경우 에러 항목을 출력합니다.
11.5 Admin 영역
자료실 , 경매 , 쇼핑 몰 , 데이터 베이스에 관한 전반적인 항목을 관리하는 부분이며 각 화면에 adimin 영역의 링크가 있습니다. 물론 접속을 위해서는 데이터 베이스에 설정한 호스트 이름 , 계정 , 패스워드를 입력해야 합니다.
admin 로그인 화면

자료실 admin 메인 화면
admin 영역에 접속을 하면 출력 되는 화면 이며 경매 , 데이터 베이스 , 회원 , 쇼핑 몰 admin 영역으로의 링크가 존재 하고 새로운 자료실의 생성 , 기존의 자료실 삭제 등의 기능이 있습니다. 자료실을 삭제할 때는 체크(라디오 버튼)를 한 다음 "Del" 버튼을 클릭 하면됩니다. 하나의 자료실만 삭제 가능 하며 회원 관리 admin의 경우 체크(체크 버튼) 항목을 여러 개 설정 할 수 있습니다.

자료실 만들기
"Creat 자료실" 을 클릭 하면 자료실을 생성할 테이블과 자료실 이름을 입력하는 항목으로 링크 합니다.

경매 게시판 admin 메인 화면
자료실 admin영역과 같으며 각 admin 영역으로의 링크가 존재 합니다.

데이터 베이스 admin 메인 화면
페이지 단위로 Mysql에 존재하는 모든 데이터 베이스를 보여 줍니다. 데이터 베이스 생성 항목이 존재 합니다.

데이터 베이스 새로 만들기
"New"를 클릭하면 새로운 데이터베이스를 생성하기 위해 데이터베이스 이름을 입력하는 화면을 출력합니다.

테이블 항목 �
데이터 베이스 메인 화면에서 해당 데이터 베이스를 클릭 하면 존재하는 테이블을 출력 하며 새로운 테이블 생성 항목과 데이터 베이스 삭제 항목이 존재 합니다.

새로운 테이블 생성
테이블 화면에서 "New" 화면을 클릭하면 새로 생성할 테이블 이름과 필드속성 입력항목이 보여집니다. 필드 속성의 경우 원하는 필드 명과 속성을 나열하면 됩니다.

테이블 속성 보기
테이블 목록 화면에서 특정 테이블 이름을 선택하면 해당 테이블의 필드 정보를 볼 수 있습니다. 해당 테이블의 삭제 , 필드 속성 추가 및 삭제가 가능 합니다. 필드 속성을 삭제 추가 하기 위해서는 테이블 속성 화면 하단의 select 항목(Add ,Del)을 선택 하고 해당 필드를 적어 주면 됩니다.

쇼핑 몰 admin 메인 화면
쇼핑 몰의 admin화면은 전자제품 admin 부분을 보겠습니다. 각 제품의 제목을 클릭 하면 해당 제품에 관련된 정보를 수정 할 수 있습니다. 체크 박스를 이용해 상품을 삭제 할 수 있으며 "Up shop" 를 이용해서 상품을 추가 할 수 있습니다.

상품 수정 하기
상품의 가격, 이름, 이미지, 설명 등을 수정할 수 있으며 이미지를 수정할 경우 체크박스(수정 , 그림수정)을 선택해야 합니다. 이미지 이외의 부분을 수정할 경우는 수정만 체크하면 됩니다.

새 상품 추가 하기
새로운 상품을 추가 하는 항목이며 쇼핑 몰 admin 메인 화면에서 "Up shop" 를 클릭 하면 됩니다. 제품 가격 , 상품 종목 , 이름 , 이미지 , 설명을 입력하고 "shopup" 버튼을 클릭하면 해당종목에 새상품이 등록됩니다.

회원 admin 메인 화면
사이트에 가입한 유저의 관리를 하는 항목입니다. 각 회원들의 정보를 페이지 단위로 나열하며 회원의 삭제는 체크박스를 이용해 원하는 회원만 삭제가능 합니다. "Creat user" 버튼을 이용해서 새로운 회원을 추가 할 수 있으며 특정 회원의 정보를 수정하려면 회원의 이름을 클릭하면 됩니다.

회원 추가 하기
회원 admin 메인 화면에서 "Creat user" 를 클릭 하면 추가 할 수 있습니다.

회원 정보 수정
회원 admin 메인 화면에서 수정할 유저의 이름을 클릭 하면 수정할 수 있습니다.

다음 장에서는 메인 페이지 만들기를 설명 하겠습니다.
12. 사이트 메인 페이지 만들기
사이트의 메인 화면은 필자의 임의로 만들어 봤습니다. 먼저 메인 화면의 경우 그 사이트의 얼굴이며 제공하는 모든 정보를 한눈볼 수 있어야 합니다. 그리고 회원제 사이트일 경우 로그인과 로그아웃 기능이 존재해야 합니다. 그 과정을 하나씩 살펴보겠습니다.
12.1 회원 테이블 만들기
그럼 여기서 우리가 만들 사이트의 메인 화면을 먼저 살펴보겠습니다.

회원제 사이트의 경우 각 회원의 로그인 메뉴와 회원이 아닐 경우 가입하는 부분이 존재합니다. 이 부분을 구현하기 위해서는 각 회원의 정보를 저장할 공간이 필요합니다. 우선 기존에 만들어진 데이터베이스에 회원의 테이블을 생성해도 되지만 여기서는 새로운 데이터베이스를 만들고 거기에 회원들의 정보를 담을 테이블을 생성하겠습니다.
데이터베이스 만들기
mysql>create databases selectuser ; 테이블을 생성할 데이터베이스를 만들어 줍니다. 여기 사용할 데이터베이스 명은 selectuser이고 여러분이 수정해서 사용해도 됩니다.
테이블 만들기
./mysql -u root -p userin < userin.sql CD에 있는 userin.sql 파일을 이용해서 userin 테이블을 한 번에 설치하는 방법입니다. 만약 새로운 필드의 추가나 속성을 변경할 경우 mysql 부분을 참고하세요. 일일이 insert 문을 이용해서 입력하는 방법도 있지만 userin.sql 파일을 수정해서 사용하면 더 편합니다.

테이블의 인자들
회원 테이블(userin)을 만약 새롭게 만든 다면 여러분들은 테이블에 사용할 각 인자들에 대한 사전의 계획이 있어야 합니다. 회원들의 정보 중 어느 부분을 저장 할 것인지 명확히 결정한 후 작업을 해야 합니다. 여기에 사용한 부분들은 기본적인 부분이며 여러 가지 새로운 인자들을 사용해 만들어 보기 바랍니다. name - 회원 이름 id - 회원 고유 아이디 passwd - 회원 암호 resident - 회원 주민 번호 email - 회원 메일 주소 homepage - 회원 홈페이지 주소 address - 회원 주소 wdate - 회원 가입일 uno - 회원 우편번호 tel1 - 회원 휴대폰 번호 tel2 - 회원 집 전화번호
12.2 소스 만들기
메인 화면의 소스는 총 두개의 파일로 구성 됩니다. 화면을 출력하는 파일(userin.php)과 각 화면들을 함수 형태로 저장한 파일(userin_func.php)입니다. 하나의 파일로 만들어 사용할 수도 있으며 각 부분별로 각각의 파일로 만들 수도 있습니다.
userin_func.php 전체 코드
<?php $connect = mysql_connect('localhost','root','gksmf444'); mysql_select_db('selectuser',$connect); /*---------- mysql 접속 ----------------*/ function main_userin($sel) { echo(" <html> <title>userin_view html</title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0><br> <form method=post action=userin.php> <input type=hidden name=chanl value=checkid> <table border=0 cellspacing=2 cellpadding=2 width=700 > <font style='font-size:13px;font-style:italic;color:#fffff0> (*는 필수 입력 부분입니다.)</font> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=submit value=ID중복확인></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=text name=id size=9 maxlength=8>(* 4~8자의 영숫자 조합)</font></td> </tr> </form> <form method=post action=userin.php> <input type=hidden name=chanl value=in> <input type=hidden name=sel value=$sel> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~ID</b></fontZ></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=text name=id size=9 maxlength=8>(* 4~8자의 영숫자 조합)</font>*lt;/td> </tr> <tr> <td width=90 bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=text name=name size=9>(* 한글 이름)</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~Passwd</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=password name=passwda size=9 maxlength=8> (* 영숫자 조합 4~8)</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~PasswdRE</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=password name=passwdb size=9 maxlength=8>*</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~Email</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=text name=emaila size=8>@ <input type=text name=emailb size=15>(* sss@sss.sss.ss) </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~HomePG</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0>HTTP:// <input type=text name=home size=20> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~Resident</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=text name=rsda size=7>- <input type=text name=rsdb size=8>(* 1111-11111) </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~Tel1</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <select name=tela> <option value=017 selected>017 <option value=018>018 <option value=019>019 <option value=011>011 <option value=016>016 </select>- <input type=text name=telb size=5>- <input type=text name=telc size=5>(* 휴대폰 번호) </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~Tel2</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=text name=tel2a size=4>- <input type=text name=tel2a size=4>- <input type=text name=tel2b size=5>- <input type=text name=tel2c size=5> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~우편번호</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=text name=uno size=4>- <input type=text name=uno2 size=4>* </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0> <b>~Address</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0> <input type=text name=address size=54>* </font></td> </tr> <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0> <input type=submit value=회원등록> <input type=reset value=다시></font></td> </tr> </table> </form> </center> </body> </html> "); } function error_user($connect,$id,$name,$passwda,$passwdb,$emaila,$emailb,$rsda,$rsdb,$telb,$telc,$uno,$uno2,$address) { $ally = mysql_query("select id from userin where id='$id' ",$connect); $userin = mysql_fetch_array($ally); if(!$id) { echo(" <script> window.alert('id가 없습니다. 다시 입력해 주세요.') history.go(-1) </script> "); exit; } if($userin[id]) { echo(" <script> window.alert('같은 id가 있습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!ereg("[0-9a-zA-z]",$id) || strlen($id) < 4) { echo(" <script> window.alert('id는 영문숫자 조합 이어야 합니다. 다시 입력하세요') history.go(-1) </script> "); exit; } for($n = 0 ; $n < strlen($name) ; $n++) { if(ord($name[$n]) <= 0x80) { echo(" <script> window.alert('이름이 없거나 한글이 아닙니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } } if(!$name) { echo(" <script> window.alert('이름이 없습니다. 이름부터 입력해 주세요') history.go(-1) </script> "); exit; } if(!$passwda || !$passwdb || $passwda != $passwdb) { echo(" <script> window.alert('passw가 없거나 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!ereg("[0-9a-zA_Z]",$passwda) || strlen($passwda) < 4) { echo(" <script> window.alert('passw는 영숫자 조합 이어야 합니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$emaila || !$emailb) { echo(" <script> window.alert('메일 주소가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!ereg("[0-9a-zA_Z]",$emaila) || !ereg("[0-1a-zA_Z]",$emailb)) { echo(" <script> window.alert('email은 영숫자 조합 이어야 합니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } $rsdno = "234567892345"; $rsdin = $rsda.$rsdb ; $rsdchecka = substr($rsdin,$n,1); $rsdcheckb = substr($rsdno,$n,1); for ($n = 0 ; $n < 12 ; $n++) { $rsdall = $rsdall + $rsdchecka*$rsdcheckb ; } $rsdcheck = "11" - "($rsdall % 11)"; $rsdb2 = substr($rsdb,0,1); $rsdcheck2 = substr($rsdcheck,-1,1); $rsdcheck3 = substr($rsdb,-1,1); $rsdcheck4 = ereg("[1-4]",$rsdb2); if(!$rsdcheck4 || $rsdcheck2 != $rsdcheck3) { echo(" $rsdcheck2 $rsdcheck3 <script> window.alert('주민번호111가 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$rsda || !$rsdb) { echo(" <script> window.alert('주민번호가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$telb || !$telc) { echo(" <script> window.alert('전화번호가 없습니다. 다시 입력해 주세요') history.go(-1) </script> exit; } if(!$uno || !$uno2) { echo(" <script> window.alert('우편번호가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$address) { echo(" <script> window.alert('주소가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } } function main_view($username,$connect) { mysql_select_db(adminp,$connect); $ally = mysql_query("select no,title,mview,view from admin order by no ",$connect); $ally2 = mysql_query("select no,title,mview,view from file order by no ",$connect); $put = mysql_fetch_array($ally); $put2 = mysql_fetch_array($ally2); mysql_select_db('libchal',$connect); $allya = mysql_query("select no,title,hit from $put[mview] order by hit desc",$connect); $allyb = mysql_query("select no,title,hit from $put2[mview] order by hit desc",$connect ); $put3 = mysql_fetch_array($allya); $put4 = mysql_fetch_array($allyb); $t_num=mysql_num_rows($ally); $t_num2=mysql_num_rows($ally2); $wdate = date('H:i:s'); if($username) { $sslogin = "$username login 했습니다."; $chat_mod ="<a href ='userin.php?chanl=chat&username=$username' >"; } if(!$username) { $sslogin = "Login 하세요~!"; $userss = "<a href ='userin.php?chanl=main'>"; } if($username == guest) { $sslogin = "$username login 했습니다."; $userss = "<a href ='userin.php?chanl=main'>"; } echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> </br> <font style='font-size:12px;color:gray'> $sslogin </font> <br> <br> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> <font style='font-size:12px;color:gray'> $userss (회원 가입) </a> (geust입장은 id에 guest입력) $chat_mod (Chating) </a> </font> <form method=post action=userin.php> <input type=hidden name=chanl value=login> <td width=90 bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~ID</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=id size=9></font></td> <td width=50 bgcolor=black> <img src=icon.jpg border=0 align=center> </td> <td bgcolor=black align=left> <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> <a href ='m.php?chanl=main_view&f=$put2[mview]&f2=$put2[view]&ssid=$username' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> $put2[title]</font></a> </td> </tr> <tr> <td width=90 bgcolor=#808080> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Passwd</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passwd size=9></font></td> <td width=50 bgcolor=black align=left> <img src=icon.jpg border=0 align=center> </td> <td bgcolor=black align=left> <a href='main_view.php?chanl=main_view&f=$put[mview] &f2=$put[view]&ssid=$username' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> $put[title]</font></a></td> </tr> <tr> <td width=90 bgcolor=black> <input type=submit value=Login> </form> </td> <form method=post action=userin.php> <input type=hidden name=chanl value=logout> <td bgcolor=black> <input type=submit value=Logout> </form> </td> <td width=50 bgcolor=black> <img src=icon.jpg border=0 align=center> </td> <td bgcolor=black align=left> <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> <form method=post action=shop.php>cry~ <select name=sel> <option value=1 selected>전자제품 <option value=2>의류 <option value=3>음악 <option value=4>책 </select>!shop</font> <input type=submit value=~Go> </td> </form> </tr> </table> "); echo(" <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:white'> <img src=icon.jpg border=0 align=center>Top 자료</font></td> <td bgcolor=black align=left width=500> <a href ='m.php?chanl=title&no=$put4[no]&f=$put2[mview] &f2=$put2[view]&ssid=$username' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put4[title]</strong></font></a></td> <tr> <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:white'> <img src=icon.jpg border=0 align=center>Top 경매</font></td> <td bgcolor=black align=left width=500> <a href ='main_view.php?chanl=title&no=$put3[no]&f=$put[mview] &f2=$put[view]&ssid=$username' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put3[title]</strong></font></a></td> </tr> </table>"); echo(" <table border=0 cellspacing=2 cellpadding=2 width=300 > <tr> <td colspan=2 bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~File bang list</b></font></td> </tr> "); for($pd=1 ; $pd < $t_num2 ; $pd++) { $put2 = mysql_fetch_array($ally2); echo(" <tr> <td bgcolor=black align=center width=200> <img src=icon.jpg border=0 align=center></td> <td bgcolor=black align=left width=500> <a href ='m.php?chanl=main_view&f=$put2[mview]&f2=$put2[view]&ssid=$username' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put2[title]</strong></font></a></td> </tr> "); } echo(" <table border=0 cellspacing=2 cellpadding=2 width=300 > <tr> <td colspan=2 bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~경매 bang list</b></font></td> </tr> "); for($pd=1 ; $pd < $t_num ; $pd++) { $put = mysql_fetch_array($ally); echo(" <tr> <td bgcolor=black align=center width=200> <img src=icon.jpg border=0 align=center></td> <td bgcolor=black align=left width=500> <a href ='main_view.php?chanl=main_view&f=$put[mview] &f2=$put[view]&ssid=$username' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put[title]</strong></font></a></td> </tr> "); } echo(" </table> </center> </body> <html> "); } ?>
소스 설명
메인 화면의 각 부분들을 구성하는 화면을 함수 형태로 저장한 파일입니다. userin_func.php 파일 내의 함수는 메인 화면의 또 다른 기능을 추가할 경우 함수만 추가해서 사용하면 됩니다.
Database 접속 만들기
$connect = mysql_connect('localhost','root','gksmf444'); /* Mysql을 접속하기 위한 호스트 명과 아이디, 패스워드를 입력 합니다. 여기에 사용한 호스트와 아이디, 패스워드는 여러분들이 새로 만들었다면 그것을 적어주면 됩니다. */ mysql_select_db('selectuser',$connect); /* Mysql의 데이터베이스를 선택합니다. */
main_userin($sel) 함수
처음 메인 화면에 접속하고 회원 가입을 클릭했을 경우 출력하는 부분입니다.

ID 중복 확인 만들기
<form method=post action=userin.php> /* 이 form문을 이용해서 입력된 값을 userin.php 파일로 전송합니다. */ <input type=hidden name=chanl value=checkid> /* userin.php 파일의 $chanl=checked 항목을 선택합니다. */ <table border=0 cellspacing=2 cellpadding=2 width=700 > <font style='font-size:13px;font-style:italic;color:#fffff0'> (*는 필수 입력 부분입니다.)</font> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=ID중복확인></font></td> /* 입력한 ID를 전송 하기 위한 버튼(submit)을 만듭니다. */ <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=id size=9 maxlength=8>(* 4~8자의 영숫자 조합)</font></td> /* ID의 입력은 최대 8자만 가능하게 합니다. */ </tr> </form>
신규 회원 ID 입력란 만들기
<form method=post action=userin.php> <input type=hidden name=chanl value=in> <input type=hidden name=sel value=$sel> /* 이 form 문은 위 ID중복 확인 문 이후의 모든 입력을 전달하는 부분이고, userin.php 파일의 $chanl=in 항목과 $sel의 해당항목(chanl=in)의 수행 후 되돌아갈 화면을 선택하는 부분입니다. 즉, 메인 화면을 통해 회원 가입 화면에 왔을 경우 $sel 값은 아물孤� 없습니다. 그럴 경우 회원 가입 수행 후 다시 메인 화면으로 돌아옵니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~ID</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=id size=9 maxlength=8>(* 4~8자의 영숫자 조합)</font></td> /* 사용할 ID를 입력하는 부분입니다. 최대 입력 글은 8자로 제한합니다. */ </tr>
회원 이름 입력란 만들기
<tr> <td width=90 bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=name size=9>(* 한글 이름)</font></td> /* 이름의 입력 값은 name 변수로 회원 이름을 입력 받습니다. */ </tr>
회원 패스워드 입력란 만들기
<tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Passwd</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passwda size=9 maxlength=8> (* 영숫자 조합 4~8)</font></td> </tr> /* 회원의 ID에 사용할 패스워드를 입력하는 부분입니다. 최대 크기는 8로 합니다. Input type는 password로 설정합니다. 이것은 화면에 *****게 표시해 다른 사람이 보지 못하게 하는 것입니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~PasswdRE</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passwdb size=9 maxlength=8>*</font></td> </tr> /* 사용할 패스워드의 재확인 입력란을 만듭니다. 최대 입력 크기는 8입니다. 이 항목 역시 type=password로 설정하며� 전달 받는 인자는 passwdb입니다. */
메일과 홈페이지 입력란 만들기
<tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Email</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=emaila size=8>@ <input type=text name=emailb size=15>(* sss@sss.sss.ss) /* @를 중심으로 두개의 입력란을 생성하고 차례로 emaila, emailb 변수로 메일 주소를 입력받습니다. */ </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~HomePG</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> HTTP:// <input type=text name=home size=20> /* HTTP:// 항목을 출력하고 home 인자로 사용자 홈페이지 주소를 입력 받습니다. */ </font></td> </tr>
주민번호 입력란 만들기
<tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Resident</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=rsda size=7>- <input type=text name=rsdb size=8>(* 1111-11111) /* - 기호를 중심으로 두개의 변수(rsda , rsdb)로 사용자 주민 번호를 입력합니다. */ </font></td> </tr>
휴대폰 번호 입력란 만들기
<tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel1</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <select name=tela> <option value=017 selected>017 <option value=018>018 <option value=019>019 <option value=011>011 <option value=016>016 </select>- /* select 문을 사용해서 현재 서비스 중인 휴대폰 회사를 선택하게 합니다. tela 변수에 저장 됩니다. */ <input type=text name=telb size=5>- <input type=text name=telc size=5>(* 휴대폰 번호) /* 각각 휴대폰 마지막 번호를 입력하는 부분입니다. 전달 인자는 차례로 telb , telc입니다. */ </font></td> </tr>
자택 전화번호 입력란 만들기
<tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel2</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=tel2a size=4>- <input type=text name=tel2b size=5>- <input type=text name=tel2c size=5> </font></td> </tr> /* 지역 번호를 포함한 3개의 변수로 저장합니다. 각각 tel2a , tel2b , tel2c 입니다. */
우편 번호와 자택 전화번호 입력란 만들기
<tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~우편번호</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=uno size=4>- <input type=text name=uno2 size=4>* </font></td> </tr> /* 우편 번호를 입력하는 부분입니다. 두개의 입력란을 -로 구분하며 각각 uno , uno2 변수로 입력 번호를 전달합求�. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Address</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=address size=54>* </font></td> /* 주소를 입력하는 부분입니다. 주소 입력은 보다 사용자 중심의 입력 형태로 만들 수 있습니다. 즉 해당 도시와 해당동 등의 입력을 자동으로 찾게 하는 방법인데, 이것은 전국의 주소와 우편번호를 가진 데이터베이스 파일이 있어야 하며 인터넷 상에서 쉽게 구할 수 있습니다. 여기서는 회원의 임의로 적을 수 있도록 했습니다. 만약 회원이 쇼핑을 하고 물건을 구매한다면 이 주소란을 정확히 입력 해야만 배달이 될 것입니다. */ </tr>
입력 항목 전달 버튼 만들기
<tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=회원등록> /* 회원등록 버튼을 생성합니다. 이것은 위 입력 항목들의 값을 userin.php 파일로 전달합니다. */ <input type=reset value=다시></font></td> /* 다시 버튼을 생성합니다. type=reset이며 이것은 입력 항목을 전부 다시 입력할 때 사용합니다. */ </tr> </table> </form>/* 중복 ID 검사 form문 이후 두 번째 form문의 끝입니다. */ </center> </body> </html> ");
error_user( ) 함수 항목
회원 가입 입력란의 입력 조건을 부여 합니다. 즉, 회원 가입 항목 중 사용자가 부정확하게 입력할 경우 에러 화면을 출력 하는 부분 입니다.

함수 전달 인자들
error_user($connect,$id,$name,$passwda,$passwdb,$emaila,$emailb,$rsda,$rsdb,$telb,$telc,$uno,$uno2,$address) /* 각 전달 인자는 회원 입력 화면에서 입력 했던 값을 전달 하는 변수들 입니다. 그리고, $connect의 경우 mysql을 접속 하는 변수 입니다. */
ID 체크
if(!$id) { echo(" <script> window.alert('id가 없습니다. 다시 입력해 주세요.') history.go(-1) </script> "); exit; } /* $id 값이 없을 경우 출력하는 화면 입니다. */ if($userin[id]) { echo(" <script> window.alert('같은 id가 있습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* $userin[id] 값이 존재할 경우 같은 id가 있는 것이므로 해당 화면을 출력 합니다. */ if(!ereg("[0-9a-zA-z]",$id) || strlen($id) < 4) { echo(" <script> window.alert('id는 영문숫자 조합 이어야 합니다. 다시 입력하세요') history.go(-1) </script> "); exit; } /* 전달 되어온 $id 값이 숫자와 영문 중 4자 보다 작을 경우 에러를 출력 합니다. 즉,ereg 함수를 사용해서 [0-9a-zA-z] 숫자와 영문대소문자가 아니면 에러를 출력 하고 또는 strlen 함수를 사용해서 전달되어온 인자 중 문자수가 4보다 작을 嚥� 에러를 출력 합니다. */
회원 이름 체크
for($n = 0 ; $n < strlen($name) ; $n++) { if(ord($name[$n]) <= 0x80) { echo(" <script> window.alert('이름이 없거나 한글이 아닙니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } } /* 전달 되어온 회원 이름이 한글인지 아닌지 체크 하고 아닐 경우 에러 화면을 출력 합니다. */ if(!$name) { echo(" <script> window.alert('이름이 없습니다. 이름부터 입력해 주세요') history.go(-1) </script> "); exit; } /* 회원 이름이 입력 되지 않았을 경우 출력 되는 화면 입니다. */
패스워드 체크
if(!$passwda || !$passwdb || $passwda != $passwdb) { echo(" <script> window.alert('passw가 없거나 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 회원 가입 항목 중 패스워드 부분과 패스워드 확인 부분의 인자가 없을 경우 또는 둘이 같지 않을 경우 에러 화면을 출력 합니다. */ if(!ereg("[0-9a-zA_Z]",$passwda) || strlen($passwda) < 4) { echo(" <script> window.alert('passw는 영숫자 조합 이어야 합니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 패스워드가 영문 대소문자나 숫자가 아닐 경우 또는 전달 되어온 문자가 4자 보다 작을 경우 에러 화면을 출력 합니다. */
메일 주소 체크
if(!$emaila || !$emailb) { echo(" <script> window.alert('메일 주소가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 메일 주소 항목이 없을 경우 출력 하는 화면 입니다. */ if(!ereg("[0-9a-zA_Z]",$emaila) || !ereg("[0-1a-zA_Z]",$emailb)) { echo(" <script> window.alert('email은 영숫자 조합 이어야 합니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 전달 되어온 두개의 메일 주소 인자에 대해 영문 대소문자 와 숫자가 아니면 에러 화면을 출력 합니다. */
주민 번호 체크
$rsdno = "234567892345"; $rsdin = $rsda.$rsdb ; /* 전달 되어온 두개의 주민 번호 인자를 하나로 만듭니다. */ $rsdchecka = substr($rsdin,$n,1); /* 전달 되어온 주민 번호 인자 입니다. */ $rsdcheckb = substr($rsdno,$n,1); for ($n = 0 ; $n < 12 ; $n++) { $rsdall = $rsdall + $rsdchecka*$rsdcheckb ; } $rsdcheck = "11" - "($rsdall % 11)"; $rsdb2 = substr($rsdb,0,1); /* 주민 번호 두 번째 인자의 처음 숫자를 추출 합니다. */ $rsdcheck2 = substr($rsdcheck,-1,1); /* 주민 번호의 마지막 자리 숫자를 추출 합니다. */ $rsdcheck3 = substr($rsdb,-1,1); /* 주민 번호의 마지막 자리 숫자를 추출 합니다. */ $rsdcheck4 = ereg("[1-4]",$rsdb2); /* 주민 번호 두 번째 인자의 처음 숫자가 1~4 중 하나 인지 체크 합니다. */ if(!$rsdcheck4 || $rsdcheck2 != $rsdcheck3) { echo(" $rsdcheck2 $rsdcheck3 <script> window.alert('주민번호111가 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 주민 번호 두 번째 인자가 1~4 중 하나가 아닐 경우 또는 두 번째 인자 마지막 숫자가 일치 하지 않을 경우 에러를 출력 합니다. */ if(!$rsda || !$rsdb) { echo(" <script> window.alert('주민번호가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 주민 번호 두 인자가 없을 경우 에러를 출력 합니다. */
휴대폰 번호와 우편 번호 체크
if(!$telb || !$telc) { echo(" <script> window.alert('전화번호가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 휴대폰 번호 두 인자 중 하나가 없을 경우 에러 화면을 출력 합니다. */ if(!$uno || !$uno2) { echo(" <script> window.alert('우편번호가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 우편 번호 두 인자 중 하나가 없을 경우 에러 화면을 출력 합니다. */
주소 체크
if(!$address) { echo(" <script> window.alert('주소가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 주소가 없을 경우 출력 하는 화면 입니다. */
main_view( ) 함수
사이트의 메인 화면을 출력 하는 함수 입니다. 이장의 처음 메인 화면 그림을 참고 하세요.
전달 인자
main_view($username,$connect) /* $username는 해당 ID의 세션으로 만들어진 유저 ID를 전달 받기 위함 입니다. 즉 메인 화면의 로그인 상태를 보여 주기 위해서 입니다. $connect는 Mysql 접속 변수 입니다. */
Mysql 접속 Query들
mysql_select_db(adminp,$connect); /* adminp 데이터 베이스를 선택 합니다. 이것은 뒤 데이터 베이스 유틸리티를 만들 때 생성하는 데이터 베이스이� 자료실과 경매 게시판의 정보를 담고 있습니다. */ $ally = mysql_query("select no,title,mview,view from admin order by no ",$connect); /* adminp 데이터 베이스에 admin 테이블(경매 게시판)의 인자를 검색 합니다. no - 게시판 번호 , title - 게시판 제목 , mview - 게시판 첫 번째 테이블 명 , view - 게시판 두 번째 테이블 명 */ $ally2 = mysql_query("select no,title,mview,view from file order by no ",$connect); /* adminp 데이터 베이스에 file 테이블(자료실 게시판)의 인자를 검색 합니다. */ $put = mysql_fetch_array($ally); $put2 = mysql_fetch_array($ally2); /* 변수 put , put2로 각 검색 결과를 배열로 저장 합니다. */ mysql_select_db('libchal',$connect); /* libchal 데이터 베이스를 선택 합니다. */ $allya = mysql_query("select no,title,hit from $put[mview] order by hit desc",$connect); /* libchal 데이터 베이스에서 해당 경매 게시판 테이블 중 히트 수가 가장 높은 글을 검색 합니다. */ $allyb = mysql_query("select no,title,hit from $put2[mview] order by hit desc",$connect ); /* libchal 데이터 베이스에서 해당 자료실 게시판 테이블 중 히트 수가 가장 높은 글을 검색 합니다. */ $put3 = mysql_fetch_array($allya); $put4 = mysql_fetch_array($allyb); /* put3 , put4 변수에 해당 검색 결과를 배열로 저장 합니다. */ $t_num=mysql_num_rows($ally); $t_num2=mysql_num_rows($ally2); /* 각 검색 결과의 수를 변수에 저장 합니다. */ $wdate = date('H:i:s'); /* 해당 변수에 지금 날짜를 저장 합니다. */
사용자 ID와 세션 확인
if($username) { $sslogin = "$username login 했습니다."; /* 등록된 ID로 접속 했을 경우 해당 ID를 변수에 저장 합니다. */ $chat_mod ="<a href ='userin.php?chanl=chat&username=$username' >"; /* 등록된 ID로 접속 했을 경우 해당 ID로 채팅 모드를 링크 합니다. */ } if(!$username) { $sslogin = "Login 하세요~!"; $userss = "<a href ='userin.php?chanl=main'>"; } /* 등록된 ID로 접속을 하지 않았을 경우 각 변수 입니다. */ if($username == guest) { $sslogin = "$username login 했습니다."; $userss = "<a href ='userin.php?chanl=main'>"; } /* 접속한 ID가 guest일 경우 변수 값들 입니다. */
사용자 접속 및 채팅 모드 출력
<tr> <font style='font-size:12px;color:gray'> $userss (회원 가입) </a> /* 등록된 ID 가 아닐 경우 회원 가입을 링크 합니다. */ (gest입장은 id에 guest입력) $chat_mod (Chating) </a> </font> /* 등록된 ID로 로그인 했을 경우 채팅 모드를 링크 합니다. */
입력란과 로그인 로그아웃 버튼 만들기
<form method=post action=userin.php> <input type=hidden name=chanl value=login> /* ID 입력 항목의 form문의 시작 입니다. Chanl 변수의 값은 login 이며 userin.php에 전달 합니다. */ <td width=90 bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~ID</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=id size=9></font></td> /* 등록된 ID를 입력 하는 항목을 출력 하고, id 변수로 입력 됩니다. */ <td width=50 bgcolor=black> <img src=icon.jpg border=0 align=center> </td> <td bgcolor=black align=left> <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> <a href ='m.php?chanl=main_view&f=$put2[mview]&f2=$put2[view]&ssid=$username' > /* 등록된 자료실 게시판의 처음 자료실을 링크 합니다. 자료실 테이블의 실행은 m.php파일이며 f,f2는 해당 자료퓽� 테이블 입니다. 그리고, ssid는 로그인한 ID 입니다. */ <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> $put2[title]</font></a> </td> </tr> <tr> <td width=90 bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Passwd</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passwd size=9></font></td> /* 해당 ID의 패스워드를 입력하는 부분 이며 passwd 변수에 저장 됩니다. */ <td width=50 bgcolor=black align=left> <img src=icon.jpg border=0 align=center> </td> <td bgcolor=black align=left> <a href ='main_view.php?chanl=main_view&f=$put[mview]&f2= /* 등록된 경매 게시판의 처음 경매를 링크 합니다. */ $put[view]&ssid=$username' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> $put[title]</font></a></td> </tr> <tr> <td width=90 bgcolor=black> <input type=submit value=Login> </form> /* 등록된 ID와 패스워드로 로그인 하는 버튼을 생성 합니다. */ </td> <form method=post action=userin.php> <input type=hidden name=chanl value=logout> <td bgcolor=black> <input type=submit value=Logout> </form> </td> /* 로그인 한 ID를 로그아웃 하는 버튼을 생성 합니다. userin.php 파일의 chanl=logout 항목을 실행 합니다. */
쇼핑 몰에 선택 만들기
<td bgcolor=black align=left> <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> <form method=post action=shop.php>cry~ <select name=sel> <option value=1 selected>전자제품 <option value=2>의류 <option value=3>음악 <option value=4>책 </select>!shop</font> <input type=submit value=~Go> </td> </form> /* sel 변수로 각 쇼핑 몰에의 종류를 전달 합니다. 그리고 Go 버튼을 생성 합니다. */
Top 자료 와 Top 경매 출력 하기
<table border=0 cellspacing=2 cellpadding=2 width=700 > <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:white'> <img src=icon.jpg border=0 align=center>Top 자료</font></td> <td bgcolor=black align=left width=500> <a href ='m.php?chanl=title&no=$put4[no]&f=$put2[mview]&f2= $put2[view]&ssid=$username' > /* 해당 자료실의 히트 수가 제일 높은 자료를 링크 합니다. */ <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put4[title]</strong></font></a></td> /* $put4[title]은 등록된 자료실의 히트 수가 제일 높은 자료를 출력 합니다. */ <tr> <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:white'> <img src=icon.jpg border=0 align=center>Top 경매</font></td> <td bgcolor=black align=left width=500> <a href ='main_view.php?chanl=title&no=$put3[no]&f= $put[mview]&f2=$put[view]&ssid=$username' > /* 등록된 경매 중 히트 수가 제일 높은 경매를 링크 합니다. */ <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put3[title]</strong></font></a></td> /* $put3[title]는 등록된 경매 중 히트 수가 제일 높은 경매를 출력 합니다. */ </tr> </table>
만들어진 자료실 모두 출력 하기
이것은 데이터 베이스 admin에서 새롭게 생성했던 자료실에 대해 화면에 출력 하는 부분 입니다. for($pd=1 ; $pd < $t_num2 ; $pd++) { /* $t_num2는 등록된 자료실의 수 입니다. */ $put2 = mysql_fetch_array($ally2); /* 해당 자료실의 정보를 배열로 저장 합니다. $ally2 변수는 해당 자료실의 정보를 가지고 있습니다. */ echo(" <tr> <td bgcolor=black align=center width=200> <img src=icon.jpg border=0 align=center></td> <td bgcolor=black align=left width=500> <a href ='m.php?chanl=main_view&f=$put2[mview]&f2=$put2[view]&ssid=$username' > /* 등록된 자료실을 하나씩 링크 합니다. For문에 의해서 실행 합니다. */ <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put2[title]</strong></font></a></td> </tr> /* 등록된 자료실의 제목을 하나씩 출력 합니다. 이것은 제일 처음 메인 화면에 출력한 자료실을 제외한 그 다음 米溯퓟壙� 입니다. */ "); }
만들어진 경매 게시판 모두 출력하기
for($pd=1 ; $pd < $t_num ; $pd++) { /* $t_num 은 만든 경매 게시판의 총 수 입니다. */ $put = mysql_fetch_array($ally); /* 해당 경매 게시판의 정보를 배열로 저장 합니다. */ echo(" <tr> <td bgcolor=black align=center width=200> <img src=icon.jpg border=0 align=center></td> <td bgcolor=black align=left width=500> <a href ='main_view.php?chanl=main_view&f=$put[mview]&f2= $put[view]&ssid=$username' > /* 해당 경매 게시판을 하나씩 링크 합니다. For문에 의해 현재 만들어진 게시판의 수만큼 되풀이 합니다. */ <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put[title]</strong></font></a></td> </tr> /* 해당 게시판의 제목을 출력 합니다. */ "); }
userin.php 전체 코드
userin_func.php 파일의 함수들을 이용해서 화면에 출력하는 파일 입니다. <?php include('userin_func.php'); if($chanl == main_view || !$chanl) { main_view($username,$connect); } if($chanl == main) { main_userin($sel); } if($chanl == in) { error_user($connect,$id,$name,$passwda,$passwdb,$emaila,$emailb,$rsda,$rsdb,$telb,$telc,$uno,$uno2,$address); $wdate = date('y-m-d'); $resident = "$rsda-$rsdb" ; $email = "$emaila@$emailb" ; $tel1 = "$tela-$telb-$telc" ; $tel2 = "$tel2a-$tel2b-$tel2c" ; $uno = "$uno-$uno2" ; mysql_query("insert into userin(name,id,passwd,resident,email,homepage,address,tel1,tel2,wdate,uno) values('$name','$id',password('$passwda'),'$resident','$email', '$home','$address','$tel1','$tel2','$wdate','$uno')",$connect); if($sel == user_edit) { echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>회원 가입이 되었습니다.</b></font> <input type=hidden name=chanl value=user_edit> <input type=submit value=확인> </form> </center> </body> </html> "); } else { echo(" <html> <body> <center> <form method=post action=userin.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>회원 가입이 되었습니다.</b></font> <input type=hidden name=no value=$no> <input type=hidden name=chanl value=main_view> <input type=submit value=확인> </form> </center> </body> </html> "); } } if($chanl == checkid) { $ally = mysql_query("select id from userin where id='$id'",$connect); $userin = mysql_fetch_array($ally); if($userin[id] || !$id) { echo(" <script> window.alert('같은 id가 있거나 공란 입니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } else { echo(" <script> window.alert('사용 가능한 id 입니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } } if($chanl == login) { $ally = mysql_query("select id,passwd from userin where id='$id'",$connect); $userin = mysql_fetch_array($ally); $passwput = mysql_query("select password('$passwd')"); $passwput1 = mysql_result($passwput,0,0); if($userin[passwd] != $passwput1 || !$id ) { echo(" <script> window.alert('id,passw가 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if($userin[passwd] == $passwput1 && $userin[id] == $id || $id == guest) { session_start(); $username = "$id"; session_register( "username"); main_view($username,$connect); } else { echo(" <script> window.alert('id,passw가 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } } if($chanl == chat) { echo(" <html> <body> <center> <script> window.open('chat.php','send','height=100px width=325px') window.open('chat_view.php','send2','height=200px width=325px') </script> </center> </body> </html> "); main_view($username,$connect); } if($chanl == logout) { session_start(); session_destroy("username"); main_view($username,$connect); } ?>
소스 설명
이 파일은 userin_func.php 파일의 함수들을 보다 다양한 방법으로 화면에 출력 하게끔 구성된 파일 입니다. 단순히 if문의 나열만 존재 하지만 이것은 $chanl 이라는 변수를 둠으로 해서 각각의 chanl에 따라 출력 하는 화면이 달라 집니다.
메인 화면 출력
<?php include('userin_func.php'); /* userin_func.php 파일을 포함 합니다. 이것은 이 파일 안의 함수들을 사용 하기 위함 입니다. */ if($chanl == main_view || !$chanl) { main_view($username,$connect); } /* $chanl 이 없거나 또는 main_view 일때 메인 화면을 출력 합니다. */
회원 가입 출력과 데이터 베이스 입력
if($chanl == main) { main_userin($sel); } /* $chanl 이 main 일 때 회원 가입 화면을 출력 합니다. */ if($chanl == in) { error_user($connect,$id,$name,$passwda,$passwdb,$emaila,$emailb,$rsda,$rsdb,$telb,$telc,$uno,$uno2,$address); /* $chanl이 in일 때 전달 되어온 회원 정보를 입력 하는 부분 이며 각 인자들에 대해 에러 여부를 체크 합니다. */ $wdate = date('y-m-d'); $resident = "$rsda-$rsdb" ; $email = "$emaila@$emailb" ; $tel1 = "$tela-$telb-$telc" ; $tel2 = "$tel2a-$tel2b-$tel2c" ; $uno = "$uno-$uno2" ; /* 주민번호 , 메일 , 전화번호 , 우편번호에 대해 각각의 형식에 맞게 만듭니다. */ mysql_query("insert into userin(name,id,passwd,resident,email,homepage,address,tel1,tel2,wdate,uno) values('$name','$id',password('$passwda'),'$resident','$email', '$home','$address','$tel1','$tel2','$wdate','$uno')",$connect); /* 전달 되어온 각 회원 정보가 에러가 없다면 userin 테이블에 입력 합니다. */ if($sel == user_edit) { /* $sel 이 user_edit 이면 admin 항목에서 일반 유저를 등록한 것이며, 새로운 회원을 등록 시킨 후 다시 admin 항목으로 되돌아 갑니다. */ echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>회원 가입이 되었습니다.</b></font> <input type=hidden name=chanl value=user_edit> <input type=submit value=확인> </form> </center> </body> </html> "); } else { /* else 경우 $sel 값이 없는 경우 이며, 일반 사용자들이 회원 가입을 할 경우 가입한 후에 다시 메인 화면으로 이동합니다. */ echo(" <html> <body> <center> <form method=post action=userin.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>회원 가입이 되었습니다.</b></font> <input type=hidden name=no value=$no> <input type=hidden name=chanl value=main_view> <input type=submit value=확인> </form> </center> </body> </html> "); } }
ID 체크 항목
if($chanl == checkid) { $ally = mysql_query("select id from userin where id='$id'",$connect); $userin = mysql_fetch_array($ally); /* $chanl이 checkid일 경우 수행하며, userin테이블에서 전달 되어온 ID의 존재 여부를 검색 하고 결과를 배열로 저장 합니다. */ if($userin[id] || !$id) { echo(" <script> window.alert('같은 id가 있거나 공란 입니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 전달 되어온 ID가 없거나 또는 해당 ID가 userin 테이블에 있을 경우 출력 하는 화면 입니다. */ else { echo(" <script> window.alert('사용 가능한 id 입니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 그 밖의 경우 사용 가능한 ID임을 출력 합니다. */ }
login 처리
if($chanl == login) { $ally = mysql_query("select id,passwd from userin where id='$id'",$connect); $userin = mysql_fetch_array($ally); $passwput = mysql_query("select password('$passwd')"); $passwput1 = mysql_result($passwput,0,0); /* $chanl이 login일 때 userin테이블에서 전달 되어온 ID에 대해 검색하고, 결과를 배열로 저장 합니다. 그리고, 전달되어온 패스워드를 암호화 해서 변수에 저장 합니다. */ if($userin[passwd] != $passwput1 || !$id ) { echo(" <script> window.alert('id,passw가 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 전달 되어온 ID가 없거나 또는 전달 되어온 패스워드와 검색한 패스워드가 같지 않을 경우 출력 하는 화면 입니다. */ if($userin[passwd] == $passwput1 && $userin[id] == $id || $id == guest) { session_start(); $username = "$id"; session_register( "username"); main_view($username,$connect); } /* 전달 되어온 패스워드,ID가 검색한 패스워드,ID 와 같을 경우 또는 전달 되어온 ID가 guest 일 경우 해당 ID에 대해 세션을 만듭니다. */ else { echo(" <script> window.alert('id,passw가 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 그 밖의 경우 출력 하는 화면 입니다. */ }
채팅 창 띄우기
if($chanl == chat) { echo(" <html> <body> <center> <script> window.open('chat.php','send','height=100px width=325px') window.open('chat_view.php','send2','height=200px width=325px') /* $chanl 이 chat일 때 두개의 채팅 창을 띄웁니다. 간단한 java 스크립트를 이용한 방법 입니다. */ </script> </center> </body> </html> "); main_view($username,$connect); }
logout 하기
if($chanl == logout) { session_start(); session_destroy("username"); main_view($username,$connect); } /* $chanl이 logout일 경우 접속한 ID의 세션을 제거 합니다. */ 다음 장에서는 자료실에 대해 설명 하겠습니다.
13. 자료실 만들기�
자료실은 간단한 데이터의 경우 매우 유용하게 사용할 수 있습니다. 보통 일반적인 유틸리티 자료 공유로 활용할 수 있으며
여기서 구현할 자료실은 자료에 관한 응답 글 기능이 있는 아주 간단한 소스입니다.

13.1 소스의 구성
자료실 테이블 만들기
자료실의 테이블은 총 두개로 이루어져 있습니다. 전체 자료에 관한 테이블과 해당 자료에 관한 응답 글 테이블입니다. 여기서 만들 테이블은 단지 자료실 하나만 만들 경우 그 과정을 설명한 것이며 이후 본 사이트를 구성할 때 자료실과 경매 게시판은 admin 영역에서 자신이 원하는 만큼 게시판을 생성할 수 있습니다. 즉, 여기서 수작업으로 만든 자료실 테이블은 나중에 생성할 admin 기능에서 자료실 항목에 나타나지 않습니다. 또한 자료실 소스 부분 중 자료실 테이블($f , $f2)을 지금 생성하는 테이블 명으로 바꾸어서 사용해야 합니다. 여기서는 자료실 소스의 구성과 작성 요령을 중점적으로 설명합니다.
1) 데이터베이스 만들기 mysql>create databases libchal ; 자료실 테이블을 만들 데이터베이스를 생성합니다. Libchal 데이터베이스는 경매 게시판의 테이블도 생성합니다. 2) 테이블 만들기 ./mysql -u root -p libchal < filetest.sql CD의 filetest.sql 파일을 이용해서 간단히 자료실 테이블을 생성합니다. 이 방법은 새롭게 파일을 생성해서 각 테이블의 속성을 변경해서 사용해도 됩니다. 여기서 만든 테이블은 현재 구성할 스크립트의 자료실 테이블 명을 수정해서 볼 수 있습니다. 즉 , 나중에 admin 영역에서 생성한 자료실 게시판이 아닐 경우는 메인 화면에 나타나지 않습니다. 생성되는 테이블은 filetest와 filetest2이고 이 테이블을 자료실 스크립트에 적용하기 위해서 아래의 링크를 사용해야 합니다. <a href ='m.php?chanl=main_view&f=자료실 메인 테이블명 &f2=응답 글 테이블 명&ssid=$username' > 이것은 경매 게시판의 경우도 마찬가지입니다.

3) 테이블의 구성 인자들 자료실의 테이블은 총 두개로 이루어져 있습니다. 여기서 테이블을 만들어 보는 것은 단지 자료실의 테이블 구성 요소를 확인하기 위함입니다. 즉 테이블을 여기서 만들지 않더라도 admin 영역에서 생성해서 사용하면 됩니다.
자료실 메인 테이블
각 인자 중에 등록자 이름과 패스워드 등을 설정한 것은 회원제 사이트지만 자료실의 이용은 공개하기 위함입니다. 즉 , 회원 가입을 하지 않고 guest로 입장 하더라도 자료의 다운로드는 가능합니다. 그리고 회원인 경우라도 다양한 이름과 패스워드로 등록가능합니다. no - 자료의 번호를 부여합니다. (자동 증가) name - 자료 등록자 이름 email - 자료 등록자 메일 주소 path - 등록된 자료의 위치 passw - 등록자 패스워드 title - 자료 제목 content - 자료 설명 wdate - 자료 등록 날짜 hit - 해당 자료 조회 수
응답 글 테이블
응답 글의 경우 해당 자료에 대한 고유 번호를 저장하며 해당 글의 내용에 나열됩니다. name - 응답 글 등록자 이름 email - 응답 글 등록자 메일 주소 tnum - 해당 자료의 고유 번호 저장 wdate - 응답 글 등록 날짜 content - 응답 글 내용
소스 만들기
자료실 스크립트는 총 두개로 구성됩니다. 이 방법은 앞의 메인 화면 구성과 뒤에 설명할 경매 게시판 , 쇼핑 몰 , admin 영역 또한 마찬가지입니다. 구성은 자료실 각 화면을 구성하는 파일(f.php)과 함수들을 다양한 방법으로 출력하는 파일(m.php)로 이루어 집니다.
f.php 전체 코드
<?php ///////////////////////////////////////////// // // 일자 : 2000.3.27 pm 5 // 작성자: skycry (hong il) // // method : 자료실 함수 모음 // ////////////////////////////////////////////// ?> <?php $connect = mysql_connect('localhost' ,'root' ,'gksmf444'); mysql_select_db('libchal' ,$connect); if($findtype == name) { $ally = mysql_query("select no ,title ,name ,hit ,wdate ,email ,path from $f where name like '%$findname%' order by no " ,$connect); } if($findtype == title) { $ally = mysql_query("select no ,title ,name ,hit ,wdate ,email ,path from $f where title like '%$findname%' order by no " ,$connect); } if($findtype == content) { $ally = mysql_query("select no ,title ,name ,hit ,wdate ,email ,path from $f where content like '%$findname%' order by no " ,$connect); } if($findtype == t_c) { $ally = mysql_query("select no ,title ,name ,hit ,wdate ,email ,path from $f where title like '%$findname%' or content like '%$findname%' order by no " ,$connect); } if(!$findtype) { $ally = mysql_query("select no ,title ,name ,hit ,wdate ,path ,email from $f order by no " ,$connect);//$connection 생략 했음 } $ally4 = mysql_query("select no ,hit ,passw ,name ,path from $f where no='$no'" ,$connect ); $ally3 = mysql_query("select name ,email ,tnum ,wdate ,content from $f2 where tnum ='$no' order by tnum desc" ,$connect ); $ally2 = mysql_query("select no ,email ,title ,name ,content ,path ,wdate from $f where no='$no'" ,$connect ); $t_num=mysql_num_rows($ally); $putup = mysql_fetch_array($ally4); ?> <?php function main_view($t_num ,$ally ,$page ,$findtype ,$findname ,$f ,$f2 ,$root ,$username) { $p_dip = 4 ; $p_page =5 ; $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; if(!$page) { $page = 1; } if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; $pre_p = $page - 1 ; $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; if(!$root) { $admin = "User " ; } else { $admin = "Admin 입니다."; } echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th bgcolor=white colspan=6 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page : $admin</b></font></th> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>No</b></font></td> <td bgcolor=#808080 width=370> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Title</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Name</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Cnt</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>down</b></font></td> <td bgcolor=#808080 width=125 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록일</b></font></td> </tr>"); if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=6> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 글이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else { for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { if($pd >= 0 ) { mysql_data_seek($ally ,$pd); $put=mysql_fetch_array($ally); echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> $put[no]</font></td> <td bgcolor=black> <a href ='m.php?chanl=title&no=$put[no]&f=$f&f2=$f2'> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[title]</b></font></a></td> <td bgcolor=black align=center> <a href = mailto:$put[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[name]</b></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[hit]</b></font></td> <td bgcolor=black align=center> <a href ='ftp://192.168.0.3/home/ftp/pub/$put[path]'> <font style='font-size:13px;font-style:italic;color:blue'> <img src=disksmblk.gif border=0></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[wdate]</b></font></td> </tr> "); } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } else { echo (" <a href =m.php?chanl=main_view&page=$pre_p&f=$f&f2=$f2> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } else { if($pp > 0 && $pp <= $t_page) { echo(" <a href =m.php?chanl=main_view&page=$pp&f=$f&f2=$f2> font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a>"); } } } if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font>"); } else { echo (" <a href =m.php?chanl=main_view&page=$next_p&f=$f&f2=$f2> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } } echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =m.php?chanl=new_libchal&f=$f&f2=$f2> <img src=write.gif border=0> </a></td> <td bgcolor=black width=100> <a href =userin.php?chanl=main_view&username=$username> <img src=home.gif border=0> </a></td> <td bgcolor=black width=100> <a href =db_view.php?chanl=rootin&file=file> <img src=admin.gif border=0> </a></td> <td bgcolor=black align=right width=150> <form method=post action=m.php> <input type=hidden name=chanl size=14 value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <select name=findtype> <option value=name selected>Name <option value=title>Title <option value=content>Content <option value=t_c>Titl+Cont </select> </font></td> <td bgcolor=black width=150> <input type=text name=findname size=14> </td> <td bgcolor=black width=100> <input type=submit value=Find> </td> </tr> </table> </center> </html> "); } function edit_libchal($ally2 ,$no ,$f ,$f2) { $put3=mysql_fetch_array($ally2); echo(" <html> <title> input_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=m.php> <input type=hidden name=chanl value=edit_libchal_in> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=hidden name=no value=$no> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Title</b></font></td> <td bgcolor=black align=left><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=50 value='$put3[title]'></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=name size=10 value='$put3[name]'></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Passw</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passw size=10></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=email size=20 value='$put3[email]'></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=content rows=10 cols=70 >$put3[content]</textarea></font></td> </tr> <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=수정하기> </font></td> </tr> </table> </form> </center> </body> </html> "); } function view_title($ally2 ,$ally3 ,$no ,$f ,$f2) { $put=mysql_fetch_array($ally2); $content=nl2br($put[content]) ; $size = filesize("/ftp/pub/$put[path]"); $t_num=mysql_num_rows($ally3); echo(" <html> <title> view_title html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=white align=center width=120> <font style='font-size:13px;font-style:italic;color:#blue'><b>$no No</b></font></td> <td bgcolor=white align=center width=580> <font style='font-size:13px;font-style:italic;color:#black'> <b>$put[title]</b></font></td> </tr> </table> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 align=center width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[wdate]</b></font></td> <td bgcolor=#808080 align=center width=200><a href = mailto:$put[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>name:$put[name]</b></font></a></td> <td bgcolor=#808080 align=center width=280> <a href ='ftp://192.168.0.3/home/ftp/pub/$put[path]'> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[path]($size Byte)</b></font></a></td> </tr> <tr> <table border=0 cellspacing=2 cellpadding=2 width=700 height=250> <td bgcolor=black valign=top colspan=3 width=700 height=250> <font style='font-size:13px;font-style:italic;color:blue'><b>$content</b></font></td> </tr> <tr> <td bgcolor=blue width=700> </td> </tr> </table> <table border=0 cellspacing=2 cellpadding=2 width=700 height=100> "); for($s=1 ; $s <= $t_num ; $s++) { $put2=mysql_fetch_array($ally3); $content=nl2br($put2[content]); echo(" <tr> <td bgcolor=#808080><a href = mailto:$put2[email] > <font style='font-size:13px;font-style:italic;color:black'> <b>$put2[name]님이 말하길^^;</b> </font></a></td> <td bgcolor=#808080 align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>$put2[wdate]</b> </font></td> </tr> <tr> <td bgcolor=black width=700 height=100> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>$content</b> </font></td> </tr> "); } echo(" </table> <table border=0 cellspacing=2 cellpadding=2 width=700 height=100> <tr> <td bgcolor=black >   </td> </tr> <tr> <td bgcolor=black width=200> <a href =m.php?chanl=input_newlibchal&tnum=$no&f=$f&f2=$f2> <img src=write.gif border=0></a></td> <td bgcolor=black width=><a href =m.php?chanl=main_view&f=$f&f2=$f2> <img src=list.gif border=0></a></td> <td bgcolor=black ><a href =m.php?chanl=edit_libchal&no=$no&f=$f&f2=$f2> <img src=rewrite.gif border=0></a></td> <td bgcolor=black ><a href =m.php?chanl=del&no=$no&f=$f&f2=$f2> <img src=delete1.gif border=0></a></td> </tr> </table> </center> </html> "); } function error_view($title ,$name ,$passw ,$email ,$content ,$f ,$f2) { if(!$title) { echo(" <script> window.alert('주제가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$name) { echo(" <script> window.alert('이름이 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$passw) { echo(" <script> window.alert('passw가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$email) { echo(" <script> window.alert('메일 주소가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$content) { echo(" <script> window.alert('내용이 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } } function input_newlibchal($tnum ,$f ,$f2) { echo(" <html> <title> input_newlibchal html </title> <head> </head> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=m.php> <input type=hidden name=chanl value=input_newlibchal> <input type=hidden name=chanl2 value=input_newlibchal2> <input type=hidden name=tnum value=$tnum> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=name size=10></font></td> </tr> <tr> <td bgcolor=#808080 width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=email size=24></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=content rows=10 cols=70></textarea></font></td> </tr> </table> <br><br> <table border=0 cellspacing=2 cellpadding=2 width=71% > <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=글올리기> <input type=reset value=지우기></font></td> </tr> </table> </form> </center> </body> </html> "); } function input_view($f ,$f2) { echo(" <html> <title> input_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post enctype=multipart/form-data action=m.php> <input type=hidden name=chanl value=input_new> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Title</b></font></td> <td bgcolor=black align=left><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=44></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=name size=10></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Passw</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passw size=10></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=email size=24></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~up File</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=file name=upfile size=24></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=content rows=10 cols=70></textarea></font></td> </tr> <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=자료등록> <input type=reset value=지우기></font></td> </tr> </table> </form> </center> </body> </html> "); } function del($no ,$f ,$f2 ,$root) { echo(" <html> <title> input_newlibchal html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=m.php> <input type=hidden name=chanl value=del_no> <input type=hidden name=tnum value=$no> <input type=hidden name=no value=$no> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~passw</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passw size=10></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=지우기> </font></td> </table> </tr> </form> </center> </body> </html> "); } ?>
자료실 소스 구성
이 자료실의 각 화면은 함수 형식으로 만든 것입니다. 이 파일에 새로운 자료실 화면을 추가할 수 있으며 m.php의 화면 구성을 바꿀 수 있습니다.
database 접속과 검색 모드 만들기
f.php 파일의 처음에 이 부분이 들어 가며 자료실의 자료를 검색하기 위해 mysql의 query를 모드 별로($findtype) 나누어 나열했습니다. <?php $connect = mysql_connect('localhost' ,'root' ,'gksmf444'); mysql_select_db('libchal' ,$connect); /* mysql 접속과 데이터베이스를 선택하게 합니다. */ if($findtype == name) { $ally = mysql_query("select no ,title ,name ,hit ,wdate ,email ,path from $f where name like '%$findname%' order by no " ,$connect); } /* $findtype이 name일 경우 mysql query는 해당 테이블($f)에서 이름에 관해 검색합니다. 여기서 $f는 자료실 테이블을 나타내는 변수이며, 여러 개의 자료실을 처리하기 위해 변수를 사용합니다. 만약 특정 자료실만 검색하려면 해당 자료실 테이블 명을 적어주면 됩니다. 하지만 궁극적인 목적이 여러 개의 자료실 생성이고 사용이므로 자료실 테이블은 변수로 사용합니다. 쿼리의 검색은 like문을 사용해서 검색합니다. Like문의 자세한 내용은 mysql 설명 부분을 참고하세요. */ if($findtype == title) { $ally = mysql_query("select no , title , name , hit , wdate , email , path from $f where title like '%$findname%' order by no " ,$connect); } /* $findtype 이 title일 때 해당 테이블에서 제목을 검색합니다. */ if($findtype == content) { $ally = mysql_query("select no ,title ,name ,hit ,wdate ,email ,path from $f where content like '%$findname%' order by no " ,$connect); } /* $findtype이 content일 때 해당 테이블에서 내용을 검색합니다. */ if($findtype == t_c) { $ally = mysql_query("select no ,title ,name ,hit ,wdate ,email ,path from $f where title like '%$findname%' or content like '%$findname%' order by no " ,$connect); } /* $findtype가 t_c일 때 해당 테이블에서 제목과 내용을 검색합니다. */ if(!$findtype) { $ally = mysql_query("select no ,title ,name ,hit ,wdate ,path ,email from $f order by no " ,$connect);//$connection 생략 했음 } /* $findtype이 없을 경우 해당 테이블에서 모든 자료를 번호 순으로 정렬합니다. */ $ally4 = mysql_query("select no ,hit ,passw ,name ,path from $f where no='$no'" ,$connect ); /* 해당 테이블 특정 번호에($no) 해당하는 글을 검색합니다. */ $ally3 = mysql_query("select name ,email ,tnum ,wdate ,content from $f2 where tnum ='$no' order by tnum desc" ,$connect ); /* 해당 테이블($f2 - 자료실 응답 글 테이블) 특정 번호에 해당하는 응답 글을 검색합니다. 이것은 해당 글의 응� 글을 검색하는 것입니다. */ $ally2 = mysql_query("select no ,email ,title ,name ,content ,path ,wdate from $f where no='$no'" ,$connect ); /* 해당 테이블 특정 번호에 해당하는 글의 정보를 검색합니다. */ $t_num=mysql_num_rows($ally); /* 자료실 메인 테이블에 등록된 모든 자료의 수를 저장합니다. */ $putup = mysql_fetch_array($ally4); /* 자료실 메인 테이블에 등록된 특정 번호의 자료 정보를 $putup 변수에 배열로 저장합니다. */ ?>
main_view( ) 함수
처음 자료실 접속했을 때 메인 화면을 출력하는 함수입니다. 자료실 메인 화면 그림을 참고하세요.
함수 인자
function main_view($t_num , $ally , $page , $findtype , $findname , $f , $f2 , $root , $username) /* 자료실 메인 화면을 출력하기 위해 전달받는 인자들입니다. $t_num - 해당 테이블의 등록된 자료의 숫자를 전달합니다. $ally - 해당 테이블의 등록된 모든 자료의 정보를 전달합니다. $page - 해당 테이블의 페이지를 전달합니다. $findtype - 해당 테이블의 검색 모드를 전달합니다. $findname - 해당 테이블의 검색 단어를 전달합니다. $f - 자료실 테이블의 메인 화면 테이블을 전달합니다. 여러 게시판 사용을 위함입니다. $f2 - 자료실 테이블의 응답 글 테이블을 전달합니다. $root - 자료실 메인 화면에 유저의 접속과 admin의 접속을 구분하기 위해 admin 접속 유무를 전달합니다. $username - 해당 사이트에 로그인한 ID 세션을 전달합니다.
페이지 설정과 admin 표시 만들기
$p_dip = 4 ; /* 페이지당 글 수 */ $p_page =5 ; /* 페이지당 페이지 링크수 */ $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; /* ceil 함수를 이용해서 최소의 정수를 구해 줍니다. */ if(!$page) { $page = 1; } /* 전달된 페이지 번호가 없을 경우 1 페이지로 설정합니다. */ if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; /* 다음 페이지를 구합니다. */ $pre_p = $page - 1 ; /* 이전 페이지를 구합니다. */ $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; /* 자료실의 한 페이지에 출력하는 글의 시작 번호를 출력합니다. */ if(!$root) { $admin = "User " ; } else { $admin = "Admin 입니다."; } /* $root가 있을 경우 $admin 변수를 할당합니다. */
등록된 자료가 없을 경우
자료실에 등록된 자료가 없는 초기에 보여주는 화면입니다. 이 경우는 if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=6><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 글이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } /* 해당 자료실 테이블에 등록된 자료 수가($t_num) 없을 경우 출력하는 부분입니다. */

등록된 자료 글 출력하기
$t_num이 있을 때 for문을 이용해서 해당 자료실 테이블의 글을 페이지 글 수만큼 출력합니다. for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { if($pd >= 0 ) { /* 페이지당 글 수만큼 $pd가 0보다 크거나 같을 때 실행합니다. */ mysql_data_seek($ally ,$pd); /* 해당 자료실 테이블의 자료에서 다음 자료로 이동시킵니다. */ $put=mysql_fetch_array($ally); /* 해당 자료실 테이블의 정보를 배열로 저장합니다. */ echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> $put[no]</font></td> /* 해당 자료의 번호를 출력합니다. */ <td bgcolor=black> <a href ='m.php?chanl=title&no=$put[no]&f=$f&f2=$f2'> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[title]</b></font></a></td> /* 해당 자료의 제목을 출력합니다. */ <td bgcolor=black align=center> <a href = mailto:$put[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[name]</b></font></a></td> /* 해당 자료의 등록자 이름을 출력합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[hit]</b></font></td> /* 해당 자료의 조회 수를 출력합니다. */ <td bgcolor=black align=center> <a href ='ftp://192.168.0.3/home/ftp/pub/$put[path]'> <font style='font-size:13px;font-style:italic;color:blue'> <img src=disksmblk.gif border=0></font></a></td> /* 해당 자료의 위치를 디스켓 이미지로 링크 시킵니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[wdate]</b></font></td> /* 해당 자료의 등록 날짜를 출력합니다. */ </tr> "); } }
이전 page 링크 만들기
if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } /* $page가 1일 경우 first에 해당 페이지를 링크하지 않습니다. */ else { echo (" <a href =m.php?chanl=main_view&page=$pre_p&f=$f&f2=$f2> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } /* $page가 1이 아닐 경우 << 기호에 $pre_p 변수를 링크합니다. 이것은 이전 페이지로 이동 가능하게 합니다. */
페이지 링크 만들기
페이지 링크는 자료실 하단에 [1][2][3][4]…를 표현하기 위함입니다. 자료실 메인 화면을 참고 하세요. for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } /* 출력하는 페이지 링크가 현재 페이지와 같을 경우 링크를 만들지 않습니다. */ else { if($pp > 0 && $pp <= $t_page) { echo(" <a href =m.php?chanl=main_view&page=$pp&f=$f&f2=$f2> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a>"); } /* 링크 페이지는 0보다 크고 그리고 총 페이지보다 작거나 같을 때 생성합니다. */ } }
다음 페이지 링크만들기
if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font>"); } /* 현재 페이지가 총 페이지와 같을 경우 last^^에 링크를 만들지 않습니다. */ else { echo (" <a href =m.php?chanl=main_view&page=$next_p&f=$f&f2=$f2> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } /* 현재 페이지가 총 페이지와 같지 않을 경우 >> 기호에 링크를 만듭니다. */
다른 메뉴 링크 만들기
자료실 메인 화면과 나머지 화면들에서 다른 화면으로 이동하는 링크를 만듭니다. 이것은 보통 top 화면과 자료등록 , 지우기 , 고치기 등입니다. echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =m.php?chanl=new_libchal&f=$f&f2=$f2> <img src=write.gif border=0> </a></td> /* 해당 테이블의 자료실에 자료를 등록하는 화면으로 링크합니다. */ <td bgcolor=black width=100> <a href =userin.php?chanl=main_view&username=$username> <img src=home.gif border=0> </a></td> /* 해당 자료실 테이블에서 사이트 메인 화면으로 링크합니다. */ <td bgcolor=black width=100> <a href =db_view.php?chanl=rootin&file=file> <img src=admin.gif border=0> </a></td> /* 해당 자료실 테이블에서 admin 접속 화면으로 링크합니다. */ <td bgcolor=black align=right width=150> <form method=post action=m.php> <input type=hidden name=chanl size=14 value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <select name=findtype> <option value=name selected>Name <option value=title>Title <option value=content>Content <option value=t_c>Titl+Cont </select> </font></td> /* 해당 자료실 테이블에서 이름 , 제목 , 내용 , 제목과 내용을 선택하는 form문을 만듭니다. 이것은 해당 자료� 테이블에서 위 인자들에 대한 검색을 하기 위함입니다. */ <td bgcolor=black width=150> <input type=text name=findname size=14> /* $findname 변수에 검색 단어를 저장합니다. 이 변수를 이용해서 해당 테이블을 검색합니다. */ </td> <td bgcolor=black width=100> <input type=submit value=Find> /* find 버튼을 생성합니다. */ </td> </tr> </table> </center> </html> ");
edit_libchal( ) 함수
자료실의 글을 수정하는 함수입니다. 자료실의 해당 자료를 수정하는 것은 아니고 자료 제목과 이름 등을 수정할 수 있게 합니다.

함수 인자
edit_libchal($ally2 ,$no ,$f ,$f2) 자료실 글 내용과 제목 이름 등을 수정 하려면 해당 자료에 대한 번호와 테이블 데이터베이스 Query를 전달받아야 됩니다. $ally2 - 해당 자료에 대한 데이터베이스 검색을 전달합니다. $no - 해당 자료의 번호를 전달합니다. $f - 해당 자료실의 메인 테이블 이름을 전달합니다. $f2 - 해당 자료실의 응답 글 테이블 이름을 전달합니다.
원본 자료의 정보 저장 하기
$put3=mysql_fetch_array($ally2); /* $ally2는 수정할 자료 번호에 대해 데이터베이스에서 검색한 자료의 정보이며 , 이것을 $put3 변수에 배열로 저장합니다. */
수정 항목 전달 form문 만들기
수정할 자료 목록을 수정한 후 수정된 항목들을 전달하기 위해 form문을 만듭니다. <form method=post action=m.php> <input type=hidden name=chanl value=edit_libchal_in> /* m.php파일에서 $chanl이 edit_libchal_in 인 항목에 수정 사항을 전달합니다. */ <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=hidden name=no value=$no> /* 해당 자료실 테이블 이름 두개와 자료 번호를 전달합니다. */
입력란 만들기
선택한 자료의 정보를 입력하는 부분을 만듭니다. 물론 처음 등록한 유저의 ID와 패스워드가 일치해야 수정 가능합니다. <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Title</b></font></td> <td bgcolor=black align=left><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=50 value='$put3[title]'></font></td> /* 해당 자료의 제목을 출력하고 수정할 수 있습니다. $put3[title] 변수에 ‘ ’를 한 것은 해당 제목에 공백이 있을 경우 같이 출력하게 하는 것입니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=name size=10 value='$put3[name]'></font></td> </tr> /* 해당 자료의 등록자 이름을 출력하고 수정하게 합니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Passw</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passw size=10></font></td> </tr> /* 해당 자료의 등록자 패스워드를 입력 하는 부분입니다. Type는 password로 다른 사람이 볼 수 없게 합니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=email size=20 value='$put3[email]'></font></td> </tr> /* 해당 자료의 등록자 메일 주소를 출력하고 수정하는 부분 입니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=content rows=10 cols=70 >$put3[content]</textarea></font></td> </tr> /* 해당 자료의 설명을 출력하고 수정하는 부분 입니다. Textarea의 경우 해당 자료 정보는 <textarea>와 </textarea> 사이에 넣어 줍니다.*/ <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=수정하기> </font></td> </tr> </table> </form> /* 수정한 모든 항목을 m.php 파일에 전달하기 위해 수정하기 버튼을 생성하고 , form문을 종료합니다. */
view_title($ally2 ,$ally3 ,$no ,$f ,$f2) 함수
선택한 자료의 정보를 상세하게 보여주는 함수입니다. 즉 , 자료실 메인 화면에서 특정 자료의 제목을 클릭하면 보여주는 부분이며 , 자료에 대한 설명과 등록자 응답 글 등을 출력합니다.

함수 전달 인자
view_title($ally2 , $ally3 , $no , $f , $f2) 특정 자료의 설명과 등록자 , 응답 글 등을 볼 수 있게 하기 위해 여러 인자들을 사용합니다. $ally2 - 해당 테이블에서 선택한 자료 번호에 대한 데이터베이스 검색 결과를 전달합니다. $ally3 - 응답 글 테이블에서 선택한 자료 번호의 응답 글 정보를 전달합니다. $no - 선택한 자료 번호를 전달합니다. $f - 자료실 메인 테이블 이름을 전달합니다. $f2 - 자료실 응답 글 테이블 이름을 전달합니다.
선택한 자료의 정보 저장하기
$put=mysql_fetch_array($ally2); /* $ally2는 선택한 자료에 대한 검색 결과를 전달합니다. $put 변수에 배열로 저장합니다.*/ $content=nl2br($put[content]) ; /* nl2br( ) 함수를 이용해서 선택한 자료의 설명 내용 중 nl 부분을 <br>로 변환합니다. 이것은 HTML로 브라우저에 출력하기 때문에 처음 글 등록 때 enter를 입력한 부분을 다시 <br>로 변환하는 것입니다. */ $size = filesize("/ftp/pub/$put[path]"); /* filesize( ) 함수를 이용해서 등록한 자료의 크기를 byte로 구합니다. */ $t_num=mysql_num_rows($ally3); /* 선택한 자료의 응답 글의 수를 $t_num 변수에 저장합니다. */
자료 정보 출력하기
선택한 자료의 정보를 출력하는 부분입니다. 즉 해당 자료의 크기 , 등록자 , 등록일 , 번호 , 자료 설명 등이 있습니다. <tr> <td bgcolor=white align=center width=120> <font style='font-size:13px;font-style:italic;color:#blue'><b>$no No</b></font></td> /* 선택한 자료의 번호를 출력합니다. */ <td bgcolor=white align=center width=580> <font style='font-size:13px;font-style:italic;color:#black'><b>$put[title]</b></font></td> /* 선택한 자료의 제목을 출력합니다. */ </tr> </table> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 align=center width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[wdate]</b></font></td> /* 선택한 자료의 등록 날짜를 출력합니다. */ <td bgcolor=#808080 align=center width=200> <a href = mailto:$put[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>name:$put[name]</b></font></a></td> /* 선택한 자료의 등록자를 출력하고 등록자의 메일 주소를 링크합니다. */ <td bgcolor=#808080 align=center width=280> <a href ='ftp://192.168.0.3/home/ftp/pub/$put[path]'> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[path]($size Byte)</b></font></a></td> /* 선택한 자료의 자료 이름을 출력하고 자료의 위치를 링크합니다. 위 링크의 경우 레드핫 리눅스의 경우 ftp는 자동으로 설정되어 있으며 링크를 ftp://서버 명/pub/$put[path]로 설정 하면 됩니다. 이것은 리눅스의 설정에 따라 다를 경우가 있으며 자신의 ftp 서버의 설정을 nobody 접속이 가능하도록 해야하고 해당 디렉토리의 퍼미션 또한 nobody 유저가 접속 가능 하도록 해야 합니다. */ </tr> <tr> <table border=0 cellspacing=2 cellpadding=2 width=700 height=250> <td bgcolor=black valign=top colspan=3 width=700 height=250> <font style='font-size:13px;font-style:italic;color:blue'><b>$content</b></font></td> </tr> /* 해당 자료의 설명을 출력합니다. */
응답 글 출력하기
해당 자료에 대한 응답 글을 출력하게 합니다. 즉 , 선택한 자료의 번호를 이용해서 그 자료에 대한 응답 글을 검색하고 출력합니다. for($s=1 ; $s <= $t_num ; $s++) { $put2=mysql_fetch_array($ally3); $content=nl2br($put2[content]); /* 선택한 자료의 응답 글 정보를 $put2 변수에 배열로 저장합니다. 그리고 nl2br( ) 함수를 이용해서 응답 글의 내용을 수정합니다. */ echo(" <tr> <td bgcolor=#808080><a href = mailto:$put2[email] > <font style='font-size:13px;font-style:italic;color:black'> <b>$put2[name]님이 말하길^^;</b> </font></a></td> /* 해당 자료의 응답 글 등록자를 출력하고 메일 주소를 링크합니다. */ <td bgcolor=#808080 align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>$put2[wdate]</b> </font></td> </tr> /* 응답 글 등록 날짜를 출력합니다. */ <tr> <td bgcolor=black width=700 height=100> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>$content</b> </font></td> </tr> /* 응답 글 내용을 출력합니다. */ "); }
error_view($title ,$name ,$passw ,$email ,$content ,$f ,$f2) 함수
자료를 등록했을 경우 등록 항목 중 비어있는 부분을 체크하는 부분입니다.

에러 화면 출력 하기
자료 등록 때 각 항목의 입력 여부만을 확인합니다. 간단한 java 스크립트를 이용해서 해당 항목이 없을 경우 에러 박스를 출력합니다. if(!$title) { echo(" <script> window.alert('주제가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 자료 제목을 입력하지 않았을 경우 출력하는 부분이며 나머지 항목의 에러 출력도 같은 방법으로 구성 했습니다 */
input_newlibchal($tnum , $f , $f2) 함수
해당 자료의 응답 글을 등록하기 위해 입력하는 부분입니다.

form문과 전달 인자
응답 글을 입력하고 해당 인자들을 m.php파일에 전달 하기위해 form문 만듭니다. 이 함수의 전달 인자는 $tnum(응답 글의 번호) , $f , $f2가 있습니다. <form method=post action=m.php> <input type=hidden name=chanl value=input_newlibchal> <input type=hidden name=chanl2 value=input_newlibchal2> /* 등록한 응답 글 항목을 m.php 파일의 $chanl이 input_newlibchal이고 $chanl2가 input_newlibchal2인 항목에 전달하는 form문을 만듭니다. */ <input type=hidden name=tnum value=$tnum> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> /* 해당 자료실의 두개의 테이블과 응답 글 번호를 전달합니다. */

파일 등록을 위한 form문
파일 등록을 위해 form문의 설정을 enctype=multipart/form-data로 합니다. 하지만 이 설정 이외에 PHP.INI의 파일 설정 부분을 조금 수정해서 사용할 수 있습니다. 파일 등록 용량의 설정 , 저장할 디렉토리 등의 설정을 할 수 있으며 여기에 사용하는 방법은 디폴트 설정이며 form문의 설정만 해서 사용하면 됩니다. <form method=post enctype=multipart/form-data action=m.php> <input type=hidden name=chanl value=input_new> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2>
입력란 만들기
자료 등록을 위해 여러 입력 사항과 파일을 선택하는 부분을 만듭니다. <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Title</b></font></td> <td bgcolor=black align=left><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=44></font></td> </tr> /* 등록 자료의 제목을 입력하는 부분입니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=name size=10></font></td> </tr> /* 등록 자료의 등록자 이름을 입력하는 부분입니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Passw</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passw size=10></font></td> </tr> /* 등록자 패스워드를 입력하는 부분이며 password type입니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=email size=24></font></td> </tr> /* 등록자의 메일 주소를 입력하는 부분입니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~up File</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=file name=upfile size=24></font></td> </tr> /* 등록할 파일을 찾는 부분입니다. Type=file로 설정하며 이것은 자신의 컴퓨터에서 등록할 파일을 찾을 수 있게 합니다. */

<tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=content rows=10 cols=70></textarea></font></td> </tr> /* 등록할 자료의 설명을 입력하는 부분입니다. */ <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=자료등록> <input type=reset value=지우기></font></td> </tr> /* 자료 등록을 위해 입력한 사항과 파일을 m.php에 보내기 위해 "자료등록" 버튼을 만듭니다. 그리고 모든 항목을 다시 입력하기 위해 "지우기" 버튼을 만듭니다. */
del($no ,$f ,$f2 ,$root) 함수
등록한 자료를 지우는 함수입니다. 전달 인자는 $no(해당 자료 번호) , $f , $f2 , $root(admin) 입니다. 여기서 $root 변수를 전달하는 것은 해당 자료를 admin이 등록자 패스워드 없이 지우게 하는 역할을 합니다.

form문 만들기
해당 자료를 삭제하기 위해 form문으로 자료 정보를 전달합니다. <form method=post action=m.php> <input type=hidden name=chanl value=del_no> /* m.php 파일의 $chanl=del_no인 항목으로 해당 자료의 정보를 전달합니다. */ <input type=hidden name=tnum value=$no> <input type=hidden name=no value=$no> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> /* 해당 자료의 번호($tnum)와 응답 글 번호($no) , 자료실 두 테이블 이름을 전달합니다.*/
패스워드 입력란 만들기
등록자의 패스워드 입력란을 만듭니다. <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~passw</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passw size=10></font></td> /* 해당 자료 등록자의 패스워드를 입력하는 부분입니다. */ <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=지우기> </font></td> /* 입력한 패스워드를 전달하기 위해 "지우기" 버튼을 생성합니다. */
13.2 m.php 전체 코드
f.php의 함수들을 브라우저에 출력하기 위한 스크립트로 구성되어 있습니다.
<?php session_start(); ////////////////////////////////////////////////// // // 일자 : 2000.3.27 pm 5 // 작성자: skycry (hong il) // // // method : 자료실 메인 화면들..^^; // ////////////////////////////////////////////////// ?> <?php if($username) { include('f.php'); if($chanl == new_libchal && $username != guest) { input_view($f ,$f2) ; mysql_close($connect); } if($chanl == new_libchal && $username == guest) { echo(" <script> window.alert('guest는 이용할 수 없습니다.') history.go(-1) </script> "); exit; } if($chanl == input_new) { error_view($title ,$name ,$passw ,$email ,$content ,$f ,$f2); $max = mysql_query("select max(no) from $f " ,$connect ); $new_no = mysql_result($max ,0 ,0); $no = $new_no + "1" ; $wdate = date("y-m-d"); $gg=explode("." ,"$upfile_name"); $tt=$gg[sizeof($gg)-1]; $path= "/home/ftp/pub/$upfile_name"; if($tt == "php" || $tt == "php3" || $tt == "php4" || $tt == "html" || $tt == "htm" || $tt == "inc" || $tt == "txt" ) { echo(" <script> window.alert('이 화일은 등록 할 수 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(file_exists("$path")) { echo(" <script> window.alert('같 이름의 화일이 존재합니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } else { copy("$upfile" ,"$path"); mysql_query("insert into $f(title ,name ,passw ,path ,email ,content ,wdate ,no) values('$title' ,'$name' ,password('$passw') ,'$upfile_name' ,'$email' ,'$content' , '$wdate' ,'$no')" ,$connect); echo(" <html> <body> <center> <form method=post action=m.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 등록 되었습니다</b></font> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); unlink($upfile); mysql_close($connect); } } if($chanl == input_newlibchal) { if($chanl2 == input_newlibchal2) { $wdate = date("y-m-d"); mysql_query("insert into $f2(name ,email ,tnum ,wdate ,content) values('$name' ,'$email' ,'$tnum' ,'$wdate' ,'$content')" ,$connect); echo(" <html> <body> <center> <form method=post action=m.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 등록 되었습니다</b></font> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); } else { input_newlibchal($tnum ,$f ,$f2) ; } mysql_close($connect); } if($chanl == edit_libchal) { edit_libchal($ally2 ,$no ,$f ,$f2) ; mysql_close($connect); } if($chanl == edit_libchal_in) { error_view($title ,$name ,$passw ,$email ,$content ,$f ,$f2); $input=mysql_query("select password('$passw') " ,$connect ); $inputpassw = mysql_result($input ,0 ,0); if($putup[passw] == $inputpassw) { mysql_query("update $f set title='$title' , name='$name' ,passw=password('$passw') , email='$email', content='$content' where no = '$no'" ,$connect); mysql_close; } else { echo(" <script> window.alert('passw가 틀렸습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } echo(" <html> <body> <center> <form method=post action=m.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 수정 되었습니다</b></font> <input type=hidden name=no value=$no> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); mysql_close($connect); } if($chanl == title) { mysql_query("update $f set hit = '$putup[hit]'+1 where no = '$no'" ,$connect) ; view_title($ally2 ,$ally3 ,$no ,$f ,$f2) ; mysql_close($connect); } if($chanl == main_view) { mysql_select_db('adminp' ,$connect); mysql_query("update file set sum='$t_num' where mview = '$f'" ,$connect); main_view($t_num ,$ally ,$page ,$findtype ,$findname ,$f ,$f2 ,$root ,$username); mysql_close($connect); } if($chanl == del) { del($no ,$f ,$f2 ,$root); mysql_close($connect); } if($chanl == del_no) { $input=mysql_query("select password('$passw') " ,$connect ); $inputpassw = mysql_result($input ,0 ,0); if($putup[passw] == $inputpassw || $root ) { unlink("/home/ftp/pub/$putup[path]"); $mldel = "delete from $f where no=$no"; $rsult = mysql_query($mldel ,$connect); $ml2del = "delete from $f2 where tnum=$tnum "; $rsult2 = mysql_query($ml2del ,$connect); } else { echo(" <script> window.alert('passw가 틀렸습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } echo(" <html> <body> <center> <form method=post action=m.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 삭제 되었습니다</b></font> <input type=hidden name=no value=$no> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); mysql_close($connect); } } else { echo(" <script> window.alert('Login 하세요.') history.go(-1) </script> "); exit; } ?>
소스 설명
m.php는 f.php 파일의 함수를 화면에 다양한 방법으로 출력하게 합니다. 그 밖에 전달 받은 인자와 자료를 데이터베이스에 입력하고 삭제하는 기능을 합니다.
세션 항목
자료실의 각 화면을 출력하는 함수의 실행은 등록된 ID의 로그인 여부에 따라 권한을 달리합니다. session_start(); /* 세션을 시작합니다. */ if($username) { /* 로그인 한 세션을 가진 ID가 있을 경우입니다. */ include('f.php'); /* f.php 파일의 함수를 포함합니다. 그리고 if($username){ 와 }else 사이에 각 화면의 함수 출력 부분을 둡니다. 이것은 세션으로 로그인했을 경우만 화면을 보여주기 위함이며 if문 안에 보다 세부적으로 설정할 수 있습니다. */ } else { echo(" <script> window.alert('Login 하세요.') history.go(-1) </script> "); exit; } /* 등록된 ID로 로그인하지 않았을 경우 출력하는 화면입니다. */
자료 등록 모드
if($chanl == new_libchal && $username != guest) { input_view($f ,$f2) ; mysql_close($connect); } /* $chanl = new_libchal이고 로그인한 세션이 guest가 아닐 경우 자료 등록 화면을 출력합니다. */ if($chanl == new_libchal && $username == guest) { echo(" <script> window.alert('guest는 이용할 수 없습니다.') history.go(-1) </script> "); exit; } /* 만약 로그인한 세션이 guest일 경우 해당 메시지 박스를 출력합니다. */
자료를 서버와 데이터베이스에 저장하기
자료 등록 화면에서 자료에 대한 정보를 서버와 데이터베이스에 저장하는 항목을 만듭니다. if($chanl == input_new) { /* $chanl=input_new일 때 실행합니다. */ error_view($title , $name , $passw , $email , $content , $f , $f2); /* 전달 되어온 자료 정보의 입력 여부를 체크합니다. */ $max = mysql_query("select max(no) from $f " ,$connect ); /* 해당 테이블의 자료 중 가장 높은 번호를 검색합니다. */ $new_no = mysql_result($max ,0 ,0); /* 가장 높은 번호를 $new_no 변수에 저장합니다. */ $no = $new_no + "1" ; /* 새롭게 등록되는 자료의 번호를 부여합니다. */ $wdate = date("y-m-d"); $gg=explode("." ,"$upfile_name"); /* 전달 되어온 파일을 explode( ) 함수를 이용해서 파일 이름과 확장자를 구분합니다. */ $tt=$gg[sizeof($gg)-1]; /* 전달 되어온 파일의 확장자를 $tt 변수에 저장합니다. */ $path= "/home/ftp/pub/$upfile_name"; /* 전달 되어온 파일 이름을 path와 함께 $path에 저장합니다. 위는 레드핫 리눅스의 경우 입니다. 모든 ftp 설정이 디폴트일 경우이며 해당 디렉토리는 nobody가 접근 가능한 상태 입니다. */ if($tt == "php" || $tt == "php3" || $tt == "php4" || $tt == "html" || $tt == "htm" || $tt == "inc" || $tt == "txt" ) { echo(" <script> window.alert('이 파일은 등록할 수 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 업로드 되는 파일의 확장자를 구분해서 등록할 수 없는 파일을 가려 냅니다. 만약 위 조건에 해당할 경우 에러 박스 화면을 출력합니다. */ if(file_exists("$path")) { echo(" <script> window.alert('같은 이름의 화일이 존재합니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 등록 되는 파일과 똑 같은 이름의 파일이 존재하는지 알아보고 있을 경우 에러 화면을 출력합니다. */ else { copy("$upfile" ,"$path"); /* 업로드 되는 파일을 PHP.INI의 파일 설정에서 정한 디렉토리에서 $path 변수가 가리키는 디렉토리로 copy합니다. 여기서는 PHP.INI 설정을 디폴트로 했으며 /tmp 디렉토리로 처음 파일을 업로드합니다. */ mysql_query("insert into $f(title ,name ,passw ,path ,email ,content ,wdate ,no) values('$title' ,'$name' ,password('$passw') ,'$upfile_name' ,'$email' ,'$content' , '$wdate' ,'$no')" ,$connect); /* 자료실 메인 테이블에 등록하는 자료의 정보를 저장합니다. Password의 경우 mysql 암호화 방식을 통해 저장합니다. */ echo(" <html> <body> <center> <form method=post action=m.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 등록되었습니다</b></font> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); unlink($upfile); /* 글의 등록 여부를 출력하고 , 디폴트로 업로드된(/tmp) 파일을 삭제합니다. */ mysql_close($connect); } }
응답 글 입력 화면과 데이터베이스 저장 만들기
선택한 자료의 응답 글을 입력하는 부분과 입력된 응답 글의 항목들을 데이터베이스에 저장하는 부분을 만듭니다. if($chanl == input_newlibchal) { /* $chanl=input_newlibchal 일 때 응답 글을 입력하는 화면을 출력합니다. */ if($chanl2 == input_newlibchal2) { /* $chanl=input_newlibchal , $chanl2 == input_newlibchal2 일 때 입력한 응답 글의 내용을 데이터베이스에 저洋爛求�. */ $wdate = date("y-m-d"); mysql_query("insert into $f2(name ,email ,tnum ,wdate ,content) values('$name' ,'$email' ,'$tnum' ,'$wdate' ,'$content')" ,$connect); /* 전달 되어온 응답 글의 내용을 응답 글 테이블에 저장합니다. */ echo(" <html> <body> <center> <form method=post action=m.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 등록 되었습니다</b></font> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> /* 응답 글 저장을 한 후 확인 화면을 출력하고 , 자료실 메인 화면으로 이동하는 버튼을 생성합니다. */ </form> </center> </body> </html> "); } else { input_newlibchal($tnum ,$f ,$f2) ; } /* 응답 글 입력 화면을 출력합니다. */ mysql_close($connect); }
특정 자료 정보 보여 주기
자료실 메인 화면에서 특정 자료의 제목을 클릭할 경우 출력하는 화면입니다. if($chanl == title) { mysql_query("update $f set hit = '$putup[hit]'+1 where no = '$no'" ,$connect) ; /* $chanl= title 일 때 해당 자료의 조회수를 1 더해서 저장합니다. */ view_title($ally2 ,$ally3 ,$no ,$f ,$f2) ; /* $chanl= title 일 때 특정 자료의 내용을 보여 줍니다. */ mysql_close($connect); }
자료의 삭제
특정 자료를 삭제하기 위한 등록자 패스워드 입력 화면과 패스워드를 이용한 해당 자료의 삭제 루틴을 만듭니다. if($chanl == del) { del($no ,$f ,$f2 ,$root); mysql_close($connect); } /* $chanl=del 일 때 해당 자료를 삭제하기 위한 등록자 패스워드 입력 화면을 출력합니다. */ if($chanl == del_no) { $input=mysql_query("select password('$passw') " ,$connect ); $inputpassw = mysql_result($input ,0 ,0); /* $chanl == del_no일 때 전달 되어온 패스워드를 password( )함수를 이용해서 암호화합니다. */ if($putup[passw] == $inputpassw || $root ) { unlink("/home/ftp/pub/$putup[path]"); /* 전달 되어온 패스워드와 데이터베이스의 패스워드가 일치할 경우 해당 파일을 삭제합니다. */ $mldel = "delete from $f where no=$no"; $rsult = mysql_query($mldel ,$connect); /* 자료실 메인 테이블에서 해당 자료의 정보를 모두 삭제합니다. */ $ml2del = "delete from $f2 where tnum=$tnum "; $rsult2 = mysql_query($ml2del ,$connect); /* 자료실 응답 글 테이블에서 해당 자료의 응답 글의 정보를 모두 삭제합니다. */ } else { echo(" <script> window.alert('passw가 틀렸습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } echo(" <html> <body> <center> <form method=post action=m.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 삭제 되었습니다</b></font> <input type=hidden name=no value=$no> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); /* 해당 자료의 모든 정보를 삭제한 후 확인 버튼을 생성하고 자료실 메인 화면으로 이동하게 합니다. */ mysql_close($connect); } 다음 장에서는 경매 게시판을 설명하겠습니다. 참고. 위 자료실은 지금 쓰는 방식이 아닙니다… 중요한건 위 방법을 이용해서 여러 게시판을 독창적으로 만들어 볼 수 있습니다. 응답형도 말이져… 요즘의 ftp 자료실은 글게시판과 연동해서 많이들 만들며 방법은 헤더를 이용해서 파일을 전송 합니다. 자세한 사항은 몇줄 않됩니다. 하지만 저가 지금 생각이 나질 않는군요. 허접 하지만 만들어둔게 있어 뒤지면 나올 듯 한데 궁금하신 분은 메일 주세요… 그리고 경매의 경우 실시간이 아닙니다. 단지 처리되는 부분만을 구현 했습니다. 실시간으로 구현하는 방법은 여러 가지가 있으며 쉽게 얻어질 것입니다…
14. 경매 게시판 만들기
여기서 구현할 경매 게시판은 어떤 물건이든 자유롭게 경매를 등록할 수 있고 경매 등록자 중심으로 경매가 진행됩니다. 등록자는 경매의 진행 여부를 수정할 수 있으며 삭제까지 할 수 있습니다. 다만 입찰자의 삭제는 해당 경매를 삭제 해야지만 모두 삭제됩니다. 경매 입찰은 기본 경매 가격보다 커야하며 한번만 입찰이 가능합니다. 경매가 종료될 경우 매도자와 낙찰자에게 메일을 전송하며 마감을 게시판에 표시합니다.

14.1 경매 테이블 만들기
경매 게시판의 테이블 역시 두개로 이루어집니다. 게시판의 주요 화면의 정보를 저장하는 테이블과 입찰자의 정보를 저장하는 테이블입니다. 여기서 만들 테이블 역시 만드는 과정만 익히기 바랍니다. Admin 영역에서 게시판 테이블을 생성하는 방법이 있으므로 이것을 이용해서 테이블을 만들어야 합니다. 수작업으로 테이블 이름을 정하고 만들 경우는 단지 경매 게시판만을 만들 경우에 사용합니다. 즉, 경매스크립트의 경매 테이블 이름을 지금 만든 테이블 이름으로 모두 수정해서 사용해야 합니다. 사이트의 기본 구성을 다중 게시판 모드로 했기 때문에 admin 영역에서 게시판을 생성해야 합니다. 물론 경매 스크립트를 실행하기 위해서 경매 테이블 이름을 링크로 전달하는 방법을 사용할 수도 있습니다.
데이터베이스 만들기
mysql>create databases libchal ; 위 libchal 데이터베이스는 자료실 데이터베이스와 같습니다. 만약 경매 게시판과 자료실 게시판 중 하나만 사용하더라도 libchal 데이터베이스는 만들어야 합니다. 자료실 게시판에서 데이터베이스를 만들었다면 다시 만들지 않아도 됩니다.
테이블 만들기
./mysql -u root -p libchal < libchaltest.sql CD의 libchaltest.sql 파일을 이용해서 한번에 경매 게시판 두개의 테이블을 생성합니다. 물론 각 테이블의 속성을 변경할 경우 이 파일을 수정해서 사용하면 됩니다. 그리고, 여기서 생성하는 테이블은 사이트 메인 화면에 나타나지 않습니다. 오직 admin 영역에서 만든 테이블만 사이트 메인 화면에 나타납니다. 만약 여기서 테이블을 생성한 후 이 테이블을 이용해서 경매 스크립트를 테스트하려면 아래와 같은 링크로 사용해야 합니다. <a href ='main_view.php?chanl=main_view&f=경매 메인 테이블명 &f2=경매 입찰자 테이블 명&ssid=$username' > 이것은 자료실의 경우도 마찬가지입니다.

테이블 구성 인자들
경매 테이블의 경우도 두개의 테이블로 구성되어 있으며 스크립트 역시 두개로 이루어져 있습니다. 각각의 구성인자는 경매 메인 테이블의 경우 경매 등록자의 정보를 저장하고 입찰 테이블의 경우 해당 경매 입찰자의 정보를 저장합니다.
경매 메인 테이블
경매 등록자의 정보를 저장합니다. no - 경매의 고유 번호를 저장합니다. name - 경매 등록자 이름을 저장합니다. email - 경매 등록자 메일 주소를 저장합니다. tel - 경매 등록자의 전화번호를 저장합니다. title - 경매 제목을 저장합니다. content - 경매의 내용을 저장합니다. edate - 경매의 마감 날짜를 저장합니다. smoney - 경매의 기본 금액을 저장합니다. wdate - 경매 등록 날짜를 저장합니다. sise - 해당 경매의 입찰 회수를 저장합니다. hit - 경매 조회 수를 저장합니다. no의 경우 자동 증가합니다.
입찰자 테이블
입찰자 정보를 저장하는 항목입니다. no - 입찰자의 고유 번호를 저장합니다. name - 입찰자의 이름을 저장합니다. email - 입찰자의 메일 주소를 저장합니다. tel - 입찰자의 전화 번호를 저장합니다. bmoney - 입찰자의 입찰 금액을 저장합니다. tnum - 해당 경매의 고유 번호를 저장합니다. no의 경우 자동 증가합니다.
14.2 경매 게시판 소스 만들기
경매 게시판의 소스 역시 총 두개로 이루어집니다. 각 화면을 표현하는 함수로 구성되는 파일(func_all.php)과 함수의 다양한 화면 출력을 위한 루틴이 있는 파일로(main_view.php)로 구성됩니다.
func_all.php 전체 코드
<?php ////////////////////////////////////////////////// // // 일자 : 2000.2.15 am 5 // 작성자: skycry (hong il) // // // method : 경매 게시판 functions // ////////////////////////////////////////////////// ?> <?php $connect = mysql_connect('localhost','root','gksmf444'); mysql_select_db('libchal',$connect); if($findtype == name) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f where name like '%$findname%' order by no ",$connect); } if($findtype == title) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f where title like '%$findname%' order by no ",$connect); } if($findtype == content) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f where content like '%$findname%' order by no ",$connect); } if($findtype == t_c) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f where title like '%$findname%' or content like '%$findname%' order by no ",$connect); } if(!$findtype) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f order by no ",$connect);//$connection 생략 했음 } $ally4 = mysql_query("select hit,sise from $f where no='$no'",$connect ); $ally3 = mysql_query("select tnum,no,bmoney,name,tel,email from $f2 where tnum ='$no' order by bmoney desc",$connect ); $ally2 = mysql_query("select smoney,title,edate,content,wdate,name,email,tel from $f where no='$no'",$connect ); $allylib = mysql_query("select tnum,no,name from $f2 where tnum ='$no' order by bmoney desc",$connect ); $t_num=mysql_num_rows($ally); $putup = mysql_fetch_array($ally4); $putup2 = mysql_fetch_array($allylib); $putally2=mysql_fetch_array($ally2); mysql_select_db('selectuser',$connect); $allyuser = mysql_query("select id,name,tel1,email,passwd from userin where id='$username' ",$connect); $putuser = mysql_fetch_array($allyuser); ?> <?php function main_view($s_mail,$t_num,$ally,$page,$findtype,$findname,$f,$f2,$root,$username) { $p_dip = 4 ; $p_page =4 ; $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; if(!$page) { $page = 1; } if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; $pre_p = $page - 1 ; $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; if(!$root) { $admin = "User " ; } else { $admin = "Admin 입니다."; } echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th bgcolor=white colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page : $admin </b></font></th> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>No</b></font></td> <td bgcolor=#808080 width=370> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Title</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Name</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Sise</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Cnt</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>현재</b></font></td> <td bgcolor=#808080 width=125 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>마감</b></font></td> </tr> "); if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=6><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 글이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else { for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { if($pd >= 0 ) { mysql_data_seek($ally,$pd); $put=mysql_fetch_array($ally); $wdate = date('Y-m-d H:i:s'); $title_link1 = "<a href ='main_view.php?chanl=title&no=$put[no]&f=$f&f2=$f2'>"; $title_link2 = "<a href ='main_view.php?chanl=title_end&no=$put[no]&f=$f&f2=$f2'>"; if($put[edate] > $wdate) { $h = "진행중"; $title_link = $title_link1; } if($put[edate] < $wdate) { $h = "마감"; $title_link = $title_link2; $s_mail; } echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:white'> $put[no]</font></td> <td bgcolor=black> $title_link <font style='font-size:13px;font-style:italic;color:white'> <b>$put[title]</b></font></a></td> <td bgcolor=black align=center> <a href = mailto:$put[email] > <font style='font-size:13px;font-style:italic;color:white'> <b>$put[name]</b></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#ff1493'> <b>$put[sise]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[hit]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#008000'> <b>$h</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#9400d3'> <b>$put[edate]</b></font></td> </tr> "); } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } else { echo (" <a href =main_view.php?chanl=main_view&page=$pre_p&f=$f&f2=$f2> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } else { if($pp > 0 && $pp <= $t_page) { echo(" <a href =main_view.php?chanl=main_view&page=$pp&f=$f&f2=$f2> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a>"); } } } if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font>"); } else { echo (" <a href =main_view.php?chanl=main_view&page=$next_p&f=$f&f2=$f2> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } } echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =main_view.php?chanl=new_libchal&f=$f&f2=$f2> <img src=write.gif border=0> </a></td> <td bgcolor=black width=100> <a href =userin.php?chanl=main_view&username=$username> <img src=home.gif border=0> </a></td> <td bgcolor=black width=100> <a href =db_view.php?chanl=rootin> <img src=admin.gif border=0></a></td> <td bgcolor=black align=right width=150> <form method=post action=main_view.php> <input type=hidden name=chanl size=14 value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <select name=findtype> <option value=name selected>Name <option value=title>Title <option value=content>Content <option value=t_c>Titl+Cont </select> </font></td> <td bgcolor=black width=150> <input type=text name=findname size=14> </td> <td bgcolor=black width=100> <input type=submit value=Find> </td> </tr> </table> </center> </html> "); } function edit_libchal($putally2,$no,$f,$f2,$putuser) { echo(" <html> <title> input_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=main_view.php> <input type=hidden name=chanl value=edit_libchal_in> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=hidden name=no value=$no> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 scrolling=no> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Title</b></font></td> <td bgcolor=black align=left> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=50 value='$putally2[title]'></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putally2[name]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Passwd</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#ff1493'> <input type=password name=passwd size=9></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putally2[email]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putally2[tel]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~마감시간</b></font></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <select name=edata1> <option value=2000 selected>Y2K <option value=2001>Y21 </select> <select name=edata2> <option value=1>1mon <option value=2>2mon <option value=3>3mon <option value=4 selected>4mon <option value=5>5mon <option value=6>6mon <option value=7>7mon <option value=8>8mon <option value=9>9mon <option value=10>10mon <option value=11>11mon <option value=12>12mon </select> <select name=edata3> <option value=1>1day <option value=2>2day <option value=3>3day <option value=4>4day <option value=5>5day <option value=6>6day <option value=7>7day <option value=8>8day <option value=9>9day <option value=10>10day <option value=11>11day <option value=12>12day <option value=13>13day <option value=14 selected>14day <option value=15>15day <option value=16>16day <option value=17>17day <option value=18>18day <option value=19>19day <option value=20>20day <option value=21>21day <option value=22>22day <option value=23>23day <option value=24>24day <option value=25>25day <option value=26>26day <option value=27>27day <option value=28>28day <option value=29>29day <option value=30>30day <option value=31>31day </select> <select name=edata4> <option value=am>A.m <option value=pm selected>P.m </select> <select name=edata5> <option value=1>1si <option value=2>2si <option value=3 selected>3si <option value=4>4si <option value=5>5si <option value=6>6si <option value=7>7si <option value=8>8si <option value=9>9si <option value=10>10si <option value=11>11si </select> <select name=edata6> <option value=10>10 <option value=20>20 <option value=30>30 <option value=40 selected>40 <option value=50>50 <option value=00>00 </select> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~기본금액</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#ff1493'> <input type=int name=smoney size=10 value='$putally2[smoney]'> <b>Won</b></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=content rows=10 cols=70 > $putally2[content]</textarea></font></td> </tr> <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=수정하기> </font></td> </tr> </table> </form> </center> </body> </html> "); } function view_title($putally2,$ally3,$no,$f,$f2,$putuser) { $content=nl2br($putally2[content]) ; echo(" <html> <title> view_title html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=white align=center width=120> <font style='font-size:13px;font-style:italic;color:#blue'><b>$no No</b></font></td> <td bgcolor=white align=center width=580> <font style='font-size:13px;font-style:italic;color:#black'> <b>$putally2[title]</b></font></td> </tr> </table> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 align=center width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$putally2[edate]:마감</b></font></td> <td bgcolor=#808080 align=center width=200> <a href = mailto:$putally2[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>name:$putally2[name]</b></font></a></td> <td bgcolor=#808080 align=center width=280> <font style='font-size:13px;font-style:italic;color:red'> <b>기본money:$putally2[smoney]</b></font></td> </tr> <tr> <table border=0 cellspacing=2 cellpadding=2 width=700 height=250> <td bgcolor=black valign=top colspan=3 width=700 height=250> <font style='font-size:13px;font-style:italic;color:blue'><b>$content</b></font></td> </tr> </table> <table border=0 width=700 > <tr> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>일순위</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Name</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Tel</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Money</b></font></td> </tr> "); for($a=1 ; $a < 5 ; $a++) { $put2=mysql_fetch_array($ally3); if($put[smoney]<$put2[bmoney]) { echo(" <tr> <td bgcolor=black align=center width=150> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>$a</b></td> <td bgcolor=black align=center width=150> <a href = mailto:$put2[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[name]</b></font></a></td> <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[tel]</b></font></td> <td bgcolor=black align=center > <font style='font-size:13px;font-style:italic;color:red'> <b>$put2[bmoney]</b></font></td> </tr> "); } } echo(" </table> <table border=0 width=700 > <tr> <td bgcolor=black >   </td> </tr> <tr> <td bgcolor=black > <a href =main_view.php?chanl=input_newlibchal&tnum=$no&f=$f&f2=$f2> <img src=write.gif border=0></a></td> <td bgcolor=black ><a href =main_view.php?chanl=main_view&f=$f&f2=$f2> <img src=list.gif border=0></a></td> <td bgcolor=black ><a href =main_view.php?chanl=edit_libchal&no=$no&f=$f&f2=$f2> <img src=rewrite.gif border=0></a></td> <td bgcolor=black ><a href =main_view.php?chanl=del&no=$no&f=$f&f2=$f2> <img src=delete1.gif border=0></a></td> <td bgcolor=black ><a href =main_view.php?chanl=del_lib&no=$no&f=$f&f2=$f2> <img src=delete2.gif border=0></a></td> </tr> </table> </center> </html> "); } function error_view($title,$smoney,$edate,$content,$f,$f2) { if(!$title) { echo(" <script> window.alert('주제가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$smoney) { echo(" <script> window.alert('기본 금액이 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$content) { echo(" <script> window.alert('내용이 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$edate) { echo(" <script> window.alert('마감일이 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } } function input_newlibchal($tnum,$f,$f2,$putuser) { echo(" <html> <title> input_newlibchal html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=main_view.php> <input type=hidden name=chanl value=input_newlibchal> <input type=hidden name=chanl2 value=input_newlibchal2> <input type=hidden name=tnum value=$tnum> <input type=hidden name=no value=$tnum> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <table border=0 cellspacing=2 cellpadding=2 width=700 > </table> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td width=50 bgcolor=#808080> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[name]</font></td> <td width=100 bgcolor=#808080> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[email]</font></td> </tr> <tr> <td width=100 bgcolor=#808080> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[tel1]</font></td> <td width=100 bgcolor=#808080> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~입찰금액</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=bmoney size=10>won</font></td> </tr> </table> <br><br> <table border=0 cellspacing=2 cellpadding=2 width=71% > <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=입찰등록> <input type=reset value=지우기></font></td> </tr> </table> </form> </center> </body> </html> "); } function input_view($f,$f2,$connect,$putuser) { echo(" <html> <title> input_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=main_view.php> <input type=hidden name=chanl value=input_new> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Title</b></font></td> <td bgcolor=black align=left><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=44> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[name]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[email] </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[tel1]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~마감시간</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <select name=edata1> <option value=2000 selected>Y2K <option value=2001>Y21 </select> <select name=edata2> <option value=1>1mon <option value=2>2mon <option value=3>3mon <option value=4 selected>4mon <option value=5>5mon <option value=6>6mon <option value=7>7mon <option value=8>8mon <option value=9>9mon <option value=10>10mon <option value=11>11mon <option value=12>12mon </select> <select name=edata3> <option value=1>1day <option value=2>2day <option value=3>3day <option value=4>4day <option value=5>5day <option value=6>6day <option value=7>7day <option value=8>8day <option value=9>9day <option value=10>10day <option value=11>11day <option value=12>12day <option value=13>13day <option value=14 selected>14day <option value=15>15day <option value=16>16day <option value=17>17day <option value=18>18day <option value=19>19day <option value=20>20day <option value=21>21day <option value=22>22day <option value=23>23day <option value=24>24day <option value=25>25day <option value=26>26day <option value=27>27day <option value=28>28day <option value=29>29day <option value=30>30day <option value=31>31day </select> <select name=edata4> <option value=am>A.m <option value=pm selected>P.m </select> <select name=edata5> <option value=1>1si <option value=2>2si <option value=3 selected>3si <option value=4>4si <option value=5>5si <option value=6>6si <option value=7>7si <option value=8>8si <option value=9>9si <option value=10>10si <option value=11>11si <option value=12>12si </select> <select name=edata6> <option value=10>10 <option value=20>20 <option value=30>30 <option value=40 selected>40 <option value=50>50 <option value=00>00 </select> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~기본금액</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#ff1493'> <input type=int name=smoney size=10><b>Won</b></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=content rows=10 cols=70></textarea></font></td> </tr> <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=경매등록> <input type=reset value=지우기></font></td> </tr> </table> </form> </center> </body> </html> "); } function del($no,$tnum,$f,$f2,$root,$putuser) { echo(" <html> <title> Del html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=main_view.php> <input type=hidden name=chanl value=del_no> <input type=hidden name=tnum value=$no> <input type=hidden name=no value=$no> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~passw</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passwd size=10></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=지우기> </font></td> </tr> <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[name]</font></td> </tr> </table> </form> </center> </body> </html> "); } function del_lib($no,$tnum,$f,$f2,$root,$putuser) { echo(" <html> <title> Del_lib html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=main_view.php> <input type=hidden name=chanl value=del_lib2> <input type=hidden name=tnum value=$no> <input type=hidden name=no value=$no> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[name]</font></td> </tr> <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~passw</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passwd size=9></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=지우기> </font></td> </tr> </table> </form> </center> </body> </html> "); } function title_end($putally2,$ally3,$no,$f,$f2) { echo(" <html> <title> end html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=white align=center width=120> <font style='font-size:13px;font-style:italic;color:#blue'><b>$no No</b></font></td> <td bgcolor=white align=center width=580> <font style='font-size:13px;font-style:italic;color:#black'> <b>$putally2[title]</b></font></td> </tr> </table> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 align=center width=135> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>낙찰자</b></font></td> <td bgcolor=#808080 align=center width=250> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>마감시간</b></font></td> <td bgcolor=#808080 align=center width=250> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>Tel</b></font></td> <td bgcolor=#808080 align=center width=150> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>낙찰Money</b></font></td> </tr> "); for($a=1 ; $a < 2 ; $a++) { $put2=mysql_fetch_array($ally3); if($putally2[smoney]<$put2[bmoney]) { echo(" <tr> <td bgcolor=black align=center><a href = mailto:$put2[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[name]</b></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$putally2[edate]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[tel]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put2[bmoney]</b></font></td> </tr> "); } } echo(" <tr> <td bgcolor=#808080 align=center width=135> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>매도자</b></font></td> <td bgcolor=#808080 align=center width=250> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>매도일</b></font></td> <td bgcolor=#808080 align=center width=250> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>Tel</b></font></td> <td bgcolor=#808080 align=center width=150> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>기본Money</b></font></td> </tr> <tr> <td bgcolor=black align=center><a href = mailto:$putally2[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$putally2[name]</b></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$putally2[wdate]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$putally2[tel]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$putally2[smoney]</b></font></td> </tr> <tr> <td bgcolor=black >   </td> </tr> <tr> <td bgcolor=black colspan=4> <font style='font-size:15px;font-style:italic;color:#fffff0'> ''' 경매 게시자는 직접 삭제 해야 메일이 계속 발송 않됩니다.~! </font></td> </tr> <tr> <td bgcolor=black colspan=4> <font style='font-size:15px;font-style:italic;color:#fffff0'> ''' 계속 진행하려면 날짜를 변경 하세요.~! </font></td> </tr> <tr> <td bgcolor=black ><a href =main_view.php?chanl=main_view&f=$f&f2=$f2> <img src=list.gif border=0></a></td> <td bgcolor=black ><a href =main_view.php?chanl=edit_libchal&no=$no&f=$f&f2=$f2> <img src=rewrite.gif border=0></a></td> <td bgcolor=black ><a href =main_view.php?chanl=del&no=$no&f=$f&f2=$f2> <img src=delete2.gif border=0></a></td> </tr> </table> </center> </html> "); } function s_mail($putally2,$ally3,$no,$f,$f2) { for($a=1 ; $a < 2 ; $a++) { $put2=mysql_fetch_array($ally3); if($putally2[smoney]<$put2[bmoney]) { $message = " <b>No</b> $no title : $putally2[title] <br> <b>낙찰자</b> $put2[name] <b>마감시간</b> $putally2[edate] <b>Tel</b> $put2[tel] <b>낙찰금액</b> $put2[bmoney] <br><br> <b>매도자</b> $putally2[name] <b>매도일</b> $putally2[wdate] <b>Tel</b> $putally2[tel] <b>기본금액</b> $putally2[smoney] <br><br> <b>공지</b></br> 낙찰 매일 확인 후 경매 게시판의 경매 글을 직접 삭제하세요~! "; } } $su = " <b>No $no</b> 낙찰 "; $rp = "$put2[email]"; $rp1 = "$putally2[email]"; mail($rp , $su ,$message); mail($rp1 , $su ,$message); } ?>
소스 설명
함수 형식으로 되어 있으며 경매의 새로운 기능을 추가할 수 있으며 각 화면 별로 함수는 분리되어 있습니다.
database 접속과 검색 모드 만들기
소스의 처음 부분이며 mysql의 접속 query들이 나열됩니다. 이것은 경매 글의 검색을 위한 데이터베이스 query도 있으며 경매 메인 화면을 출력하는 query도 있습니다. <?php $connect = mysql_connect('localhost','root','gksmf444'); mysql_select_db('libchal',$connect); /* mysql 접속을 위한 호스트, 유저, 패스워드를 나열하고 데이터베이스를 선택 합니다.*/ if($findtype == name) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f where name like '%$findname%' order by no ",$connect); } /* $findtype이 name일 때 해당 테이블에서 경매 등록자를 검색합니다. 자료실에서와 같은 루틴이며 $f는 경매 메� 테이블을 전달받고, $f2는 입찰자 테이블 이름을 전달받습니다. */ if($findtype == title) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f where title like '%$findname%' order by no ",$connect); } /* $findtype가 title일 때 경매 메인 테이블에서 제목에 관해 검색합니다. */ if($findtype == content) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f where content like '%$findname%' order by no ",$connect); } /* $findtype이 content일 때 경매 메인 테이블에서 경매 내용에 관해서 검색합니다. */ if($findtype == t_c) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f where title like '%$findname%' or content like '%$findname%' order by no ",$connect); } /* $findtype이 t_c일 때 경매 메인 테이블에서 경매 제목과 내용에서 전달 받은 검색 단어를 검색합니다. */ if(!$findtype) { $ally = mysql_query("select no,sise,title,hit,edate,wdate,name,email from $f order by no ",$connect);//$connection 생략 했음 } /* $findtype이 없을 경우 경매 메인 테이블에서 등록된 경매 글을 모두 query 합니다. */ $ally4 = mysql_query("select hit,sise from $f where no='$no'",$connect ); /* 특정 번호에 해당하는 경매 hit, sise를 검색합니다. */ $ally3 = mysql_query("select tnum,no,bmoney,name,tel,email from $f2 where tnum ='$no' order by bmoney desc",$connect ); /* 특정 번호에 해당하는 입찰자의 정보를 검색합니다. */ $ally2 = mysql_query("select smoney,title,edate,content,wdate,name,email,tel from $f where no='$no'",$connect ); /* 특정 번호에 해당하는 경매의 정보를 검색합니다. */ $allylib = mysql_query("select tnum,no,name from $f2 where tnum ='$no' order by bmoney desc",$connect ); /* 특정 번호에 해당하는 입찰자 정보를 입찰 금액 역순으로 정렬합니다. */ $t_num=mysql_num_rows($ally); /* 경매 메인 테이블에 등록된 경매 수를 해당 변수에 저장합니다. */ $putup = mysql_fetch_array($ally4); /* 특정 번호에 해당하는 경매 시세와 조회 수를 해당 변수에 저장합니다. */ $putup2 = mysql_fetch_array($allylib); /* 특정 경매 입찰자의 정보 해당 변수에 배열로 저장합니다. */ $putally2=mysql_fetch_array($ally2); mysql_select_db('selectuser',$connect); /* 회원 정보 데이터베이스인 selectuser 데이터베이스를 선택합니다. 구지 회원 데이터베이스를 따로 만들지 안고 libchal 데이터베이스에 회원 정보 테이블을 생성해서 사용하면 스크립트의 속도 향상이 있을 것입니다. */ $allyuser = mysql_query("select id,name,tel1,email,passwd from userin where id='$username' ",$connect); /* 접속한 세션에 해당하는 ID를 이용해서 userin 테이블에서 해당 ID 정보를 검색합니다.*/ $putuser = mysql_fetch_array($allyuser); /* 특정 회원의 정보를 배열로 저장합니다. */ ?>
main_view( ) 함수
경매 게시판의 메인 화면을 출력하는 함수입니다. 경매 게시판 메인 화면을 참고하세요.
함수인자
main_view($s_mail,$t_num,$ally,$page,$findtype,$findname,$f,$f2,$root,$username); /* 경매 게시판의 메인 화면을 출력하기 위한 함수의 인자들 입니다. */ $s_mail - 경매가 마감 되었을 경우 해당 경매의 내용을 전달합니다. $t_num - 총 경매 글의 수를 전달합니다. $ally - 경매 메인 테이블의 경매 정보를 전달합니다. $page - 경매 메인 화면의 페이지를 전달합니다. $findtype - 경매의 검색 조건을 전달합니다. 즉, 경매 제목, 등록자, 내용, 제목과 내용을 전달합니다. $findname - 경매에서 검색할 단어를 전달합니다. $f - 경매 게시판의 메인 테이블 이름을 전달합니다. $f2 - 경매 게시판의 입찰자 테이블 이름을 전달합니다. $root - admin 로그인 때 생성된 쿠키를 전달합니다. $username - 사이트 접속 때 사용한 ID 세션을 전달합니다.
경매 글 출력 하기
등록한 경매 글을 페이별로 출력하며 경매의 진행과 마감을 알려 줍니다. for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { /* 페이지당 글과 페이지 링크, 시작 페이지 값을 이용해서 경매 글을 출력합니다. */ if($pd >= 0 ) { mysql_data_seek($ally,$pd); $put=mysql_fetch_array($ally); /* 경매 글을 순차적으로 배열로 저장해서 출력합니다. */ $wdate = date('Y-m-d H:i:s'); /* 현재 날짜와 시간을 저장합니다. 이것은 경매의 마감 날짜를 가려내기 위해 사용합니다. */ $title_link1 = "<a href ='main_view.php?chanl=title&no=$put[no]&f=$f&f2=$f2'>"; /* 해당 경매의 내용을 링크합니다. */ $title_link2 = "<a href ='main_view.php?chanl=title_end&no=$put[no]&f=$f&f2=$f2'>"; /* 해당 경매의 마감 항목을 링크합니다. */ if($put[edate] > $wdate) { $h = "진행중"; $title_link = $title_link1; } /* 경매 등록 때 설정한 마감 날짜가 현재 날짜보다 클 경우 경매 내용을 링크하고 "진행중" 변수를 설정합니다. */ if($put[edate] < $wdate) { $h = "마감"; $title_link = $title_link2; $s_mail; } /* 경매 마감 날짜가 현재 날짜 보다 작을 경우 경매 마감 화면을 링크하고, "마감" 변수를 설정하며 매도자와 낙찰자�"� 메일을($s_mail) 발송합니다. */ echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:white'> $put[no]</font></td> <td bgcolor=black> /* 경매의 고유 번호를 출력합니다. */ $title_link <font style='font-size:13px;font-style:italic;color:white'> <b>$put[title]</b></font></a></td> /* 경매 제목을 출력합니다. */ <td bgcolor=black align=center> <a href = mailto:$put[email] > <font style='font-size:13px;font-style:italic;color:white'> <b>$put[name]</b></font></a></td> /* 경매 등록자 이름과 메일 주소를 링크합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#ff1493'> <b>$put[sise]</b></font></td> /* 해당 경매의 입찰자 수를 출력합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[hit]</b></font></td> /* 해당 경매의 조회 수를 출력합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#008000'> <b>$h</b></font></td> /* 해당 경매의 진행 여부를 출력합니다. 이 부분은 입찰 가능 금액을 표시하는 방법도 있습니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#9400d3'> <b>$put[edate]</b></font></td> /* 해당 경매의 마감 날짜를 출력합니다. */ </tr> "); } }
다른 화면 링크 만들기
경매 게시판 마지막 부분에 경매 글 등록과 홈, admin �"� 링크를 만드는 부분입니다. echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =main_view.php?chanl=new_libchal&f=$f&f2=$f2> <img src=write.gif border=0> </a></td> /* 새로운 경매 글을 등록하는 화면을 이미지로 링크합니다. */ <td bgcolor=black width=100> <a href =userin.php?chanl=main_view&username=$username> <img src=home.gif border=0> </a></td> /* 사이트 메인 페이지 이동 링크를 만듭니다. */ <td bgcolor=black width=100> <a href =db_view.php?chanl=rootin> <img src=admin.gif border=0></a></td> /* admin 영역 로그인 화면 링크를 만듭니다. */ <td bgcolor=black align=right width=150> <form method=post action=main_view.php> <input type=hidden name=chanl size=14 value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <select name=findtype> <option value=name selected>Name <option value=title>Title <option value=content>Content <option value=t_c>Titl+Cont </select> /* form의 select문을 이용해서 검색 모드를 만듭니다. 검색 항목은 $findtype로 전달합니다. */ </font></td> <td bgcolor=black width=150> <input type=text name=findname size=14> /* 검색할 단어를 $findname 변수로 전달합니다. */ </td> <td bgcolor=black width=100> <input type=submit value=Find> /* 검색 항목($findtype)과 검색 단어($findname)을 전달하기 위해 submit 버튼을 생성합니다. */ </td> </tr> </table> </center> </html> ");
edit_libchal($putally2,$no,$f,$f2,$putuser) 함수
등록된 경매 글의 내용을 수정합니다. $putally2 - 특정 경매의 정보를 배열로 저장해서 전달합니다. $no - 특정 경매의 번호를 전달합니다. $putuser - 특정 ID의 정보를 배열로 저장해서 전달합니다.

form문 만들기
해당 경매의 수정 항목을 데이터베이스에 저장하기 위해 인자를 전달하는 form문을 만듭니다. <form method=post action=main_view.php> <input type=hidden name=chanl value=edit_libchal_in> /* main_view.php 파일의 $chanl=edit_libchal_in 항목을 실행합니다. */ <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> /* 해당 경매의 메인 테이블 이름과 입찰자 테이블 이름을 전달합니다. */ <input type=hidden name=no value=$no> /* 해당 경매의 고유 번호를 전달 합니다. */
view_title($putally2,$ally3,$no,$f,$f2,$putuser) 함수
특정 경매 글을 클릭하면 보여주는 항목입니다. 여기에는 경매의 세부적인 내용과 입찰자 순위, 경매 삭제, 입찰 등의 기능이 있습니다. $putally2 - 특정 경매의 정보를 배열로 저장해서 전달합니다. $ally3 - 특정 경매의 입찰자 정보(입찰금액을 내림차순으로 정렬)를 배열로 저장해서 전달 합니다. $no - 특정 경매의 고유 번호를 전달합니다. 이후 변수는 앞의 함수와 동일합니다.

선택한 경매 글 정보 보여주기
경매의 세부 정보 화면에서 해당 경매에 대한 세부적인 정보를 보여 주기 위해 만듭니다. $content=nl2br($putally2[content]) ; /* 해당 경매의 설명 부분에서 nl 부분을 <br>로 변환해서 $content 변수에 저장합니다.*/ <tr> <td bgcolor=#808080 align=center width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$putally2[edate]:마감</b></font></td> /* 해당 경매의 마감 시간을 출력합니다. */ <td bgcolor=#808080 align=center width=200><a href = mailto:$putally2[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>name:$putally2[name]</b></font></a></td> /* 해당 경매의 등록자를 출력하고 메일 주소를 링크합니다. */ <td bgcolor=#808080 align=center width=280> <font style='font-size:13px;font-style:italic;color:red'> <b>기본money:$putally2[smoney]</b></font></td> /* 해당 경매의 기본 금액을 출력합니다. */ </tr> <tr> <table border=0 cellspacing=2 cellpadding=2 width=700 height=250> <td bgcolor=black valign=top colspan=3 width=700 height=250> <font style='font-size:13px;font-style:italic;color:blue'><b>$content</b></font></td> /* 해당 경매의 설명을 출력합니다. */ </tr>
입찰자 순위 보여주기
경매 세부 화면 하단에 해당 경매에 입찰한 입찰자의 순위를 보여 줍니다. for($a=1 ; $a < 5 ; $a++) { $put2=mysql_fetch_array($ally3); /* 해당 경매 입찰자의 정보를 배열로 저장합니다.*/ if($put[smoney]<$put2[bmoney]) { /* 해당 경매의 기본 금액이 입찰 금액보다 작을 때 실행합니다.*/ echo(" <tr> <td bgcolor=black align=center width=150> <font style='font-size:13px;font-style:italic;color:#fffff0'><b>$a</b></td> /* for문에 의해 $a는 차례로 5보다 작을 때까지 숫자를 출력합니다. */ <td bgcolor=black align=center width=150><a href = mailto:$put2[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[name]</b></font></a></td> /* 입찰자의 이름을 출력하고 메일 주소를 링크합니다. */ <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[tel]</b></font></td> /* 입찰자의 전화 번호를 출력합니다. */ <td bgcolor=black align=center ><font style='font-size:13px;font-style:italic;color:red'> <b>$put2[bmoney]</b></font></td> /* 입찰자의 입찰금액을 출력합니다. 이 부분은 입찰 금액이 제일 높은 사람의 �"賻� 출력하고 입찰자의 이름은 화면에 출력하지 않는 방법도 있지만 여기서는 입찰자의 정보를 모두 공개 했습니다. */ </tr> "); } }
다른 화면 링크 버튼 만들기
경매 세부 항목에서 입찰, 경매 메인 화면, 경매 수정하기, 경매 지우기, 입찰 삭제로 이동하는 버튼을 만듭니다. 각 버튼은 앞에 나열한 순으로 정렬되어 있습니다. <tr> <td bgcolor=black > <a href =main_view.php?chanl=input_newlibchal&tnum=$no&f=$f&f2=$f2> <img src=write.gif border=0></a></td> /* 해당 경매 입찰 화면으로 링크 합니다. */ <td bgcolor=black ><a href =main_view.php?chanl=main_view&f=$f&f2=$f2> <img src=list.gif border=0></a></td> /* 경매 메인 화면으로 링크 합니다. */ <td bgcolor=black ><a href =main_view.php?chanl=edit_libchal&no=$no&f=$f&f2=$f2> <img src=rewrite.gif border=0></a></td> /* 해당 경매 수정 화면으로 링크 합니다. */ <td bgcolor=black ><a href =main_view.php?chanl=del&no=$no&f=$f&f2=$f2> <img src=delete1.gif border=0></a></td> /* 해당 경매 지우기 화면으로 링크 합니다. */ <td bgcolor=black ><a href =main_view.php?chanl=del_lib&no=$no&f=$f&f2=$f2> <img src=delete2.gif border=0></a></td> </tr> /* 해당 경매 입찰 삭제 화면으로 링크 합니다. */
input_newlibchal($tnum,$f,$f2,$putuser) 함수
해당 경매에 입찰을 하는 화면입니다. $putuser 변수의 정보를 이용해서 입찰자의 정보를 보여 주며 입찰 금액 부분만 입력하면 됩니다. $tnum - 해당 경매의 고유 번호를 전달합니다.

form문 만들기
입찰 화면에서 입찰 금액을 전달하고 나머지 테이블 정보를 전달합니다. <form method=post action=main_view.php> <input type=hidden name=chanl value=input_newlibchal> <input type=hidden name=chanl2 value=input_newlibchal2> /* main_view.php 파일의 $chanl= input_newlibchal , $chanl2= input_newlibchal2인 항목을 실행합니다. */ <input type=hidden name=tnum value=$tnum> /* 해당 경매의 고유 번호를 입찰 번호 변수로($tnum) 전달합니다. */ <input type=hidden name=no value=$tnum> /* 해당 경매의 고유 번호를 전달합니다. */ <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> /* 경매의 메인 테이블 이름과 입찰자 테이블 이름을 전달합니다. */
입찰자 정보와 입찰 금액 입력란 만들기
로그인한 ID 세션을 이용해서 입찰자의 정보를 출력하고 입찰 금액 입력란을 만듭니다. <tr> <td width=50 bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[name]</font></td> /* 입찰자의 이름을 출력합니다. */ <td width=100 bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[email]</font></td> </tr> /* 입찰자의 메일 주소를 출력합니다. */ <tr> <td width=100 bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[tel1]</font></td> /* 입찰자의 전화 번호를 출력합니다. */ <td width=100 bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~입찰금액</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=bmoney size=10>won</font></td> </tr> /* 입찰자의 입찰 금액 입력란을 만듭니다. */
input_view($f,$f2,$connect,$putuser) 함수
새로운 경매를 등록하는 화면입니다. 함수의 전달 인자는 앞의 함수들과 같습니다.

form문 만들기
경매의 입력 항목들을 전달하기 위해 form문을 사용합니다. <form method=post action=main_view.php> <input type=hidden name=chanl value=input_new> /* main_view.php 파일의 $chanl=input_new인 항목을 실행합니다. */ <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> /* 해당 경매의 메인 테이블 이름과 입찰자 테이블 이름을 전달합니다. */
ID 정보 출력과 입력 항목 만들기
사이트 접속 때 사용한 ID의 세션을 이용해서 경매 등록자의 정보를 출력하게 하고 나머지 경매 입력란을 만듭니다. <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Title</b></font></td> <td bgcolor=black align=left><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=44> </font></td> </tr> /* 경매의 제목을 입력하는 항목입니다. $title로 전달합니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[name]</font></td> </tr> /* 경매 등록자의 이름을 화면에 출력합니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[email]</font></td> </tr> /* 경매 등록자의 메일 주소를 화면에 출력합니다. */ <tr> <td bgcolor=#808080> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[tel1]</font></td> </tr> /* 경매 등록자의 전화번호를 화면에 출력합니다. 마감시간 입력의 경우 select문을 나열하는 방법을 사용했습니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~기본금액</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#ff1493'> <input type=int name=smoney size=10><b>Won</b></font></td> </tr> /* 경매의 기본 금액을 입력하는 항목입니다. $smoney로 전달합니다. */ <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=content rows=10 cols=70></textarea></font></td> </tr> /* 경매의 세부적인 내용을 적는 항목입니다. $content로 전달합니다. */ <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=경매등록> <input type=reset value=지우기></font></td> </tr> /* 입력 항목들을 전달하기 위한 "경매등록" 버튼을 생성하고, 새로이 입력하기 위한 "지우기" 버튼을 생성합니다. */
del($no,$tnum,$f,$f2,$root,$putuser) 함수
등록한 경매를 지우기 위해 패스워드 입력 화면을 출력하는 함수입니다. $no - 해당 경매의 고유 번호를 전달합니다. $tnum - 경매 고유 번호에 입찰한 입찰 번호를 전달합니다.

form문 만들기
해당 경매와 입찰자를 지우기 위해 여러 정보를 전달합니다. <form method=post action=main_view.php> <input type=hidden name=chanl value=del_no> /* main_view.php 파일의 $chanl= del_no인 항목을 실행합니다. */ <input type=hidden name=tnum value=$no> /* 해당 경매 번호를 입찰자 번호에 사용합니다. 이것은 해당 경매에 입찰한 입찰자만을 삭제하기 위함입니다. */ <input type=hidden name=no value=$no> /* 해당 경매 번호를 전달합니다. */ <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> /* 경매 메인 테이블 이름과 입찰자 테이블 이름을 전달합니다. */
패스워드 입력란 만들기
<tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~passw</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passwd size=10></font></td> /* 해당 경매 등록자의 패스워드 입력 항목입니다. Type는 password입니다. */ <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=지우기> /* 패스워드와 나머지 항목들을 전달하는 "지우기" 버튼을 생성합니다. */ </font></td> </tr> <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[name]</font></td> </tr> /* 사이트를 로그인한 ID의 사용자 이름을 출력합니다. */
del_lib($no,$tnum,$f,$f2,$root,$putuser) 함수
특정 경매에 입찰한 입찰자가 입찰을 삭제하기 위한 화면입니다. 함수의 전달 인자는 경매 삭제 화면을 출력하는 함수와 같습니다.

form문 만들기
입찰을 삭제하기 위해 입찰 등록자의 패스워드와 나머지 정보를 전달하는 form문을 만듭니다. <form method=post action=main_view.php> <input type=hidden name=chanl value=del_lib2> /* main_view.php 파일의 $chanl= del_lib2인 항목을 실행합니다. */ <input type=hidden name=tnum value=$no> <input type=hidden name=no value=$no> /* 입찰자의 번호와 해당 경매의 고유 번호를 전달합니다. */ <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> /* 경매 메인 테이블 이름과 입찰자 테이블 이름을 전달합니다. */
패스워드 입력란과 접속자 출력하기
입찰 삭제를 위한 패스워드 입력란을 만들고 현재 이 항목을 클릭한 사용자를 출력합니다. <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> $putuser[name]</font></td> </tr> /* 사이트에 접속한 ID 세션에 해당하는 사용자 이름을 출력합니다. */ <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~passw</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passwd size=9></font></td> /* 입찰 삭제를 위한 패스워드 입력 항목입니다. */ <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=지우기> </font></td> /* 패스워드와 나머지 정보를 전달하는 "지우기" 버튼을 생성합니다. */
title_end($putally2,$ally3,$no,$f,$f2) 함수
경매가 마감했을 경우 해당 경매의 제목을 클릭하면 보여주는 화면입니다. $putally2 - 해당 경매의 정보를 배열로 저장해서 전달합니다. $ally3 - 해당 경매 입찰자의 정보를 배열로 저장해서 전달합니다.

낙찰자 출력 하기
경매가 마감했을 경우 낙찰자의 출력을 보여 주는 부분입니다. for($a=1 ; $a < 2 ; $a++) { /* 이 for문은 앞의 경매 세부 정보 보기에서 사용한 구문이지만 $a가 2보다 작을 때까지만 수행합니다. 이것은 오직 입찰자중 한 사람만 출력하게 하려는 것입니다. */ $put2=mysql_fetch_array($ally3); if($putally2[smoney]<$put2[bmoney]) { echo(" <tr> <td bgcolor=black align=center><a href = mailto:$put2[email] > <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[name]</b></font></a></td> /* 기본 금액이 입찰 금액 보다 작을 경우 입찰자의 이름을 출력합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$putally2[edate]</b></font></td> /* 마감 날짜를 출력합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[tel]</b></font></td> /* 입찰자의 전화번호를 출력합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put2[bmoney]</b></font></td> </tr> /* 입찰자의 입찰 금액을 출력합니다. */ "); } }
s_mail($putally2,$ally3,$no,$f,$f2) 함수
해당 경매가 마감되면 매도자와 낙찰자�"� 메일을 보내는 함수입니다.
낙찰자와 매도자�"� 보낼 메시지 만들기
for($a=1 ; $a < 2 ; $a++) { $put2=mysql_fetch_array($ally3); if($putally2[smoney]<$put2[bmoney]) { $message = " <b>No</b> $no <b>title</b> : $putally2[title]<br> <b>낙찰자</b> $put2[name] <b>마감시간</b> $putally2[edate]<br> <b>Tel</b> $put2[tel] <b>낙찰금액</b> $put2[bmoney]<br> <b>매도자</b> $putally2[name] <b>매도일</b> $putally2[wdate]<br> <b>Tel</b> $putally2[tel] <b>기본금액</b> $putally2[smoney] <br><br> <b>공지</b><br> 낙찰 매일 확인 후 경매 게시판의 경매 글을 직접 삭제 하세요~!"; } } /* 입찰자 중 제일 높은 금액의 입찰자 1명의 정보를 $message 변수에 저장합니다. */
메일 보내기
낙찰자와 매도자의 정보를 메일로 각각 보냅니다. $su = " No $no 낙찰 "; /* 낙찰 번호를 메일 제목($su)에 저장합니다. */ $rp = "$put2[email]"; /* 낙찰자의 메일 주소를 해당 변수에 저장합니다. */ $rp1 = "$putally2[email]"; /* 매도자의 메일 주소를 해당 변수에 저장합니다. */ mail($rp , $su ,$message); mail($rp1 , $su ,$message); /* 매도자와 낙찰자�"� 메일을 보냅니다. */
main_view.php 전체 코드
<?php session_start(); ////////////////////////////////////////////////// // // 일자 : 2000.2.15 am 5 // 작성자: skycry (hong il) // // // method : main_view // ////////////////////////////////////////////////// ?> <?php if($username) { include('func_all.php'); if($chanl == new_libchal && $username != guest) { input_view($f,$f2,$connect,$putuser) ; mysql_close($connect); } if($chanl == input_new && $username != guest) { if($edata4 == am && $edata5 == 12) { $ap = "00" ; } if($edata4 == pm && $edata5 == 12) { $ap = "12" ; } if($edata4 == am) { $ap = $edata5 ; } if($edata4 == pm) { $ap = $edata5 +"12" ; } $edate = "$edata1-$edata2-$edata3-$ap-$edata6"; error_view($title,$smoney,$edate,$content,$f,$f2); mysql_select_db('libchal',$connect);//function $max = mysql_query("select max(no) from $f ",$connect ); $new_no = mysql_result($max,0,0); $no = $new_no + "1" ; if(!(int)$smoney) { echo(" <script> window.alert('금액을 다시 입력 하세요..') history.go(-1) </script> "); exit; } $wdate = date("y-m-d"); mysql_query("insert into $f(no,title,name,email,tel,smoney,content,edate,wdate) values('$no','$title','$putuser[name]','$putuser[email]','$putuser[tel1]', '$smoney','$content','$edate','$wdate')",$connect); echo(" <html> <body> <center> <form method=post action=main_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 등록 되었습니다</b></font> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); mysql_close($connect); } if($chanl == input_newlibchal && $username != guest) { if($chanl2 == input_newlibchal2 && $username != guest) { if(!(int)$bmoney || !$bmoney) { echo(" <script> window.alert('금액을 다시 입력 하세요..') history.go(-1) </script> "); exit; } if($putup2[name] == $putuser[name]) { echo(" <script> window.alert('입찰은 한번만 가능 합니다.') history.go(-1) </script> "); exit; } if($putally2[smoney] >= $bmoney) { echo(" <script> window.alert('입찰은 기본 금액 보다 높아야 합니다..') history.go(-1) </script> "); exit; } mysql_select_db('libchal',$connect); $sise = $putup[sise] + "1" ; mysql_query("insert into $f2(name,bmoney,tel,email,tnum) values('$putuser[name]','$bmoney','$putuser[tel1]','$putuser[email]','$tnum')",$connect); mysql_query("update $f set sise='$sise' where no='$tnum'",$connect); echo(" <html> <body> <center> <form method=post action=main_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 등록 되었습니다</b></font> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); } else { input_newlibchal($tnum,$f,$f2,$putuser) ; } mysql_close($connect); } if($chanl == edit_libchal && $username != guest) { edit_libchal($putally2,$no,$f,$f2,$putuser) ; mysql_close($connect); } if($chanl == edit_libchal_in && $username != guest) { if($edata4 == am && $edata5 == 12) { $ap = "00" ; } if($edata4 == pm && $edata5 == 12) { $ap = "12" ; } if($edata4 == am) { $ap = $edata5 ; } if($edata4 == pm) { $ap = $edata5 +"12" ; } $edate = "$edata1-$edata2-$edata3-$ap-$edata6"; error_view($title,$smoney,$edate,$content,$f,$f2); $input=mysql_query("select password('$passwd') ",$connect ); $inputpassw = mysql_result($input,0,0); if($putuser[passwd] == $inputpassw) { if(!(int)$smoney) { echo(" <script> window.alert('금액을 다시 입력 하세요..') history.go(-1) </script> "); exit; } mysql_select_db('libchal',$connect);//function mysql_query("update $f set title='$title', smoney='$smoney' , edate='$edate' , content='$content' where no = '$no'",$connect); mysql_close; } else { echo(" <script> window.alert('passw가 틀렸습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } echo(" <html> <body> <center> <form method=post action=main_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 수정 되었습니다</b></font> <input type=hidden name=no value=$no> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); mysql_close($connect); } if($chanl == title) { mysql_select_db('libchal',$connect);//function mysql_query("update $f set hit = '$putup[hit]'+1 where no = '$no'",$connect) ; view_title($putally2,$ally3,$no,$f,$f2,$putuser) ; } if($chanl == main_view) { $s_mail = s_mail($putally2,$ally3,$no,$f,$f2); mysql_select_db('adminp',$connect); mysql_query("update admin set sum='$t_num' where mview = '$f'",$connect); main_view($s_mail,$t_num,$ally,$page,$findtype,$findname,$f,$f2,$root,$username, $putuser); mysql_close($connect); } if($chanl == del) { del($no,$tnum,$f,$f2,$root,$putuser); } if($chanl == del_no && $username != guest) { $input=mysql_query("select password('$passwd') ",$connect ); $inputpassw = mysql_result($input,0,0); if($putuser[passwd] == $inputpassw || $root) { mysql_select_db('libchal',$connect);//function $mldel = "delete from $f where no=$no && name='$putuser[name]'"; $rsult = mysql_query($mldel,$connect); $ml2del = "delete from $f2 where tnum=$tnum && name='$putuser[name]'"; $rsult2 = mysql_query($ml2del,$connect); } else { echo(" <script> window.alert('passw가 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } echo(" <html> <body> <center> <form method=post action=main_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>경매가 삭제 되었습니다</b></font> <input type=hidden name=no value=$no> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); mysql_close($connect); } if($chanl == del_lib) { del_lib($no,$tnum,$f,$f2,$root,$putuser); } if($chanl == del_lib2 && $username != guest) { $input=mysql_query("select password('$passwd') ",$connect ); $inputpassw = mysql_result($input,0,0); if($putuser[passwd] == $inputpassw || $root) { mysql_select_db('libchal',$connect);//function $ml2del = "delete from $f2 where name='$putuser[name]' && tnum='$no' "; $rsult2 = mysql_query($ml2del,$connect); } else { echo(" <script> window.alert('passw가 틀렸습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } echo(" <html> <body> <center> <form method=post action=main_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>입찰이 삭제 되었습니다</b></font> <input type=hidden name=no value=$no> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); mysql_close($connect); } if($chanl == title_end) { title_end($putally2,$ally3,$no,$f,$f2); mysql_close($connect); } if($chanl == new_libchal && $username == guest || $chanl == input_newlibchal && $username == guest || $chanl == edit_libchal && $username == guest || $chanl == del && $username == guest || $chanl == del_lib && $username == guest) { echo(" <script> window.alert('guest는 이용할 수 없습니다.') history.go(-1) </script> "); exit; } } else { echo(" <script> window.alert('Login 하세요.') history.go(-1) </script> "); exit; } ?>
소스 설명
func_all.php의 함수를 다양한 방법으로 브라우저에 출력하고 여러 입력 항목 등을 데이터베이스에 저장합니다.
세션 설정
사이트에 등록된 ID나 guest로 로그인 했을 경우 생성된 세션을 이용해서 경매 게시판의 기능을 수행할 수 있게 하는 부분입니다. session_start(); /* 세션을 시작합니다. */ if($username) { /* 세션이 있을 경우 해당 if문 내용을 수행합니다. if($username){ 와 else{ 사이에 각화면을 출력하는 함수를 사용합니다. 이같은 방법은 경매 게시판의 이용을 등록된 ID와 guest만이 접속 가능 하도록 하는 것입니다. */ include('func_all.php'); /* 함수 파일을 포함합니다. */ } else { echo(" <script> window.alert('Login하세요.') history.go(-1) </script> "); exit; } /* main_view.php의 마지막 부분에 존재하며 세션이 없을 경우 출력하는 부분입니다. */
새로운 경매 등록하기
새로운 경매를 등록하는 화면을 출력합니다. if($chanl == new_libchal && $username != guest) { /* $chanl이 new_libchal이고 세션이 guest가 아닐 경우 새로운 경매 등록 화면을 실행합니다. */ input_view($f,$f2,$connect,$putuser) ; mysql_close($connect); }
새 경매 데이터베이스 저장하기
새로운 경매 입력 화면에서 입력한 항목을 데이터베이스에 저장하는 부분입니다. if($chanl == input_new && $username != guest) { /* $chanl이 input_new이고 세션이 guest가 아닐 경우 실행합니다. */ if($edata4 == am && $edata5 == 12) { $ap = "00" ; } if($edata4 == pm && $edata5 == 12) { $ap = "12" ; } if($edata4 == am) { $ap = $edata5 ; } if($edata4 == pm) { $ap = $edata5 +"12" ; } /* 위 조건 문은 경매 마감 날짜를 설정하는 부분이며 Am과 Pm을 구분합니다. */ $edate = "$edata1-$edata2-$edata3-$ap-$edata6"; /* $edate 변수에 날짜 정보를 하나로 저장합니다. */ error_view($title,$smoney,$edate,$content,$f,$f2); /* 경매 입력 항목 중 공백 항목이 있으면 에러를 출력합니다. */ mysql_select_db('libchal',$connect); $max = mysql_query("select max(no) from $f ",$connect ); $new_no = mysql_result($max,0,0); $no = $new_no + "1" ; /* 경매 메인 테이블에서 마지막 경매 고유번호를 검색하고 +1해서 새로운 경매 고유번호를 만듭니다. */ if(!(int)$smoney) { echo(" <script> window.alert('금액을 다시 입력하세요..') history.go(-1) </script> "); exit; } /* 경매 기본 금액이 정수가 아닐 경우 에러 화면을 출력합니다. */ $wdate = date("y-m-d"); /* 현재 날짜를 해당 변수에 저장합니다. */ mysql_query("insert into $f(no,title,name,email,tel,smoney,content,edate,wdate) values('$no','$title','$putuser[name]','$putuser[email]','$putuser[tel1]', '$smoney','$content','$edate','$wdate')",$connect); /* 경매 메인 테이블에 새 경매 입력 사항을 저장합니다. */ echo(" <html> <body> <center> <form method=post action=main_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 등록되었습니다</b></font> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); /* 새 경매 항목을 저장하고 확인 화면을 출력합니다. */ mysql_close($connect); }
입찰 항목 출력하기
해당 경매에 입찰을 할 경우 입찰 금액을 입력하는 화면을 출력하고 , 다시 해당 정보를 데이터베이스에 저장하는 부분을 만듭니다. if($chanl == input_newlibchal && $username != guest) { /* $chanl이 input_newlibchal이고 세션이 guest가 아닐 경우 입찰 등록 화면을 출력합니다. */ if($chanl2 == input_newlibchal2 && $username != guest) { /* $chanl=input_newlibchal , $chanl= input_newlibchal2이고 세션이 guest가 아닐 때 아래 항목을 실행합니다. */ if(!(int)$bmoney || !$bmoney) { echo(" <script> window.alert('금액을 다시 입력하세요..') history.go(-1) </script> "); exit; } if($putup2[name] == $putuser[name]) { echo(" <script> window.alert('입찰은 한번만 가능합니다.') history.go(-1) </script> "); exit; } /* 입찰자와 기존에 등록된 입찰자와 같을 경우 에러 화면을 출력합니다. */ if($putally2[smoney] >= $bmoney) { echo(" <script> window.alert('입찰은 기본 금액보다 높아야 합니다..') history.go(-1) </script> "); exit; } /* 입찰 금액이 기본 금액보다 작을 경우 출력합니다. */ mysql_select_db('libchal',$connect);//function $sise = $putup[sise] + "1" ; /* 입찰등록 회수를 $sise에 저장합니다. */ mysql_query("insert into $f2(name,bmoney,tel,email,tnum) values('$putuser[name]','$bmoney','$putuser[tel1]','$putuser[email]','$tnum')",$connect); /* 입찰자 테이블에 전달 받은 입찰 항목들을 저장합니다. */ mysql_query("update $f set sise='$sise' where no='$tnum'",$connect); /* $sise의 값을 저장합니다. */ echo(" <html> <body> <center> <form method=post action=main_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>글이 등록 되었습니다</b></font> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> </form> </center> </body> </html> "); } /* 입찰 등록을 마�"� 확인 화면을 출력합니다. */ else { input_newlibchal($tnum,$f,$f2,$putuser) ; } /* 입찰 등록 화면입니다. */ mysql_close($connect); }
경매 수정 화면 출력과 데이터베이스 수정
등록된 경매를 수정하는 화면을 출력하고 해당 테이블의 내용을 수정하는 루틴입니다. if($chanl == edit_libchal_in && $username != guest) { /* $chanl=edit_libchal_in이고 세션이 guest가 아닐 경우 실행합니다. */ $input=mysql_query("select password('$passwd') ",$connect ); $inputpassw = mysql_result($input,0,0); /* 전달 받은 패스워드를 암호화합니다. */ if($putuser[passwd] == $inputpassw) { /* 전달 받은 패스워드와 해당 경매 등록자의 패스워드가 같을 경우 실행합니다. */ if(!(int)$smoney) { echo(" <script> window.alert('금액을 다시 입력 하세요..') history.go(-1) </script> "); exit; } mysql_select_db('libchal',$connect); mysql_query("update $f set title='$title', smoney='$smoney' , edate='$edate' , content='$content' where no = '$no'",$connect); /* 해당 경매 테이블에서 전달 받은 수정 항목들을 입력합니다. */ mysql_close; } else { echo(" <script> window.alert('passw가 틀렸습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 전달 받은 패스워드와 등록자 패스워드가 같지 안으면 위 화면을 출력합니다. */
경매 세부 정보 출력
경매 메인 화면에서 특정 경매의 제목을 클릭하면 보여주는 화면을 만듭니다. if($chanl == title) { /* $chanl이 title일 경우 실행합니다. */ mysql_select_db('libchal',$connect); mysql_query("update $f set hit = '$putup[hit]'+1 where no = '$no'",$connect) ; /* 경매 메인 테이블에서 해당 경매의 조 회수를 +1 해서 저장합니다. */ view_title($putally2,$ally3,$no,$f,$f2,$putuser) ; /* 경매 세부 화면을 출력합니다. */ }
경매 메인 화면 출력
if($chanl == main_view) { /* $chanl 이 main_view 일 경우 실행합니다. */ $s_mail = s_mail($putally2,$ally3,$no,$f,$f2); /* 메일 함수를 $s_mail 변수에 저장합니다. */ mysql_select_db('adminp',$connect); mysql_query("update admin set sum='$t_num' where mview = '$f'",$connect); /* admin 영역의 해당 경매 게시판의 총 글 수를 저장합니다. */ main_view($s_mail,$t_num,$ally,$page,$findtype,$findname,$f,$f2,$root, $username,$putuser); /* 메인 화면을 출력합니다. */ mysql_close($connect); }
입찰 삭제 루틴
해당 경매에 등록한 입찰자의 입찰을 삭제하는 루틴입니다. if($chanl == del_lib2 && $username != guest) { /* $chanl이 del_lib2이고 세션이 guest가 아닐 경우 실행합니다. */ $input=mysql_query("select password('$passwd') ",$connect ); $inputpassw = mysql_result($input,0,0); /* 전달 받은 패스워드를 암호화합니다. */ if($putuser[passwd] == $inputpassw || $root) { /* 전달 받은 패스워드와 등록된 패스워드가 같거나 admin 쿠키가 있을 경우 실행합니다.*/ mysql_select_db('libchal',$connect); $ml2del = "delete from $f2 where name='$putuser[name]' && tnum='$no' "; $rsult2 = mysql_query($ml2del,$connect); /* 입찰자 테이블에서 해당 유저의 입찰을 삭제합니다. */ } else { echo(" <script> window.alert('passw가 틀렸습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } /* 전달 되어온 패스워드와 등록된 패스워드가 다를 경우 출력하는 화면입니다. */
guest 이용 불가 항목
guest로 로그인 했을 경우 경매 게시판의 기능 중 사용 하지 못하는 부분을 설정합니다. if($chanl == new_libchal && $username == guest || $chanl == input_newlibchal && $username == guest || $chanl == edit_libchal && $username == guest || $chanl == del && $username == guest || $chanl == del_lib && $username == guest) { /* 세션이 guest이고 $chanl이 새로운 경매 등록 , 입찰 , 수정 , 경매 삭제 , 입찰 삭제 부분에 해당 할 경우 실행합니다. */ echo(" <script> window.alert('guest는 이용할 수 없습니다.') history.go(-1) </script> "); exit; } 다음장에는 쇼핑 몰을 구현해 보겠습니다.
15. 쇼핑 몰 만들기
쇼핑 몰은 특정 상품을 구매자들이 웹 상에서 실제로 쇼핑을 하는 것과 같이 구현 하는 것이 중요 합니다. 먼저 구매자들은 해당 사이트의 계정이 있어야 하고 실제 쇼핑을 할 때와 같이 바구니 항목을 만듭니다. 바구니는 구매자의 선택 물건을 임시로 저장 하며 주문 때 선별 할 수 있습니다. 주문서의 경우 회원 가입 때 작성한 정보를 이용해 저장 되며 받을 주소는 변경 가능 해야 합니다. 그리고,해당 사이트의 메인 화면에 특정 상품으로의 이동 링크가 존재 합니다.

15.1 쇼핑 몰 테이블 만들기
쇼핑 몰 테이블은 총 3개의 테이블로 구성 됩니다. 차례로 pduct(제품의 정보 저장) , shopuser(구매자가 선택한 물품 정보) , sub(주문서) 입니다. Shopuser 테이블은 바구니 역할을 하며 해당 제품의 가격과 수량 등의 정보를 저장 합니다. 경매와 자료실 게시판과는 달리 쇼핑몰 테이블은 admin영역에서 새롭게 만드는 기능이 없으며 직접 만들어 줘야 합니다. 보다 다양하고 admin 중심의 쇼핑 몰을 구성 하기 위해서는 상품의 가격과 구매 단가 , 물품 구입시 마진등 상품 하나의 정보를 관리자 측면에서 구성 해야 합니다. 물론 각 물품의 브라우저 출력과 관련된 일련의 작업 또한 간단하게 관리 할 수 있어야 합니다.
데이터 베이스 만들기
mysql>create databases shop ; 쇼핑 몰에 사용할 테이블을 생성 하기 위한 데이터 베이스를 만듭니다. 참고로 이전 자료실과 경매 게시판에 사용한 데이터 베이스는 libchal 하나로 사용 했었습니다.
테이블 만들기
./mysql -u root -p shop < shop.sql CD의 shop.sql 파일을 이용해서 쇼핑 몰에 사용할 3개의 테이블을 생성 합니다. 새로운 필드와 레코드를 추가 , 수정 하기 위해서 이 파일을 사용 하는 방법도 있습니다.

테이블 구성 인자
쇼핑 몰 테이블은 총 3개 이며 스크립트 파일은 2개로 이루어 집니다. 테이블은 상품의 정보를 저장하는 테이블과 쇼핑한 물건을 저장하는 테이블, 주문서 테이블로 이루어 집니다.
상품의 정보를 저장하는 테이블(pduct)
상품의 이미지와 설명 가격 등을 저장 합니다. image - BLOB 타입 이며 관리자가 등록한 이미지를 바이너리 형태로 저장 합니다. price - 상품 가격을 저장합니다. pdname - 상품의 이름을 저장합니다. cont - 상품의 설명을 저장합니다. sel - 상품의 종목 코드를 저장합니다. 종목 코드는 관리자가 상품을 분류하기 위해 임의로 부여하는 숫자입니다.
선택한 상품을 저장 하는 테이블(shopuser)
구매자가 쇼핑을 하면서 선택한 물건을 볼 수 있는 테이블이고, 일명 바구니라고 합니다. user - 사이트 로그인 때 사용한 ID 세션을 저장합니다. pduct - 선택한 상품 이름을 저장합니다. num - 선택한 상품의 수량을 저장합니다. price - 상품의 가격을 저장합니다. bprice - 상품의 단가를 저장합니다.
상품 주문을 저장 하는 테이블(sub)
구매자가 상품을 바구니에 담은 후 이것을 주문하기 위해 작성한 주문서의 내용을 저장 합니다. 이것은 각 구매자의 ID 세션을 이용하는 방법이며, 각 구매자의 주문 현황을 만들기 위해 이 테이블을 사용할 수 있습니다. user - ID 세션을 저장합니다. wdate - 구매 신청서 작성날짜를 저장합니다. pduct - 신청한 상품을 저장합니다. price - 상품의 총 가격을 저장합니다. bprice - 해당 상품의 단가를 저장합니다. num - 선택한 상품의 총 수량을 저장합니다. inmoney - 결재를 위한 은행이름을 저장합니다. name - 구매자의 이름을 저장합니다. address - 상품을 받을 주소를 저장합니다.
15.2 쇼핑 몰 게시판 소스 만들기
쇼핑 몰의 소스는 각 화면을 보여주는 함수 형식의 shop_e.php 파일과 함수를 이용해 화면에 출력하는 shop.php 파일이 있습니다. 그리고 쇼핑 몰은 상품의 이미지를 브라우저에 출력 하는 부분이 존재 합니다. 이것을 HTML로 일일이 링크를 만들어 출력 하는 방법도 존재합니다.� 관리자의 경우 정말 번거로운 일입니다. 여기서는 이미지를 Mysql에 저장해서 사용 했습니다. 저장된 이미지를 출력 하기 위해sajin.php 파일을 사용 합니다.
shop_e.php 전체 코드
<?php $connect = mysql_connect('localhost','root','gksmf444'); mysql_select_db('shop',$connect); function add_pd($table,$username,$pdname,$num,$price,$connect,$sel) { $ally=mysql_query("select user,pduct,num,price,bprice from shopuser where user='$username' and pduct='$pdname'",$connect); $nums=mysql_fetch_array($ally); if($nums == 0) { mysql_query("insert into $table values('$username','$pdname','$num','$price','$price')",$connect); } else { $num = $num + $nums[num]; $price = $price + $nums[price]; mysql_query("update $table set num='$num',price='$price' where user='$username' and pduct='$pdname'",$connect); } } function del_pd($username,$pdname,$connect,$sel) { $ally=mysql_query("select user,pduct,num,price,bprice from shopuser where user='$username' and pduct='$pdname'",$connect); $nums=mysql_fetch_array($ally); if($nums[num] == 1) { mysql_query("delete from shopuser where pduct='$pdname' and user='$username'",$connect); } else { $numx = $nums[num] - "1"; $pricex = $nums[price] - $nums[bprice]; mysql_query("update shopuser set num='$numx',price='$pricex' where user='$username' and pduct='$pdname'",$connect); } } function main_shop($connect,$shop,$username,$sel) { $ally = mysql_query("select pdname,price,cont,sel from pduct where sel='$sel'",$connect); $t_num=mysql_num_rows($ally); echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=600 > <tr> <th bgcolor=gray colspan=4 align=center> <font style='font-size:12px;font-style:italic;color:#blue'> <b> 맘에드는 상품을 골라봐요 얼른..</b></font></th> </tr> "); if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 상품이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else { for($pd=$t_num ; $pd > 0 ; $pd--) { $put=mysql_fetch_array($ally); $cont = nl2br($put[cont]); echo(" <tr> <td bgcolor=gray colspan=4> </tr> <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> <img src=sajin.php?sel=$sel&pdname=$put[pdname] border=0></font></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$cont</b></font></a></td> <td bgcolor=black>   </td> </tr> <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> $put[pdname]</font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[price]원</b></font></td> <td bgcolor=black width=50> <form method=post action=shop.php> <input type=text name=num size=4 value=1> <input type=hidden name=pdname value=$put[pdname]> <input type=hidden name=price value=$put[price]> <input type=hidden name=user value=$username> <input type=hidden name=table value=shopuser> <input type=hidden name=chanl value=shop_e> <input type=hidden name=sel value=$sel> <input type=submit value=담기> </form> </td> </tr> "); } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =shop.php?chanl=item_show&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>바구니</b></font></a></td> <td bgcolor=black width=100> <a href =userin.php?chanl=main_view&username=$username> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Home</b></font></a></td> <td bgcolor=black width=100> <a href =shop.php?chanl=sub2&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>주문 내역/취소</b></font></a></td> <td bgcolor=black width=100> <a href =db_view.php?chanl=rootin> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Admin</b></font></a></td> </tr> </table> </center> </html> "); } function item_show($table,$username,$connect,$sel) { $ally = mysql_query("select user,pduct,num,price,bprice from shopuser where user='$username' ",$connect); $t_num=mysql_num_rows($ally); echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=800 > <tr> <th bgcolor=gray colspan=6 align=center> <font style='font-size:12px;font-style:italic;color:#red'> <b>쇼핑 집합소 바구니 입니다.장바구니져^^;</b></font></th> </tr> <tr> <td bgcolor=black width=200 align=center> <font style='font-size:13px;font-style:italic;color:blue'> <b>제품명</b></font></td> <td bgcolor=black width=100 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>수량</b></font></a></td> <td bgcolor=black width=200 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>단가</b></font></a></td> <td bgcolor=black width=200 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>합계</b></font></a></td> <td bgcolor=black width=100 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>봇다리</b></font></a></td> </tr> "); for($pd=$t_num ; $pd > 0 ; $pd--) { $put=mysql_fetch_array($ally); $total = $total+($put[bprice] * $put[num]); echo(" <tr> <td bgcolor=black width=200 align=center> <font style='font-size:13px;font-style:italic;color:blue'> $put[pduct]</font></td> <td bgcolor=black width=100 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[num]ea</b></font></td> <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[bprice]원</b></font></td> <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[price]원</b></font> </td> <td bgcolor=black align=left width=100> <form method=post action=shop.php> <input type=hidden name=pdname value=$put[pduct]> <input type=hidden name=chanl value=del_pd> <input type=hidden name=sel value=$sel> <input type=submit value=털기> </form> </td> "); } echo(" </tr> </table> <table border=0 cellspacing=2 cellpadding=2 width=800 > <tr> <td bgcolor=black align=center width=200> <a href =shop.php?sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>쇼핑 계속하기</b></font></a></td> <td bgcolor=black align=center width=200> <a href =shop.php?chanl=sub&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>주문하기</b></font></a></td> <td bgcolor=black align=right width=200> <font style='font-size:13px;font-style:italic;color:blue'> <b>총금액</b></font></td> <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:red'> <b>$total 원</b></font></td> </tr> </table> </center> </html> "); } function error_view($edate,$address,$inmoney,$name) { if(!$address) { echo(" <script> window.alert('address가 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$inmoney) { echo(" <script> window.alert('입금할 은행이 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$edate) { echo(" <script> window.alert('마감일이 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } if(!$name) { echo(" <script> window.alert('name이 없습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } } ?>
소스 설명
쇼핑의 각 화면을 함수 형식으로 만들었고 사이트에 따라 다양한 화면을 추가 할 수 있습니다. 물론 조건 문 나열 형식을 사용해서 각 화면을 표현 할 수 있습니다.
데이터 베이스 접속
$connect = mysql_connect('localhost','root','gksmf444'); /* mysql 접속을 위한 호스트 이름 , 계정 , 비밀 번호 입니다. */ mysql_select_db('shop',$connect); /* shop 데이터 베이스를 선택 합니다. */
add_pd($table,$username,$pdname,$num,$price,$cont,$connect,$sel) 함수
구매자가 선택한 물건을 담는 바구니 함수 입니다.
함수 인자
function add_pd($table,$username,$pdname,$num,$price,$connect,$sel) { $table - 테이블 이름을 전달 합니다. 나중에 다양한 테이블 사용을 용이하게 하고 여러 개의 쇼핑 바구니 항목을 추가 할 수 있습니다. $username - 사용자의 ID 세션을 전달합니다. $pdname - 선택한 상품 이름을 전달합니다. $num - 선택한 상품의 수량을 전달합니다. $price - 선택한 상품의 가격을 전달합니다. $connect - 데이터 베이스 접속 항목을 전달합니다. $sel - 구매 제품의 종목 번호를 전달합니다.
데이터 베이스 Query 만들기
$ally=mysql_query("select user,pduct,num,price,bprice from shopuser where user='$username' and pduct='$pdname'",$connect); /* 바구니 테이블(shopuser)에서 해당 구매자와 상품이름이 존재하면 구매자, 상품이름, 수량, 가격, 단가 등의 정보를 검색 합니다. */ $nums=mysql_fetch_array($ally); /* 위 바구니 테이블의 정보를 $nums 변수에 배열로 저장 합니다. */
바구니에 상품 담기
if($nums == 0) { mysql_query("insert into $table values('$username','$pdname','$num','$price','$price')",$connect); } /* 바구니 테이블에 아무런 정보도 없을 경우 구매자가 선택한 상품의 정보를 해당 테이블에 저장 합니다. */ else { $num = $num + $nums[num]; $price = $price + $nums[price]; /* $num , $price의 값을 기존의 값과 더합니다. 이것은 해당 ID 세션을 가진 구매자가 선택한 물건이 존재할 경우 기존에 있던 상품의 수량과 가격을 더하는 것입니다. */ mysql_query("update $table set num='$num',price='$price' where user='$username' and pduct='$pdname'",$connect); } /* 수정된 $num 과 $price를 해당 테이블에 저장 합니다.*/ }
del_pd($username,$pdname,$connect,$sel) 함수
쇼핑 몰의 각 종목에 해당하는 메인 화면을 출력 합니다. $sel 변수가 제품의 종목 번호를 전달 합니다.
데이터 베이스 Query 만들기
$ally=mysql_query("select user,pduct,num,price,bprice from shopuser where user='$username' and pduct='$pdname'",$connect); /* shopuser테이블에서 해당 ID 세션과 상품에 대하여 정보를 검색 합니다. */ $nums=mysql_fetch_array($ally); /* 해당 테이블의 정보를 $nums에 배열로 저장 합니다. */
바구니 상품 제거하기
if($nums[num] == 1) { mysql_query("delete from shopuser where pduct='$pdname' and user='$username'",$connect); } /* 바구니에 해당 상품이 하나 존재 할 경우 테이블에서 완전히 삭제 합니다. */ else { $numx = $nums[num] - "1"; $pricex = $nums[price] - $nums[bprice]; /* 바구니에 해당 상품이 하나 이상일 경우 해당 상품의 수량을 하나 삭제 하고 총 가격에서 해당 상품의 단가를 빼줍니다. */ mysql_query("update shopuser set num='$numx',price='$pricex' where user='$username' and pduct='$pdname'",$connect); } /* 수정된 $numx 와 $pricex를 해당 테이블에 저장 합니다. */
main_shop($connect,$shop,$username,$sel) 함수
쇼핑 몰의 각 종목에 해당하는 메인 화면을 출력 합니다. $sel 변수가 제품의 종목 번호를 전달 합니다.
데이터 베이스 Query 만들기
$ally = mysql_query("select pdname,price,cont,sel from pduct where sel='$sel'",$connect); /* 상품 정보 테이블(pduct)에서 해당 종목의 상품 정보를 검색 합니다. 검색 필드는 상품 이름 , �"� , 상품 설� , 상품 종목 번호 입니다. */ $t_num=mysql_num_rows($ally); /* 상품 정보 테이블에 존재하는 상품의 수를 해당 변수에 저장 합니다. */
상품 정보 화면 출력 하기
if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 상품이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } /* 상품 정보 테이블에 등록된 상품이 없을 경우 출력 하는 화면 입니다. */ else { for($pd=$t_num ; $pd > 0 ; $pd--) { /* 상품 정보 테이블에 등록된 상품이 있을 경우 실행 합니다. 해당 for문은 테이블에 존재 하는 상품의 수를 이용해서 그 수 만큼 반복합니다. */ $put=mysql_fetch_array($ally); /* 해당 종목의 상품 정보를 $t_num 변수에 배열로 저장 합니다. */ $cont = nl2br($put[cont]); /* 데이터 베이스에 저장된 상품의 설명을 브라우저에 출력 하기 위해 nl을 <br>로 바꿉니다. */ echo(" <tr> <td bgcolor=gray colspan=4> </tr> <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> <img src=sajin.php?sel=$sel&pdname=$put[pdname] border=0></font></td> /* 해당 상품의 이미지를 출력 합니다. sajin.php 파일에 출력 되는 이미지를 출력 합니다.*/ <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$cont</b></font></a></td> /* 해당 상품에 대한 설명을 출력 합니다. */ <td bgcolor=black>   </td> </tr> <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> $put[pdname]</font></td> /* 해당 상품의 가격을 출력 합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[price]원</b></font></td> /* 해당 상품의 가격을 출력 합니다. */ <td bgcolor=black width=50> <form method=post action=shop.php> <input type=text name=num size=4 value=1> <input type=hidden name=pdname value=$put[pdname]> <input type=hidden name=price value=$put[price]> <input type=hidden name=user value=$username> <input type=hidden name=table value=shopuser> <input type=hidden name=chanl value=shop_e> <input type=hidden name=sel value=$sel> <input type=submit value=담기> </form> /* 각 상품의 수량을 선택하고 바구니에 전달하는 "담기" 버튼을 생성 합니다. 상품 수량은 shop.php 파일에 전� 하며 기본 수량은 1개입니다. 전달 인자는 상품 이름 , 상품 �"� , ID 세션 , 테이블 이름(새로운 쇼핑 몰을 만들 경우 적용) , 해당 인자를 적용할 chanl , 상품 종목 번호를 전달 합니다. */ </td> </tr> "); } }
다른 화면 링크 만들기
echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =shop.php?chanl=item_show&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>바구니</b></font></a></td> /* 선택한 물건을 보여주는 바구니 링크를 만듭니다. Shop.php 파일의 chanl이 item_show 항목을 실행 하며 상품의 종목 번호도 전달합니다. */ <td bgcolor=black width=100> <a href =userin.php?chanl=main_view&username=$username> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Home</b></font></a></td> /* 사이트 메인 화면으로 링크 합니다. 해당 ID 세션을 전달 해서 메인 화면에 로그인 상태를 보여 줍니다. */ <td bgcolor=black width=100> <a href =shop.php?chanl=sub2&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>주문 내역/취소</b></font></a></td> /* 주문 내역을 취소하는 화면으로 링크 합니다. */ <td bgcolor=black width=100> <a href =db_view.php?chanl=rootin> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Admin</b></font></a></td> /* 사이트의 전반적인 제어를 하는 admin 영역으로 링크 합니다. */ </tr> </table> </center> </html> ");
item_show($table,$username,$connect,$sel) 함수
선택한 상품을 보여주는 바구니 항목 입니다. 함수 인자는 위 다른 함수의 내용과 같습니다.

데이터 베이스 Query 만들기
$ally = mysql_query("select user,pduct,num,price,bprice from shopuser where user='$username' ",$connect); /* shopuser 테이블에서 로그인 한 ID 세션에 해당 하는 정보를 검색 합니다. */ $t_num=mysql_num_rows($ally); /* 해당 ID 세션의 검색 수량을 $t_num 변수에 저장 합니다. */
바구니에 담은 상품 출력 하기
for($pd=$t_num ; $pd > 0 ; $pd--) { /* shopuser 테이블에 존재하는 해당 ID의 모든 상품을 출력 합니다. */ $put=mysql_fetch_array($ally); $total = $total+($put[bprice] * $put[num]); /* 선택한 상품의 총 가격을 구합니다. $total = 기존의 total + ( 해당 상품 단가 * 해당 상품 수량) 으로 구해집니다. */ echo(" <tr> <td bgcolor=black width=200 align=center> <font style='font-size:13px;font-style:italic;color:blue'> $put[pduct]</font></td> /* 해당 상품의 이름을 출력 합니다. */ <td bgcolor=black width=100 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[num]ea</b></font></td> /* 해당 상품의 수량을 출력 합니다. */ <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[bprice]원</b></font></td> /* 해당 상품의 기본 단가를 출력 합니다. */ <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[price]원</b></font> /* 해당 상품의 총 금액을 출력 합니다. */ </td> <td bgcolor=black align=left width=100> <form method=post action=shop.php> <input type=hidden name=pdname value=$put[pduct]> <input type=hidden name=chanl value=del_pd> <input type=hidden name=sel value=$sel> <input type=submit value=털기> /* 선택한 상품을 삭제 하는 "털기" 버튼을 생성 합니다. shop.php의 chanl=del_pd 항목을 실행 하며 상품 이름� 상품 종목을 전달합니다. */ </form> </td> "); }
다른 화면 링크 만들기
바구니 화면에서는 다시 쇼핑을 계속하는 버튼과 상품을 주문하는 항목 , 총 금액 등이 존재 합니다. echo(" </tr> </table> <table border=0 cellspacing=2 cellpadding=2 width=800 > <tr> <td bgcolor=black align=center width=200> <a href =shop.php?sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>쇼핑 계속하기</b></font></a></td> /* 해당 쇼핑의 메인 화면으로 링크 합니다. */ <td bgcolor=black align=center width=200> <a href =shop.php?chanl=sub&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>주문하기</b></font></a></td> /* 바구니에 담은 상품을 주문 하기 위한 링크 입니다. shop.php 파일의 chanl=sub항목을 실행 하며 상품 종목을 전달합니다. */ <td bgcolor=black align=right width=200> <font style='font-size:13px;font-style:italic;color:blue'> <b>총금액</b></font></td> <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:red'> <b>$total 원</b></font></td> /* 바구니에 담은 상품의 총 금액을 출력 합니다. */ </tr> </table> </center> </html> ");
shop.php 전체 코드
<?php session_start(); ?> <? include('shop_e.php'); if(!$username || $username == guest) { echo(" <script> window.alert('Login 하세요. Guest거나 ID가 없으신 분은 회원 가입을 하세요') history.go(-1) </script> "); exit; } else { if(!$chanl) { main_shop($connect,$shop,$username,$sel); } if($chanl==shop_e) { add_pd($table,$username,$pdname,$num,$price,$connect,$sel); main_shop($connect,$shop,$username,$sel); } if($chanl ==item_show) { item_show($table,$username,$connect,$sel); } if($chanl == del_pd) { del_pd($username,$pdname,$connect,$sel); item_show($table,$username,$connect,$sel); } if($chanl == sub) { $ally = mysql_query("select user from shopuser where user='$username' ",$connect); $t_num=mysql_num_rows($ally); if(!$t_num) { echo(" <script> window.alert('선택한 상품이 없습니다.') history.go(-1) </script> "); exit; } mysql_select_db('selectuser',$connect); $ally = mysql_query("select resident,email,tel1,id from userin where id='$username'",$connect); $put=mysql_fetch_array($ally); echo(" <html> <title> sub html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=shop.php> <input type=hidden name=chanl value=sub_e> <input type=hidden name=sel value=$sel> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr><font style='font-size:13px;font-style:italic;color:#fffff0'> (* 추가 주문시 '신청합니다'만 클릭 하면 됩니다.)</font> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~받을주소</b></font></td> <td bgcolor=black align=left><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=address size=44></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=name size=10></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~주민번호</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[resident]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Id</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[id]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~입금은행</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <select name=inmoney> <option value=국민은행 selected>국민은행 <option value=한빛은행>한빛은행 <option value=조흥은행>조흥은행 <option value=우리은행>우리은행 </select> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[email]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[tel1]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~배달시간</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <select name=edata1> <option value=2000 selected>Y2K <option value=2001>Y21 </select> <select name=edata2> <option value=1>1mon <option value=2>2mon <option value=3>3mon <option value=4 selected>4mon <option value=5>5mon <option value=6>6mon <option value=7>7mon <option value=8>8mon <option value=9>9mon <option value=10>10mon <option value=11>11mon <option value=12>12mon </select> <select name=edata3> <option value=1>1day <option value=2>2day <option value=3>3day <option value=4>4day <option value=5>5day <option value=6>6day <option value=7>7day <option value=8>8day <option value=9>9day <option value=10>10day <option value=11>11day <option value=12>12day <option value=13>13day <option value=14 selected>14day <option value=15>15day <option value=16>16day <option value=17>17day <option value=18>18day <option value=19>19day <option value=20>20day <option value=21>21day <option value=22>22day <option value=23>23day <option value=24>24day <option value=25>25day <option value=26>26day <option value=27>27day <option value=28>28day <option value=29>29day <option value=30>30day <option value=31>31day </select> <select name=edata4> <option value=am>A.m <option value=pm selected>P.m </select> <select name=edata5> <option value=1>1si <option value=2>2si <option value=3 selected>3si <option value=4>4si <option value=5>5si <option value=6>6si <option value=7>7si <option value=8>8si <option value=9>9si <option value=10>10si <option value=11>11si <option value=12>12si </select> <select name=edata6> <option value=10>10 <option value=20>20 <option value=30>30 <option value=40 selected>40 <option value=50>50 <option value=00>00 </select> </font></td> </tr> </table> <br><br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black align=center width=200> <a href =shop.php?user=$username&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>쇼핑 계속하기</b></font></a></td> <td bgcolor=black align=center width=200> <a href =shop.php?user=$user&chanl=item_show&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>바구니</b></font></a></td> <td bgcolor=black align=center ><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=신청합니다.> <input type=reset value=지우기></font></td> </tr> </table> </form> </center> </body> </html> "); } if($chanl == sub_e) { $ally=mysql_query("select user,pduct,num,price,bprice from shopuser where user='$username'",$connect); $t_num=mysql_num_rows($ally); if($edata4 == am && $edata5 == 12) { $ap = "00" ; } if($edata4 == pm && $edata5 == 12) { $ap = "12" ; } if($edata4 == am) { $ap = $edata5 ; } if($edata4 == pm) { $ap = $edata5 +"12" ; } $edate = "$edata1-$edata2-$edata3-$ap-$edata6"; for($pd=$t_num ; $pd > 0 ; $pd--) { $put=mysql_fetch_array($ally); $ally2=mysql_query("select * from sub where user='$username' and pduct='$put[pduct]'",$connect); $put2=mysql_fetch_array($ally2); if($put2[pduct] != $put[pduct]) { $numall = $put[num] ; error_view($edate,$address,$inmoney,$name); mysql_query("insert into sub values('$username','$edate','$put[pduct]', '$put[price]','$put[bprice]','$numall','$inmoney','$name','$address')",$connect); } else { $numall = $put[num] + $put2[num] ; mysql_query("update sub set num='$numall' where user='$username' and pduct='$put2[pduct]'",$connect); } } echo(" <html> <body> <center> <form method=post action=shop.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>신청 되었습니다</b></font> <input type=hidden name=chanl value=sub2> <input type=hidden name=sel value=$sel> <input type=submit value=확인> </form> </center> </body> </html> "); } if($chanl == sub2) { $ally=mysql_query("select * from sub where user='$username' ",$connect); mysql_select_db('selectuser',$connect); $ally2=mysql_query("select resident,tel1,id from userin where id='$username' ",$connect); $put=mysql_fetch_array($ally2); $t_num2=mysql_num_rows($ally); if(!$t_num2) { echo(" <script> window.alert('주문한 상품이 없습니다.') history.go(-1) </script> "); exit; } echo(" <html> <title> sub html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=600> <tr> <td bgcolor=white colspan=5 align=center colspan=2> <font style='font-size:13px;font-style:italic;color:black'> <b> 계산서~</b></font></td> </tr> <tr> <td bgcolor=#808080 align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~품명</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~수량</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~단가</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~희망 도착일</b></font></td> </tr> "); for($pd=$t_num2 ; $pd >= 1 ; $pd--) { $put2=mysql_fetch_array($ally); $total = $total+($put2[bprice] * $put2[num]); echo(" <tr> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[pduct]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[num]ea</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[bprice]원</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[wdate]</b></font></td> </tr> "); } echo(" </table> <table border=0 cellspacing=2 cellpadding=2 width=600> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~받을주소</b></font></td> <td bgcolor=black align=left><font style='font-size:13px;font-style:italic;color:#fffff0'> $put2[address]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put2[name]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Id</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[id]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~주민번호</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[resident]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~입금은행</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put2[inmoney] 예금주:cry 444-44-44-444</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[tel1]</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~총금액</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:red'> <b>$total</b>원</font></td> </tr> </table> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <td bgcolor=black align=center width=200> <a href =shop.php?user=$username&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>쇼핑 계속하기</b></font></a></td> <td bgcolor=black align=center width=200> <a href =shop.php?chanl=item_show&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>바구니</b></font></a></td> <td bgcolor=black align=center width=200> <a href =shop.php?chanl=del&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>주문취소</b></font></a></td> </tr> </table> </center> </body> </html> "); } if($chanl == del ) { mysql_query("delete from sub where user='$username' ",$connect); mysql_query("delete from shopuser where user='$username'",$connect); echo(" <html> <body> <center> <form method=post action=shop.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>신청이 삭제 되었습니다</b></font> <input type=hidden name=sel value=$sel> <input type=submit value=확인> </form> </center> </body> </html> "); } } ?>
소스 설명
shop.php 파일은 shop_e.php 파일의 함수를 이용해서 화면에 출력 하는 루틴과 ID 세션을 이용한 사용자 접근을 설정 합니다. 세션의 경우 가입자의 ID를 그대로 사용해서 만들기 때문에 문제점이 있을 수 있습니다. 즉 rand( ) 함수를 사용해서 각 ID별 세션을 무작위 수로 설정 하는 방법을 사용하면 보다 안전할 수 있습니다. 이것은 쿠키도 마찬가지 입니다. 만약 어떤 사용자가 스크립트를 이용해서 해당 ID의 세션을 생성하고 접근 한다면 문제가 될 수 있습니다.
ID 세션 설정
<?php session_start(); ?> /* 세션을 시작 합니다. 로그인한 ID 세션을 시작 합니다. */ <? include('shop_e.php'); /* shop_e.php 파일의 함수를 포함 합니다. */ if(!$username || $username == guest) { echo(" <script> window.alert('Login 하세요. Guest거나 ID가 없으신 분은 회원 가입을 하세요') history.go(-1) </script>"); exit; } else { /* ID 세션이 없거나 로그인한 ID 세션이 guest 일 경우 쇼핑 몰을 사용할 수 없습니다. 그 밖의 경우 쇼핑 몰의 모든 화면을 볼 수 있습니다. 즉 세션의 영역은 if( ){ ~ }else{ 쇼핑 몰의 각 화면 } 입니다.*/
메인 화면 출력
if(!$chanl) { main_shop($connect,$shop,$username,$sel); } /* chanl 이 없을 경우 쇼핑 몰의 메인 화면을 출력 합니다. */
상품 바구니 담기
if($chanl==shop_e) { add_pd($table,$username,$pdname,$num,$price,$connect,$sel); main_shop($connect,$shop,$username,$sel); } /* chanl이 shop_e일 경우 구매자가 선택한 상품을 해당 바구니에 저장 하고 다시 쇼핑 몰 메인 화면으로 이동 합니다. */
바구니 상품 보여주기
if($chanl ==item_show) { item_show($table,$username,$connect,$sel); } /* chanl이 item_show일 때 구매자가 선택한 상품을 담은 바구니의 내용을 출력 합니다. */
바구니 상품 삭제 하기
if($chanl == del_pd) { del_pd($username,$pdname,$connect,$sel); item_show($table,$username,$connect,$sel); } /* chanl이 del_pd일 때 선택한 상품을 바구니에서 삭제 하고 다시 바구니의 남은 상품을 출력 합니다. */
상품 주문하기

if($chanl == sub) { /* chanl이 sub일 경우 아래의 항목을 실행 합니다. */ $ally = mysql_query("select user from shopuser where user='$username' ",$connect); $t_num=mysql_num_rows($ally); /* 바구니(shopuser 테이블)에서 해당 ID가 선택한 상품이 있는지 검색 합니다. */ if(!$t_num) { echo(" <script> window.alert('선택한 상품이 없습니다.') history.go(-1) </script> "); exit; } /* 바구니에 선택한 상품이 하나도 없을 경우 출력 하는 화면 입니다. */ mysql_select_db('selectuser',$connect); /* 로그인한 ID 세션의 사용자 정보를 가져 오기 위해 selectuser 데이터 베이스를 선택 합니다. */ $ally = mysql_query("select resident,email,tel1,id from userin where id='$username'",$connect); /* 해당 ID 세션을 가진 구매자의 정보를 검색 합니다. */ $put=mysql_fetch_array($ally); /* 구매자의 정보를 배열로 저장 합니다. */ echo(" <html> <title> sub html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=shop.php> <input type=hidden name=chanl value=sub_e> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr><font style='font-size:13px;font-style:italic;color:#fffff0'> (* 추가 주문시 '신청합니다'만 클릭 하면 됩니다.)</font> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~받을주소</b></font></td> <td bgcolor=black align=left><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=address size=44></font></td> /* 상품을 받을 주소를 입력 하는 부분 입니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=name size=10></font></td> /* 해당 구매자의 실제 이름을 입력 하는 곳입니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~주민번호</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[resident]</font></td> /* 해당 구매자의 주민 번호를 입력 하는 부분 입니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Id</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[id]</font></td> /* 해당 구매자의 로그인 때 사용한 ID를 출력 합니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~입금은행</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <select name=inmoney> <option value=국민은행 selected>국민은행 <option value=한빛은행>한빛은행 <option value=조흥은행>조흥은행 <option value=우리은행>우리은행 </select> </font></td> /* 상품 대금을 결제 하기 위한 은행을 선택하는 부분 입니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~E-mail</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[email]</font></td> /* 해당 구매자의 메일 주소를 출력 하는 부분 입니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[tel1]</font></td> /* 해당 구매자의 전화번호를 출력 합니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~배달시간</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <select name=edata1> <option value=2000 selected>Y2K <option value=2001>Y21 </select> <select name=edata2> <option value=1>1mon <option value=2>2mon <option value=3>3mon <option value=4 selected>4mon <option value=5>5mon <option value=6>6mon <option value=7>7mon <option value=8>8mon <option value=9>9mon <option value=10>10mon <option value=11>11mon <option value=12>12mon </select> <select name=edata3> <option value=1>1day <option value=2>2day <option value=3>3day <option value=4>4day <option value=5>5day <option value=6>6day <option value=7>7day <option value=8>8day <option value=9>9day <option value=10>10day <option value=11>11day <option value=12>12day <option value=13>13day <option value=14 selected>14day <option value=15>15day <option value=16>16day <option value=17>17day <option value=18>18day <option value=19>19day <option value=20>20day <option value=21>21day <option value=22>22day <option value=23>23day <option value=24>24day <option value=25>25day <option value=26>26day <option value=27>27day <option value=28>28day <option value=29>29day <option value=30>30day <option value=31>31day </select> <select name=edata4> <option value=am>A.m <option value=pm selected>P.m </select> <select name=edata5> <option value=1>1si <option value=2>2si <option value=3 selected>3si <option value=4>4si <option value=5>5si <option value=6>6si <option value=7>7si <option value=8>8si <option value=9>9si <option value=10>10si <option value=11>11si <option value=12>12si </select> <select name=edata6> <option value=10>10 <option value=20>20 <option value=30>30 <option value=40 selected>40 <option value=50>50 <option value=00>00 </select> </font></td> /* select문을 이용해 상품을 받을 날짜와 시간을 입력 하는 부분 입니다. */ </tr> </table> <br><br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black align=center width=200> <a href =shop.php?user=$username&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>쇼핑 계속하기</b></font></a></td> /* 해당 상품 종목의 쇼핑 메인 화면으로 링크 합니다. */ <td bgcolor=black align=center width=200> <a href =shop.php?user=$user&chanl=item_show&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>바구니</b></font></a></td> /* 해당 구매자의 바구니로 링크 합니다. */ <td bgcolor=black align=center ><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=신청합니다.> <input type=reset value=지우기></font></td> /* 위 입력 사항을 주문서 테이블에 전달 하는 "신청합니다" 버튼을 생성 합니다. */ </tr> </table> </form> </center> </body> </html> "); }
신청한 상품 정보 저장 하기
if($chanl == sub_e) { /* chanl이 sub_e일 때 아래 항목을 실행 합니다. */ $ally=mysql_query("select user,pduct,num,price,bprice from shopuser where user='$username'",$connect); /* 바구니 테이블에서 해당 구매자가 선택한 상품 정보를 검색 합니다. */ $t_num=mysql_num_rows($ally); /* 바구니의 상품 수량을 검색하고 $t_num 변수에 저장 합니다. */ if($edata4 == am && $edata5 == 12) { $ap = "00" ; } if($edata4 == pm && $edata5 == 12) { $ap = "12" ; } if($edata4 == am) { $ap = $edata5 ; } if($edata4 == pm) { $ap = $edata5 +"12" ; } $edate = "$edata1-$edata2-$edata3-$ap-$edata6"; /* 상품 배달 날짜와 시간을 am ,pm 여부를 검색 하고 $edate 변수에 저장 합니다. */ for($pd=$t_num ; $pd > 0 ; $pd--) { /* 바구니의 상품 수량 만큼 루프를 반복 합니다. */ $put=mysql_fetch_array($ally); /* 바구니의 상품 정보를 배열로 저장 합니다. */ $ally2=mysql_query("select * from sub where user='$username' and pduct='$put[pduct]'",$connect); /* 해당 구매자의 해당 상품이 주문 테이블(sub)에 존재 하는지 검색 합니다. */ $put2=mysql_fetch_array($ally2); /* 해당 구매자의 해당 상품의 정보를 $put2 변수에 배열로 저장 합니다. */ if($put2[pduct] != $put[pduct]) { /* 주문서 테이블(sub)에 해당 구매자가 이전에 신청한 상품이 없을 경우 실행 합니다. */ $numall = $put[num] ; error_view($edate,$address,$inmoney,$name); mysql_query("insert into sub values('$username','$edate','$put[pduct]', '$put[price]','$put[bprice]','$numall','$inmoney','$name','$address')",$connect); /* 해당 구매자가 신청한 새로운 상품의 정보를 sub 테이블에 저장 합니다. */ } else { /* 해당 구매자가 새롭게 신청한 상품이 sub 테이블에 존재할 경우 실행 합니다. */ $numall = $put[num] + $put2[num] ; mysql_query("update sub set num='$numall' where user='$username' and pduct='$put2[pduct]'",$connect); /* sub 테이블의 상품과 새롭게 신청한 상품이 같으므로 갱신해서 sub 테이블에 저장 합니다. */ } } echo(" <html> <body> <center> <form method=post action=shop.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>신청 되었습니다</b></font> <input type=hidden name=chanl value=sub2> <input type=hidden name=sel value=$sel> <input type=submit value=확인> </form> </center> </body> </html> "); /* 모든 상품의 주문 입력을 하고 주문 현황 화면으로 링크하는 "확인" 버튼을 생성 합니다.*/ }
주문 현황 만들기

if($chanl == sub2) { /* chanl이 sub2일 경우 실행 합니다. */ $ally=mysql_query("select * from sub where user='$username' ",$connect); /* 해당 구매자가 주문한 상품 정보를 sub 테이블에서 검색 합니다. */ mysql_select_db('selectuser',$connect); /* 해당 구매자가 사용한 ID 세션의 정보를 검색하기 위해 selectuser 데이터 베이스를 선택 합니다. */ $ally2=mysql_query("select resident,tel1,id from userin where id='$username' ",$connect); /* 해당 ID 세션을 가진 구매자의 정보를 검색 합니다. */ $put=mysql_fetch_array($ally2); /* 해당 ID 세션의 정보를 $put 변수에 저장 합니다. */ $t_num2=mysql_num_rows($ally); /* 해당 구매자가 신청한 상품의 수량을 $t_num2 변수에 저장 합니다.*/ if(!$t_num2) { echo(" <script> window.alert('주문한 상품이 없습니다.') history.go(-1) </script> "); exit; } /* 해당 구매자가 신청한 상품이 없을 경우 출력하는 화면 입니다. */ echo(" <html> <title> sub html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=600> <tr> <td bgcolor=white colspan=5 align=center colspan=2> <font style='font-size:13px;font-style:italic;color:black'> <b> 계산서~</b></font></td> </tr> <tr> <td bgcolor=#808080 align=center width=200> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~품명</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~수량</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~단가</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~희망 도착일</b></font></td> </tr> "); for($pd=$t_num2 ; $pd >= 1 ; $pd--) { /* 해당 구매자가 신청한 상품의 수량 만큼 루프를 반복 합니다. */ $put2=mysql_fetch_array($ally); /* 해당 구매자가 신청한 상품의 정보를 $put2 변수에 저장 합니다. */ $total = $total+($put2[bprice] * $put2[num]); /* 주문한 상품의 총 가격을 구합니다. */ echo(" <tr> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[pduct]</b></font></td> /* 주문한 상품 이름을 출력 합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[num]ea</b></font></td> /* 주문한 상품의 수량을 출력 합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[bprice]원</b></font></td> /* 주문한 상품의 기본 단가를 출력 합니다. */ <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put2[wdate]</b></font></td> </tr> /* 주문한 상품의 희망 도착 날짜를 출력 합니다. */ "); } echo(" </table> <table border=0 cellspacing=2 cellpadding=2 width=600> <tr> <td bgcolor=#808080> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~받을주소</b></font></td> <td bgcolor=black align=left> <font style='font-size:13px;font-style:italic;color:#fffff0'> $put2[address]</font></td> /* 주문한 상품을 받을 주소를 출력 합니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put2[name]</font></td> /* 상품을 주문한 구매자 이름을 출력 합니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Id</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[id]</font></td> /* 상품을 주문한 구매자의 ID를 출력 합니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~주민번호</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[resident]</font></td> /* 상품을 주문한 구매자의 주민 번호를 출력 합니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~입금은행</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put2[inmoney] 예금주:cry 444-44-44-444</font></td> /* 상품의 대금 결제를 위한 은행을 출력 합니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> $put[tel1]</font></td> /* 상품을 신청한 구매자의 전화번호를 출력 합니다. */ </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~총금액</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:red'> <b>$total</b>원</font></td> </tr> /* 구매자가 신청한 상품의 총 금액을 출력 합니다. */ </table> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <td bgcolor=black align=center width=200> <a href =shop.php?user=$username&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>쇼핑 계속하기</b></font></a></td> /* 해당 종목의 쇼핑 메인 화면으로 링크 합니다. */ <td bgcolor=black align=center width=200> <a href =shop.php?chanl=item_show&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>바구니</b></font></a></td> <td bgcolor=black align=center width=200> <a href =shop.php?chanl=del&sel=$sel> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>주문취소</b></font></a></td> /* 주문한 상품의 주문 취소 화면으로 링크 합니다. */ </tr> </table> </center> </body> </html> "); }
16. Admin 영역 만들기
admin 영역은 자료실 , 경매 , 쇼핑 몰 , 데이터 베이스와 관련해 관리자가 수정하는 부분이며 로그인을 거쳐 접근이 가능 합니다. Admin의 로그인은 쿠키를 부여 해서 admin 여부를 확인 합니다. 만약 다른 방법으로 데이터 베이스의 접근 설정을 하려면 inc 파일로 따로 설정해서 사용하는 방법도 있습니다.
16.1 Admin 테이블 만들기
테이블은 자료실과 경매 게시판의 정보를 저장 하는데 사용 하며 자료실 , 경매 테이블과 달리 직접 여기서 생성 해야 합니다.
데이터 베이스 만들기
mysql"create databases adminp ; 자료실과 경매 게시판의 정보를 저장한 두개의 테이블을 생성 하기 위해 adminp 데이터 베이스를 만듭니다.
테이블 만들기
./mysql -u root -p adminp < adminp.sql adminp 데이터 베이스에 CD의 adminp.sql 파일을 이용해서 admin(경매 게시판 정보) , file(자료실 게시판 정보) 테이블을 생성 합니다.

테이블 구성 인자들
admin 영역에서 자료실 , 경매 게시판의 정보를 보여 주기 위해 저장 하는 부분의 인자들이 있으며 데이터 베이스와 회원 관리 , 쇼핑 몰의 경우 admin 영역에서 사용할 테이블은 없습니다. 하지만 이 부분 역시 테이블을 사용해서 보다 체계적이고 관리자 측면의 admin을 구성해야 할 것 입니다. 이것은 사이트의 대형화에서는 꼭 필요 할 것입니다.
경매 admin 테이블(admin)
경매 게시판의 번호를 생성하는 필드와 게시판의 글수 등을 보여주고 앞으로 계속적인 추가를 원할 경우 데이터베이스 admin을 이용해 필드를 추가 하면 됩니다. No - 경매 게시판의 번호 입니다. Title - 게시판의 제목을 저장 합니다. View - 경매 게시판을 구성하는 입찰 테이블의 이름을 저장 합니다. Sum - 해당 게시판의 글 수를 저장 합니다. Wdate - 게시판의 생성 날짜를 저장 합니다. Mview - 경매 게시판을 구성하는 경매 게시판 메인 테이블 이름을 저장 합니다.
자료실 admin 테이블(file)
자료실 게시판의 기본적인 정보를 보여 주며 저장합니다. No - 게시판의 고유 번호를 저장 합니다. Title - 게시판의 제목을 저장 합니다. View - 자료실 응답글 테이블의 이름을 저장 합니다. Sum - 자료실 게시판의 등록된 글 수를 저장 합니다. Wdate - 게시판 생성 날짜를 저장 합니다. Mview - 자료실 게시판을 구성하는 자료실 게시판 메인 테이블 이름을 저장 합니다.
16.2 소스 만들기
admin 영역의 소스는 총 3개의 파일로 구성 됩니다. 먼저 각 화면을 함수 형식으로 표현한 db_func_all.php 파일과 이것을 이용해 화면 출력을 하는 db_view.php 파일 그리고 admin 영역의 로그인(쿠키를 생성 합니다.)을 구성하는 logon.php 파일 입니다.
db_func_all.php 전체 코드
<?php $connect = mysql_connect('localhost','root','gksmf444'); ?> <?php function main($page,$connect,$select,$dbs,$tableput,$root) { if($select == tables) { mysql_select_db($dbs,$connect); $ally = mysql_query("show tables ",$connect); $t = "Table($dbs Db) hong il mansei~!"; $link = "<a href=db_view.php?chanl=create_table&dbs=$dbs>"; $linkdel = "<a href=db_view.php?chanl=dbdel&dbs=$dbs>"; } if(!$select) { $ally = mysql_query("show databases ",$connect); $t = "Database Names hong il mansei~!" ; $link = "<a href =db_view.php?chanl=create_db>"; } if($select == field) { mysql_select_db($dbs,$connect); $ally = mysql_query("describe $tableput " , $connect); $link1 = "<b><a href =db_view.php?chanl=main&select=tables&dbs=$dbs> ($dbs Db)</b></a> "; $link2 = "<b>($tableput Table)</b>"; } $t_num=mysql_num_rows($ally); $p_dip = 4 ; $p_page =4 ; $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; if(!$page) { $page = 1; } if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; $pre_p = $page - 1 ; $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; if($select == field) { echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th bgcolor=white colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> </tr> <tr> <td bgcolor=#808080 width=150> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Field</b></font></td> <td bgcolor=#808080 width=200 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Type</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Null</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Key</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Default</b></font></td> <td bgcolor=#808080 width=150 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Extra</b></font></td> </tr> "); } else { echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> <th bgcolor=white align=left><font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> </tr> <tr> <td bgcolor=#808080 width=450> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$t</b></font></td></tr> "); } if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=6> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 데이타,테이블이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else { for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { if($pd >= 0 ) { mysql_data_seek($ally,$pd); $db=mysql_fetch_array($ally); if(!$select) { echo(" <tr> <td bgcolor=black> <a href ='db_view.php?chanl=main&dbs=$db[Database]&select=tables'> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Database]</b></font></a></td> "); } if($select == tables) { echo(" <tr> <td bgcolor=black> <a href ='db_view.php?chanl=main&dbs=$dbs&select=field&tableput=$db[0]'> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[0]</b></font></a></td> "); } if($select == field) { echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Field]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Type]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Null]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Key]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Default]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Extra]</b></font></a></td> "); } } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } else { if($select == tables) { echo (" <a href =db_view.php?chanl=main&page=$pre_p&dbs=$dbs&select=tables> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } if(!$select) { echo (" <a href =db_view.php?chanl=main&page=$pre_p> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } if($select == field) { echo (" <a href =db_view.php?chanl=main&page=$pre_p&dbs=$윤 &select=field&tableput=$tableput> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } } for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } else { if($pp > 0 && $pp <= $t_page) { if(!$select) { echo(" <a href =db_view.php?chanl=main&page=$pp> <font style='font-size:12px;font-style:italic;color:#808080'> [$pp]</font></a>"); } if($select == tables) { echo(" <a href =db_view.php?chanl=main &page=$pp&dbs=$dbs&select=tables> <font style='font-size:12px;font-style:italic;color:#808080'> [$pp]</font></a>"); } if($select == field) { echo(" <a href =db_view.php?chanl=main&page= $pp&dbs=$dbs&select=field&tableput=$tableput> <font style='font-size:12px;font-style:italic;color:#808080'> [$pp]</font></a>"); } } } } if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font>"); } else { if($select == tables) { echo (" <a href =db_view.php?chanl=main&page=$next_p&dbs=$dbs&select=tables> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } if(!$select) { echo (" <a href =db_view.php?chanl=main&page=$next_p> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } if($select == field) { echo (" <a href =db_view.php?chanl=main &page=$next_p&dbs=$dbs&select=field&tableput=$tableput> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } } } if($select != field) { $td = "<td bgcolor=black width=100> $link <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>New </b></font></a></td>"; if($select == tables) { $td = "<td bgcolor=black width=100> $link <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>New </b></font></a></td> <td bgcolor=black width=100> $linkdel <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Db Del </b></font></a></td>"; } } else { $td = "<td bgcolor=black width=300> <font style='font-size:13px;font-style:italic;color:red'> $link1 > $link2 </font></td> <td bgcolor=black width=100> <a href =db_view.php?chanl=tabledel&dbs=$dbs&tableput=$tableput> <font style='font-size:13px;font-style:italic;color:#ffd700'> Del Table </font></a></td>"; } echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> $td <td bgcolor=black width=100> <a href = userin.php?chanl=main_view> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Home re</b></font></a></td> <td bgcolor=black width=100> <form method=post action=db_view.php> <select name=chanl> <option value=file_view selected>File edit <option value=title_view>Title edit <option value=main>Db edit <option value=user_edit>user edit <option value=shop_edit>shop edit </select> </td> <td> <input type=submit value=Go.!> </td> </form> "); if($tableput) { echo(" </tr> </table> <br><br> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> <th bgcolor=gray colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:white'> <b>Attribute Add/Del insert Attribute Name</b></font></th> </tr> <tr> <td bgcolor=black width=200> <font style='font-size:13px;font-style:italic;color:blue'> <b>Alter Table $tableput</b></font></td> <td bgcolor=black width=50> <font style='font-size:13px;font-style:italic;color:#ffd700'> <form method=post action=db_view.php> <input type = hidden name=tn value=$tableput> <input type = hidden name=chanl value=e_field> <input type = hidden name=dbs value=$dbs> <select name=tct> <option value=add selected>Add <option value=drop >Del </select> </td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#ffd700'> <input type = text name='tablequ' size=14> </font></td> <td> <input type=submit value=Go.!> </td> </form> "); } echo(" </tr> </table> </center> </html> "); } function create_db1() { echo(" <html> <title> creat_db html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=db_view.php> <input type=hidden name=chanl value=create_db2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Db Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=dbname size=10></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=만들기> </font></td> </table> </tr> </form> </center> </body> </html> "); } function create_title() { echo(" <html> <title> creat_db html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=db_view.php> <input type=hidden name=chanl value=create_title2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Table Name</b></font></td> <td bgcolor=black width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=ctitle size=10></font></td> </tr> <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~게시판 Name</b></font></td> <td bgcolor=black width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=10></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=만들기> </font></td> </tr> </table> </form> </center> </body> </html> "); } function create_file() { echo(" <html> <title> creat_db html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=db_view.php> <input type=hidden name=chanl value=create_title3> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Table Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=ctitle size=10></font></td> </tr> <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~자료실 Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=10></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=만들기> </font></td> </tr> </table> </form> </center> </body> </html> "); } function title_view($page,$connect) { mysql_select_db(adminp,$connect); $ally = mysql_query("select no,title,mview,view,sum,wdate from admin order by no ",$connect); $t_num=mysql_num_rows($ally); $p_dip = 4 ;//페이지당 글 수 $p_page =4 ;//페이지당 페이지 링크수 $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; if(!$page) { $page = 1; } if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; $pre_p = $page - 1 ; $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th bgcolor=white colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>No</b></font></td> <td bgcolor=#808080 width=350> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Title</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>MView</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>View</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>sum</b></font></td> <td bgcolor=#808080 width=150 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>date</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>check</b></font></td> </tr> "); if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=6> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 글이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else { for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { if($pd >= 0 ) { mysql_data_seek($ally,$pd); $put=mysql_fetch_array($ally); echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> $put[no]</font></td> <td bgcolor=black> <a href =main_view.php?chanl=main_view&f=$put[mview]&f2=$put[view]> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[title]</b></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[mview]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[view]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[sum]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:blue'> <b>$put[wdate]</b></font></td> <td bgcolor=black align=center> <form method=post action=db_view.php> <input type=hidden name=chanl value=del_title> <input type=radio name=s value=$put[mview]> <input type=hidden name=x value=$put[view]> </td> </tr> "); } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } else { echo (" <a href =db_view.php?chanl=title_view&page=$pre_p> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } else { if($pp > 0 && $pp <= $t_page) { echo(" <a href =db_view.php?chanl=title_view&page=$pp> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a>"); } } } if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font>"); } else { echo (" <a href =db_view.php?chanl=title_view&page=$next_p> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } } echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =db_view.php?chanl=create_title> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Creat 경매</b></font></a></td> <td bgcolor=black width=100> <a href = userin.php?chanl=main_view> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Home re</b></font></a></td> <td bgcolor=black width=100> <input type=hidden name=put value=$start_num> <input type=submit value=Del> </td> </form> <td bgcolor=black width=100> <form method=post action=db_view.php> <select name=chanl> <option value=file_view selected>File edit <option value=title_view>Title edit <option value=main>Db edit <option value=user_edit>user edit <option value=shop_edit>shop edit </select> </td> <td> <input type=submit value=Go.!> </td> </form> </tr> </table> </center> </html> "); } function logon($file) { echo(" <html> <title> passw view </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=logon.php> <input type=hidden name=chanl value=$file> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 align=center width=74> <font style='font-size:13px;font-style:italic;color:#blue'> <b>admin login</b></font></td> </tr> <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Host</b></font></td> <td bgcolor=black width=100> <input type=text name=host size=10></font></td> </tr> <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=id size=10></font></td> </tr> <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~passw</b></font></td> <td bgcolor=black width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=입력> </font></td> </tr> </table> </form> </center> </body> </html> "); } function file_view($page,$connect) { mysql_select_db(adminp,$connect); $ally = mysql_query("select no,title,mview,view,sum,wdate from file order by no ",$connect); $t_num=mysql_num_rows($ally); $p_dip = 3 ; $p_page =4 ; $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; if(!$page) { $page = 1; } if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; $pre_p = $page - 1 ; $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th bgcolor=white colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>No</b></font></td> <td bgcolor=#808080 width=400> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Title</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>MView</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>View</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>sum</b></font></td> <td bgcolor=#808080 width=150 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>date</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>check</b></font></td> </tr> <form method=post action=db_view.php> <input type=hidden name=chanl value=del_title> <input type=hidden name=table value=file> "); if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=6> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 글이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else { for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { if($pd >= 0 ) { mysql_data_seek($ally,$pd); $put=mysql_fetch_array($ally); echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> $put[no]</font></td> <td bgcolor=black> <a href =m.php?chanl=main_view&f=$put[mview]&f2=$put[view]> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[title]</b></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[mview]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[view]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[sum]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:blue'> <b>$put[wdate]</b></font></td> <td bgcolor=black align=center> <input type=radio name=s value=$put[mview]> <input type=hidden name=x value=$put[view]> </td> </tr> "); } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } else { echo (" <a href =db_view.php?chanl=file_view&page=$pre_p> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } else { if($pp > 0 && $pp <= $t_page) { echo(" <a href =db_view.php?chanl=file_view&page=$pp> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a>"); } } } if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font>"); } else { echo (" <a href =db_view.php?chanl=file_view&page=$next_p> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } } echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =db_view.php?chanl=create_file> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Creat 자료실</b></font></a></td> <td bgcolor=black width=100> <a href = userin.php?chanl=main_view> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Home re</b></font></a></td> <td bgcolor=black width=100> <input type=hidden name=put value=$start_num> <input type=submit value=Del> </td> </form> <td bgcolor=black width=100> <form method=post action=db_view.php> <select name=chanl> <option value=file_view selected>File edit <option value=title_view>Title edit <option value=main>Db edit <option value=user_edit>user edit <option value=shop_edit>shop edit </select> </td> <td> <input type=submit value=Go.!> </td> </form> </tr> </table> </center> </html> "); } function user_view($page,$connect) { mysql_select_db('selectuser',$connect); $ally = mysql_query("select name,id,resident,email,address,tel1,wdate from userin order by wdate",$connect); $t_num=mysql_num_rows($ally); $p_dip = 10 ;//페이지당 글 수 $p_page =4 ;//페이지당 페이지 링크수 $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; if(!$page) { $page = 1; } if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; $pre_p = $page - 1 ; $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <table border=0 cellspacing=2 cellpadding=2 width=800 > <tr> <th bgcolor=white colspan=8 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page (총 회원:$t_num)</b></font></th> </tr> <tr> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>No</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Name</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Id</b></font></td> <td bgcolor=#808080 width=400 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Address</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Email</b></font></td> <td bgcolor=#808080 width=150 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Tel</b></font></td> <td bgcolor=#808080 width=150 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Wdate</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Check</b></font></td> </tr> <form method=post action=db_view.php> <input type=hidden name=chanl value=del_user> <input type=hidden name=table value=userin> "); if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=6> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 ID가 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else { $x= $t_num + 1 ; for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { $x-- ; if($pd >= 0 ) { mysql_data_seek($ally,$pd); $put=mysql_fetch_array($ally); echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> $x</font></td> <td bgcolor=black> <a href =db_view.php?chanl=user_view&id=$put[id]> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[name]</b></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[id]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[address]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[email]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:blue'> <b>$put[tel1]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:blue'> <b>$put[wdate]</b></font></td> <td bgcolor=black align=center> <input type=checkbox name=area[] value=$put[id]> </td> </tr> "); } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } else { echo (" <a href =db_view.php?chanl=user_edit&page=$pre_p> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } else { if($pp > 0 && $pp <= $t_page) { echo(" <a href =db_view.php?chanl=user_edit&page=$pp> <font style='font-size:12px;font-style:italic;color:#808080'> [$pp]</font></a>"); } } } if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font>"); } else { echo (" <a href =db_view.php?chanl=user_edit&page=$next_p> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } } echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =userin.php?chanl=main&sel=user_edit> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Creat user</b></font></a></td> <td bgcolor=black width=100> <a href = userin.php?chanl=main_view> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Home re</b></font></a></td> <td bgcolor=black width=100> <input type=submit value=Del> </td> </form> <td bgcolor=black width=100> <form method=post action=db_view.php> <select name=chanl> <option value=file_view selected>File edit <option value=title_view>Title edit <option value=main>Db edit <option value=user_edit>user edit <option value=shop_edit>shop edit </select> </td> <td> <input type=submit value=Go.!> </td> </form> </tr> </table> </center> </html> "); } function user_edit($connect,$id) { mysql_select_db('selectuser',$connect); $ally = mysql_query("select name,id,resident,email,address,homepage,tel1,uno from userin where id='$id'",$connect); $put=mysql_fetch_array($ally); echo(" <html> <title> userin_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=userin.php> <input type=hidden name=chanl value=checkid> <table border=0 cellspacing=2 cellpadding=2 width=700 > <font style='font-size:13px;font-style:italic;color:#fffff0'> (* 는 필수 입력 부분 입니다.)</font> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=ID중복확인></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=id size=9 maxlength=8>(* 4~8자의 영숫자 조합)</font></td> </tr> </form> <form method=post action=db_view.php> <input type=hidden name=chanl value=upuser> <input type=hidden name=idno value=$id> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~ID</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=id size=9 maxlength=8 value='$put[id]'> (* 4~8자의 영숫자 조합)</font></td> </tr> <tr> <td width=90 bgcolor=#808080> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=name size=9 value='$put[name]'>(* 한글 이름)</font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Email</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=email size=21 value='$put[email]'> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~HomePG</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> HTTP:// <input type=text name=home size=20 value='$put[homepage]'> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Resident</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=rsd size=15 value='$put[resident]'> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Tel1</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=tel1 size=15 value='$put[tel1]'> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~우편번호</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=uno size=8 value='$put[uno]'> </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Address</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=address size=54 value='$put[address]'>* </font></td> </tr> <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=회원수정> <input type=reset value=다시></font></td> </tr> </table> </form> </center> </body> </html> "); } function input_shop($sel,$selx) { echo(" <html> <title> input_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post enctype=multipart/form-data action=db_view.php> <input type=hidden name=chanl value=shop_query> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Price</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=price size=10></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Select</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=radio name=selx value=1>전자제품 <input type=radio name=selx value=2>의류 <input type=radio name=selx value=3>음악 <input type=radio name=selx value=4>책 </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Pdname</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=pdname size=24></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~up File</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=file name=upfile size=14></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=cont rows=5 cols=20></textarea></font></td> </tr> <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=shopup> <input type=reset value=Re></font></td> </tr> </table> </form> </center> </body> </html> "); } function shop_edit($connect,$sel) { mysql_select_db('shop',$connect); if(!$sel) { $sel = 1 ; } $ally = mysql_query("select pdname,price,cont,sel from pduct where sel='$sel'",$connect); $t_num=mysql_num_rows($ally); echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=600 > <tr> <th bgcolor=gray colspan=4 align=center> <font style='font-size:12px;font-style:italic;color:#blue'> <b> Shop Edit</b></font></th> </tr> "); if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=4><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 상품이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else { for($pd=$t_num ; $pd > 0 ; $pd--) { $put=mysql_fetch_array($ally); $cont = nl2br($put[cont]); echo(" <tr> <td bgcolor=gray colspan=4> </tr> <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> <img src=sajin.php?sel=$sel&pdname=$put[pdname] border=0></font></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$cont</b></font></a></td> <td bgcolor=black>   </td> </tr> <tr> <td bgcolor=black> <a href =db_view.php?chanl=pdname_edit&sel=$sel&pn=$put[pdname]> <font style='font-size:13px;font-style:italic;color:blue'> $put[pdname]</font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[price]원</b></font></td> <td bgcolor=black width=50> <form method=post action=db_view.php> <input type=hidden name=chanl value=del_shop> <input type=hidden name=sel value=$sel> <td bgcolor=black align=center> <input type=checkbox name=area[] value=$put[pdname]> </tr> "); } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> <td bgcolor=black > <a href =userin.php?chanl=main_view&username=$username> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Home</b></font></a><td> <td bgcolor=black > <a href =db_view.php?chanl=shop_in> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Up shop</b></font></a><td> <td bgcolor=black > <input type=submit value=Del> </td> </form> <td bgcolor=black > <form method=post action=db_view.php> <select name=chanl> <option value=file_view selected>File edit <option value=title_view>Title edit <option value=main>Db edit <option value=user_edit>user edit <option value=shop_edit>shop edit </select> <input type=submit value=Go.!> </td> </form> <td bgcolor=black > <form method=post action=db_view.php> <input type=hidden name=chanl value=shop_edit> <select name=sel> <option value=1 selected>전자제품 <option value=2>의류 <option value=3>음악 <option value=4>책 </select> <input type=submit value=Go.!> </td> </form> </tr> </table> </center> </html> "); } function pd_edit($connect,$sel,$pn,$selx,$contx) { mysql_select_db('shop',$connect); $ally = mysql_query("select pdname,price,cont,sel from pduct where sel='$sel' and pdname='$pn'",$connect); $put = mysql_fetch_array($ally); echo(" <html> <title> pdname_edit html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post enctype=multipart/form-data action=db_view.php> <input type=hidden name=chanl value=shop_query2> <input type=hidden name=pn value=$pn> <input type=hidden name=sel value=$sel> <input type=hidden name=selx value='$put[sel]'> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=checkbox name=contx value=cont>수정(해당 항목을 수정할 경우)</font> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Price</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=price size=10 value='$put[price]'></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Pdname</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=pdname size=24 value='$put[pdname]'></font></td> </tr> <tr> <td bgcolor=black> <img src=sajin.php?sel=$sel&pdname=$put[pdname] border=0> </td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~원본 화일 입니다. 아래 수정할 화일을 올리세요.</b></font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~File Change</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=file name=upfile size=14> <input type=checkbox name=poto value=edit_poto>그림 수정 </font></td> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Content</b></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <textarea name=cont rows=5 cols=20 >$put[cont]</textarea> </font></td> </tr> <tr> <td bgcolor=black align=center colspan=4> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=shopEdit> <input type=reset value=Re></font></td> </tr> </table> </form> </center> </body> </html> "); } ?>
소스 설명
db_func_all.php 파일은 함수들로 구성되어 있으며 각 화면을 표현 합니다. db_view.php 파일을 이용해서 함수를 다양한 방법으로 사용합니다.
main($page,$connect,$select,$dbs,$tableput,$root) 함수
admin 영역의 데이터 베이스 메인 함수 입니다. 여러 admin영역 중 데이터베이스의 메인화면을 보여주며 여러가지 테이블 인자에 의해 화면이 달라집니다. 즉, 데이터베이스 admin 중 데이터 베이스 부분과 테이블 부분 등의 화면을 이 함수로 처리 합니다.
함수 인자
$connect = mysql_connect('localhost','root','gksmf444'); /* mysql에 접속하기 위한 호스트와 계정 , 패스워드를 입력 하는 부분 입니다. */ function main($page,$connect,$select,$dbs,$tableput,$root) { $page - 데이터 베이스 admin의 해당 페이지를 전달 합니다. $connect - 데이터 베이스 접속 인자들을 전달 합니다. $select - 데이터 베이스 admin의 각 화면을 설정 하는 부분이며 이 변수를 이용해서 테이블 화면 , 필드 화면 , 데이터 베이스 리스트 화면 등을 구분 합니다. $dbs - 데이터 베이스 이름을 전달 합니다. 이 변수를 사용해서 화면에 선택한 데이터 베이스를 보여 줍니다. $tableput - 테이블 이름을 전달 합니다. $root - admin 의 쿠키를 전달 합니다.
화면 출력 선택 하기
$select, $dbs, $tableput 변수를 이용해서 데이터 베이스 admin 메인 화면의 출력을 결정 합니다. 처음 데이터 베이스의 리스트를 보여주며 특정 데이터 베이스를 선택할 경우 테이블을 보여 주고 특정 테이블을 선택하면 필드 정보를 나열 합니다. 이 모든 것이 메인 함수에서 이루어 지기 위해 각 변수의 전달 인자에 따른 화면 구성을 해야 합니다. if($select == tables) { /* $select 가 tables일 경우 데이터 베이스 admin 화면은 해당 데이터 베이스에 존재하는 테이블을 보여 줍니다. */ mysql_select_db($dbs,$connect); /* $dbs의 데이터 베이스를 선택 합니다. */ $ally = mysql_query("show tables ",$connect); /* 해당 데이터 베이스에 존재하는 테이블을 검색 합니다. */ $t = "Table($dbs Db) hong il mansei~!"; /* $t 변수에 해당 데이터 베이스의 이름을 저장 합니다. */ $link = "<a href=db_view.php?chanl=create_table&dbs=$dbs>"; /* $link 변수에 해당 데이터 베이스의 새로운 테이블 생성 항목을 링크 합니다. */ $linkdel = "<a href=db_view.php?chanl=dbdel&dbs=$dbs>"; /* $linkdel 변수에 해당 데이터 베이스의 삭제 항목을 링크 합니다. */ } if(!$select) { $ally = mysql_query("show databases ",$connect); /* $select 항목이 없을 경우 $ally 변수에 존재 하는 데이터 베이스 리스트를 저장 합니다.*/ $t = "Database Names hong il mansei~!" ; /* $t 변수에 admin 영역 출력 부분에 보여줄 문구를 저장 합니다. 이 부분은 다른 기능을 추가할 소지가 있습니다. */ $link = "<a href =db_view.php?chanl=create_db>"; /* $link 변수에 새로운 데이터 베이스 생성 항목을 링크 합니다. */ } if($select == field) { /* $select 변수가 field이면 해당 테이블의 필드 정보를 출력 합니다. */ mysql_select_db($dbs,$connect); /* 해당 데이터 베이스를 선택 합니다. */ $ally = mysql_query("describe $tableput " , $connect); /* 선택한 테이블의 필드 속성을 검색하고 $ ally 변수에 저장 합니다. */ $link1 = "<b><a href =db_view.php?chanl=main&select=tables&dbs=$dbs> /* $link1 변수에 해당 테이블 항목을 링크 합니다. */ ($dbs Db)</b></a> "; /* 해당 데이터 베이스 이름을 출력 합니다. */ $link2 = "<b>($tableput Table)</b>"; /* $link2 변수에 해당 테이블 이름을 출력 합니다. */ }
데이터 베이스 admin 화면 선택
데이터 베이스 admin 메인 화면에서 $select 변수에 따라 메인 화면이 달라 지는데 $select 변수 값이 field일 경우 해당 테이블의 필드속성을 보여주는 항목을 나열 합니다. if($select == field) { /* $select 변수가 field일 경우 해당 테이블의 필드 속성 제목을 출력 합니다. */ echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th bgcolor=white colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> /* 테이블 필드 항목에서 페이지 현황을 출력 합니다. */ </tr> <tr> <td bgcolor=#808080 width=150> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Field</b></font></td> <td bgcolor=#808080 width=200 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Type</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Null</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Key</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Default</b></font></td> <td bgcolor=#808080 width=150 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Extra</b></font></td> </tr> /* 해당 테이블의 필드 속성의 이름을 출력 합니다. 차례로 Field , Type , Null , Key , Default , Extra 등이 있습니다. */ "); } else { /* 그 밖의 경우 데이터 베이스 리스트와 테이블 리스트를 나열 합니다. */ echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> <th bgcolor=white align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> /* 해당 화면의 페이지 현황을 출력 합니다. */ </tr> <tr> <td bgcolor=#808080 width=450> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$t</b></font></td></tr> "); }
데이터 베이스 admin 각 메인 화면의 리스트 나열 부분
데이터 베이스 admin 각 메인 화면은 $select 변수 값에 따라 필드 정보와 데이터 베이스 리스트 , 테이블 리스트 등으로 변합니다. 각 항목의 리스트를 출력하는 부분이며 for문을 이용 합니다. 이것은 각 게시판에 사용한 방법과 같습니다. */ for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { /* 데이터 베이스 검색 결과에서 페이지 할당 만큼 출력 합니다. */ if($pd >= 0 ) { /* $pd가 - 정수가 아닐 경우 실행 합니다. */ mysql_data_seek($ally,$pd); /* 레코드 위치를 옮깁니다. */ $db=mysql_fetch_array($ally); /* 해당 레코드의 정보를 $db 변수에 배열로 저장 합니다. */ if(!$select) { /* $select 값이 없을 경우 실행 합니다. */ echo(" <tr> <td bgcolor=black> <a href ='db_view.php?chanl=main&dbs=$db[Database]&select=tables'> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Database]</b></font></a></td> /* 존재 하는 데이터 베이스 이름을 출력 합니다. */ "); } if($select == tables) { /* $select 변수가 tables일 경우 실행 합니다. */ echo(" <tr> <td bgcolor=black> <a href ='db_view.php?chanl=main&dbs=$dbs&select=field&tableput=$db[0]'> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[0]</b></font></a></td> /* 해당 데이터 베이스의 테이블 이름을 출력 합니다. */ "); } if($select == field) { /* $select 값이 field일 때 실행 합니다. */ echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Field]</b></font></a></td> /* 해당 테이블의 필드 항목을 출력 합니다. */ <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Type]</b></font></a></td> /* 해당 테이블의 Type 항목을 출력 합니다. */ <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Null]</b></font></a></td> /* 해당 테이블의 Null 항목을 출력 합니다. */ <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Key]</b></font></a></td> /* 해당 테이블의 Key 항목을 출력 합니다. */ <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Default]</b></font></a></td> /* 해당 테이블의 Default 항목을 출력 합니다. */ <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Extra]</b></font></a></td> /* 해당 테이블의 Extra 항목을 출력 합니다. */ "); } }
데이터 베이스 admin 페이지 링크
데이터 베이스 admin 메인 화면에서 페이지로의 링크를 설정 하는 부분 입니다. for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { /* 한 페이지당 설정된 페이지 링크 수 만큼 생성 합니다. */ if($pp == $page ) { /* $pp 변수 값이 현재 페이지 수와 같을 경우 실행 합니다. */ echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> /* 현재의 페이지를 출력 합니다. */ "); } else { if($pp > 0 && $pp <= $t_page) { /* 현재 페이지 수가 0 보다 크고 총 페이지 수보다 작거나 같아야 실행 합니다. */ if(!$select) { echo(" <a href =db_view.php?chanl=main&page=$pp> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a>"); } /* $select 값이 없을 경우 데이터 베이스 리스트 항목 페이지 링크를 만듭니다. */ if($select == tables) { echo(" <a href =db_view.php?chanl=main&page=$pp&dbs=$dbs&select=tables> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a>"); /* $select 값이 tables 일 때 해당 데이터 베이스 테이블 리스트 페이지 링크를 만듭니다.*/ } if($select == field) { echo(" <a href =db_view.php?chanl=main&page=$pp &dbs=$dbs&select=field&tableput=$tableput> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a>"); /* $select 값이 field 일 때 해당 테이블 필드 항목을 페이지 링크 합니다. */ } } } } 다음 장은 데이터 베이스를 웹상에서 수정 작업 하는 방법을 간단히 소스와 함께 설명 합니다.
17. 데이터 베이스 유틸리티 및 Admin 부분
데이터 베이스의 경우 직접 local 에서 쿼리들을 실행 하는 방법만을 지금까지 보아 왔습니다. 여기서 소개할 데이터 베이스 유틸리티는 원격에서 mysql에 설정 되어 있는 계정으로 접속(host , id , password) 해서 각각의 데이터 베이스를 관리하는 유틸리티 스크립트를 소개 하겠습니다. 즉 브라우저 상에서 직접 쿼리들을 입력 하고 실행 하는 것입니다. 그리고, 각각의 게시판( 경매 , 자료실)의 다중 생성과 지움을 할 수 있는 Admin 영역을 살펴 보겠습니다. 이 두 스크립트는 아직 추가 되고 수정될 부분들이 많이 존재 합니다. 앞에서 설명한 소스와 마찬가지로 여러분들이 새로운 아이템을 추가 해서 사용 하기 바랍니다. 먼저 Admin 영역을 만들기 위해 하나의 데이터 베이스와 두개의 테이블을 생성 합니다.
17.1 Admin 영역 , 데이터 베이스 유틸리티 구성과 데이블 생성
Admin 영역은 여러 가지 권한을 사용한 다양한 방법으로 작성 할 수 있습니다. 다음에 소개 할 소스는 다소 못미치는 부분들이 많이 있지만 각각의 계정에 따른 권한의 설정 등으로 다양한 Admin 영역을 만들 수 있습니다. 즉, 회원제 사이트의 경우 각 게시판을 관리하는 사람을 설정하는 부분을 만든다든지 물론 이 관리자는 다른 게시판에 관한 권한은 없게 하는 등의 여러 방법들이 있습니다. 데이터베이스 유틸리티의 경우 외국 php 관련 사이트에서 이와 유사한 더 많은 기능과 사용자 중심의 스크립트 들이 존재합니다. 관련 소스는 php사이트를 방문 하면 얻을 수 있지만 보다 간단히 설명 하기위해 제가 직접 소스를 만들어 보았습니다. 이 두 부분을 만들기 위한 스크립트는 중요 부분이 3개 존재 합니다. 함수만 존재 하는 파일 그리고 이 함수를 이용한 화면용 루틴 파일 그리고 쿠키를 생성하고� Admin 영역으로 접속하게 하는 파일입니다. 파일은 db_view.php (함수를 이용한 화면출력 루틴들) db_func_all.php(함수 집합 파일) logon.php(쿠키의 생성과 어드민 접속) 먼저 Admin영역으로 접속 하기 위한 링크는 각 게시판 메인 화면에 보면 있습니다. 그림. 15-1 과 그림. 14-1 의 아래 부분에 Admin 링크를 클릭 하면 로그온 화면이 출력됩니다. 이 부분은 소스에서 설명 하겠습니다. 그럼 이 영역을 만들기 위한 데이터 베이스와 테이블을 생성 하겠습니다.

위 그림. 17-1 은 자료실 게시판에서 Admin 영역으로 로그온 한 화면 입니다. 데이터 베이스와의 연관 부분은 no - 해당 게시판 번호 title - 해당 게시판 제목 mview - 해당 게시판의 첫번째 테이블 이름 view - 해당 게시판의 두번째 테이블 이름 sum - 각 게시판에 게시된 글의 수량을 저장 하는 부분 date - 해당 게시판의 생성된 날짜 위 항목들은 adminp 데이터 베이스에 존재하는 자료실 테이블(file) 입니다. 경매 게시판의 테이블(admin) 또한 위 항목과 같습니다. 먼저 데이터 베이스를 만듭니다.

데이터 베이스를 생성 했다면 자료실 테이블을 만들 파일을 생성 합니다. Pico 편집기나 다른 유틸리티를 이용해서 만듭니다.

다음 경매 게시판 테이블을 생성 합니다.

그림. 17-1 에서 해당 게시판 제목을 클릭 하면 해당 게시판으로 이동 하게 됩니다. 물론 Admin 권한으로 이동 하는 것입니다. 이렇게 되면 모든 게시물을 삭제 할 수 있는 권한이 주어 집니다. 이런 방법으로 각각의 계정 서비스를 할 경우 해당 아이디별 권한을 설정 할 수 있는 것입니다. 그럼 소스를 보면서 경매 Admin과 자료실 Admin 그리고 데이터 베이스 유틸리트 등을 설명하겠습니다.
17.2 db_func_all.php 파일
<?php ////////////////////////////////////////////////// // // 일자 : 2000.3.14 pm 5 // 작성자: skycry (hong il) // // // method : 데이타 베이스 utility ^^; // 그리고, Admin function ////////////////////////////////////////////////// //먼저 소스의 각각의 함수를 설명 할 때 두서 없는 부분이 조금 있을 것입니다. 각각의 함수 부분은 일부 영역들 이므로 이들은 조합하는 db_view.php를 볼 때 세심히 봐주기 바랍니다.// $connect = mysql_connect('localhost','root','gksmf444'); // 데이터 베이스 접속 부분 입니다.// ?> <?php //아래 함수는 화면을 먼저 보면서 설명 하겠습니다. 그림 17-1에서 Db Edit를 클릭하면 링크 되는 화면 입니다.//

function main($page,$connect,$select,$dbs,$tableput,$root) { // 이 함수는 메인 화면 이지만 각각의 인자를 받으면서 다른 화면을 출력 합니다. 즉 하나의 함수에 다양한 화면을 구성 한 것 입니다. 보다 전문적인 함수는 아니지만 이런 방법으로 하나씩 만들면서 늘어 가는 것입니다. 위 인자 중 $select 가 tables , field 중 하나를 받음에 따라 화면의 출력이 달라 집니다. if($select == tables) { mysql_select_db($dbs,$connect); $ally = mysql_query("show tables ",$connect); $t = "Table($dbs Db) hong il mansei~!"; $link = "<a href=db_view.php?chanl=create_table&dbs=$dbs>"; $linkdel = "<a href=db_view.php?chanl=dbdel&dbs=$dbs>"; } // 위 조건일 경우 데이터 베이스 선택과 해당 데이터 베이스의 테이블을 쿼리하고 테이블 화면의 메뉴 링크를 만들어 줍니다.// if(!$select) { $ally = mysql_query("show databases ",$connect); $t = "Database Names hong il mansei~!" ; $link = "<a href =db_view.php?chanl=create_db>"; } //만약 $select 인자가 없다면 데이터 베이스 유틸 화면의 메인 부분을 보여 줍니다.// if($select == field) { mysql_select_db($dbs,$connect); $ally = mysql_query("describe $tableput " , $connect); $link1 = "<b><a href =db_view.php?chanl=main&select=tables&dbs=$dbs> ($dbs Db)</b></a> "; $link2 = "<b>($tableput Table)</b>"; } //위 조건일 경우 해당 데이터 베이스를 선택 하고 해당 테이블을 쿼리 합니다. 그리고, 해당 테이블의 필드 정보 화면의 메뉴들을 링크 합니다.// $t_num=mysql_num_rows($ally); $p_dip = 4 ;//페이지당 글 수 $p_page =4 ;//페이지당 페이지 링크수 $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; // 위 항목들은 게시판 스크립트 의 설명과 동일 합니다.// if(!$page) { $page = 1; } if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; $pre_p = $page - 1 ; $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; // 여기 까지 부분 역시 게시판의 글의 출력물 수와 패이지 링크 부분 입니다.//

if($select == field) {// 만약 위 조건이면 해당 데이터 베이스의 테이블에서 각 필드 정보 화면의 제목 부분을 출력 합니다. 그림. 17-6을 참고 하세요.// echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th bgcolor=white colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> // 페이지 표시 부분 입니다.// </tr> <tr> <td bgcolor=#808080 width=150>0 <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Field</b></font></td> <td bgcolor=#808080 width=200 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Type</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Null</b></font></td> <td bgcolor=#808080 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Key</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Default</b></font></td> <td bgcolor=#808080 width=150 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Extra</b></font></td> </tr> "); } else {//해당 테이블의 필드 정보 항목이 아니면 나머지 화면은 아래 코드를 출력 합니다.// echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> <th bgcolor=white align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> </tr> <tr> <td bgcolor=#808080 width=450> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$t</b></font></td></tr> "); } if(!$t_num) {//해당 데이터 베이스에 내용이 없을 경우// echo (" <tr> <th bgcolor=black colspan=6> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 데이타,테이블이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else {// 해당 데이터 베이스에 내용이 있을 경우// for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { if($pd >= 0 ) { mysql_data_seek($ally,$pd); $db=mysql_fetch_array($ally); // 이 부분은 다른 게시판의 부분과 같습니다 14장 15장 참조// if(!$select) {//데이터 베이스 유틸의 메인 화면 출력 입니다.// echo(" <tr> <td bgcolor=black> <a href ='db_view.php?chanl=main&dbs=$db[Database]&select=tables'> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Database]</b></font></a></td> "); } if($select == tables) {//해당 데이터 베이스의 테이블 항목을 출력합니다.// echo(" <tr> <td bgcolor=black> <a href ='db_view.php?chanl=main&dbs=$dbs&select=field&tableput=$db[0]'> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[0]</b></font></a></td> "); } // if($select == tables) 항목의 경우 이 소스에서는 아래 그림. 17-7을 참고 하세요//

if($select == field) {//해당 데이터 베이스 테이블의 필드 정보를 출력 합니다.// echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Field]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Type]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Null]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Key]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Default]</b></font></a></td> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$db[Extra]</b></font></a></td> "); } } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } else { if($select == tables) {// 해당 데이터 베이스의 테이블 항목 출력 시에 페이지 링크 입니다.// echo (" <a href =db_view.php?chanl=main&page=$pre_p&dbs=$dbs&select=tables> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } if(!$select) {//해당 데이터 베이스 화면의 페이지 링크 입니다.// echo (" <a href =db_view.php?chanl=main&page=$pre_p> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } if($select == field) {//해당 데이터 베이스 테이블의 필드 정보 화면의 페이지 링크 입니다.// echo (" <a href =db_view.php?chanl=main&page=$pre_p&dbs= $dbs&select=field&tableput=$tableput> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } } for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } else { if($pp > 0 && $pp <= $t_page) { if(!$select) { echo(" <a href =db_view.php?chanl=main&page=$pp> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a> "); } if($select == tables) { echo(" <a href =db_view.php?chanl=main&page=$pp&dbs=$dbs&select=tables> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a> "); } if($select == field) { echo(" <a href =db_view.php?chanl=main&page=$pp&dbs= $dbs&select=field&tableput=$tableput> <font style='font-size:12px;font-style:italic;color:#808080'>[$pp]</font></a> "); // 이 부분 역시 위 각 화면 마다의 링크 부분들 입니다.// } } } } // 이렇게 모든 게시판 형태의 스크립트는 한가지 방법에 다른 방법을 접목 함으로서 다양한 형태의 스크립트를 생성 할 수 있습니다. 나머지 메인 화면 함수 부분 역시 지금 까지 보아온 게시판 소스와 유사 합니다. 경매나 자료실 게시판의 소스를 이해 했다면 이 부분은 쉽게 이해가 될 것입니다.// if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font> "); } else { if($select == tables) { echo (" <a href =db_view.php?chanl=main&page=$next_p&dbs=$dbs&select=tables> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a> "); } if(!$select) { echo (" <a href =db_view.php?chanl=main&page=$next_p> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } if($select == field) { echo (" <a href =db_view.php?chanl=main&page=$next_p&dbs= $dbs&select=field&tableput=$tableput> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a> "); } } } if($select != field) { $td = "<td bgcolor=black width=100> $link // 이 함수 제일 처음 선언 했던 변수를 불러 오는 것입니다. $select가 위 조건일 경우 링크 입니다.// <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>New </b></font></a></td>"; if($select == tables) { $td = "<td bgcolor=black width=100> $link <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>New </b></font></a></td> <td bgcolor=black width=100> $linkdel <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Db Del </b></font></a></td>"; } } else { $td = "<td bgcolor=black width=300> <font style='font-size:13px;font-style:italic;color:red'> $link1 > $link2 // 함수 처음 부분의 변수 선언을 불러 오는 부분 입니다. 역시 해당 테이블의 필드 정보 화면에서 전의 화면으로 링크 하는 부분 입니다. 그림. 17-6 참조// </font></td> <td bgcolor=black width=100> <a href =db_view.php?chanl=tabledel&dbs=$dbs&tableput=$tableput> <font style='font-size:13px;font-style:italic;color:#ffd700'> Del Table </font></a></td>"; } echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> $td <td bgcolor=black width=100> <a href = test.php> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Home re</b></font></a></td> <td bgcolor=black width=100> <form method=post action=db_view.php> <select name=chanl> <option value=file_view selected>File edit <option value=title_view>Title edit <option value=main>Db edit </select> // 각 화면에 존재 하는 게시판 이동 풀다운 메뉴 항목 입니다.// </td> <td> <input type=submit value=Go.!> </td> </form> "); if($tableput) {// 위 인자가 존재 하면 해당 테이블 필드 정보 화면 이므로 아래의 메뉴를 더 화면에 출력해 줍니다. 다음 코드는 alter 쿼리 명령어를 직접 입력 하는 메뉴 입 니다. (그림. 17-6 을 참고 하세요.) 이러한 설정은 mysql의 모든 명령어를 나열 하는 등의 여러 가지 사용자 중심의 인터페이스로 디자인 가능 합니다. 가령 필드 정보를 파일로 저장 한다든지 테이블 정보를 담은 파일을 불러와 바로 입력 하는 기능 생각하기에 따라 여러 다양한 형식이 존재 합니다. 여러분들이 더 새로운 기능 을 추가 해서 만들어 보면 재미 있을 것입니다.// echo(" </tr> </table> <br><br> <table border=0 cellspacing=2 cellpadding=2 width=500 > <tr> <th bgcolor=gray colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:white'> <b>Attribute Add/Del insert Attribute Name</b></font></th> </tr> <tr> <td bgcolor=black width=200> <font style='font-size:13px;font-style:italic;color:blue'> <b>Alter Table $tableput</b></font></td> <td bgcolor=black width=50> <font style='font-size:13px;font-style:italic;color:#ffd700'> <form method=post action=db_view.php> <input type = hidden name=tn value=$tableput> <input type = hidden name=chanl value=e_field> <input type = hidden name=dbs value=$dbs> <select name=tct> <option value=add selected>Add <option value=drop >Del </select> //해당 테이블 명과 데이터 베이스명 그리고 alter 명령인 add ,drop 중 택해서 해당 루틴으로 전달 하는 폼 문 입니다.// </td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#ffd700'> <input type = text name='tablequ' size=14> // 해당 테이블의 필드 정보를 입력 하는 부분 입니다.// </font></td> <td> <input type=submit value=Go.!> //Go.! 버튼을 생성해 인자들을 전달 합니다.// </td> </form> "); } echo(" </tr> </table> </center> </html> "); } //main( ) 함수의 끝입니다.// //경매 나 자료실 게시판과 달리 Db 유틸리티 메인 화면의 경우 한 함수에서 여러 화면(데이터 베이스 , 테이블 , 테이블 필드정보)을 표현 했습니다. 이렇듯 생각 하기 에 따라 여러 다양한 방법이 존재 합니다. 무엇보다 중요한 부분은 이러한 작업을 할 때 데이터 베이스와의 연결 설정 입니다. 필자의 경우 아직 미숙한 점이 많습니다. 스크립트 작성시에는 이 부분을 꼭 신경 써서 작성 하기 바랍니다.// function create_db1() {// 데이터 베이스 유틸의 메인 화면에서(그림. 17-5) 에서 New 를 클릭 할 경우 링크되는 부분 입니다. //

echo(" <html> <title> creat_db html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=db_view.php> <input type=hidden name=chanl value=create_db2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Db Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=dbname size=10></font></td> //새로이 만들 데이터 베이스 이름을 적어주는 부분 입니다.// <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=만들기> //만들기 버튼을 생성 합니다.// </font></td> </table> </tr> </form> </center> </body> </html> "); }

//위 그림은 경매 게시판에서 Admin 으로 로그온 했거나 Db 유틸리티의 이동 메뉴로 이동 했을 경우의 경매 Admin 부분 입니다.// //그림. 17-9 에서 Create 경매를 클릭 했을 경우 링크 화면과 함수를 보겠습니다.

// 그림. 17-10을 보면 게시판에 사용될 테이블 이름을 적는 란과 게시판의 이름을 적는 부분이 존재 합니다. 여기서 여러분들이 참고 할 부분은 테이블 이름은 데이터 베이스에 생성하는 부분 이므로 영문 표기를 해야 되고 붙여 써야 합니다. 이 부분의 에러 화면은 만들지 않았습니다. 하지만 간단한 자바를 이용한 방법이 있으므로 추가 하면 좋을 것입 니다. 테이블 이름은 적어 보내면 두개의 테이블을 자동 생성 합니다. 아래 create_title() 함수와 그림 17-10을 비교 해보기 바랍니다.// function create_title() { echo(" <html> <title> creat_db html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=db_view.php> <input type=hidden name=chanl value=create_title2> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Table Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=ctitle size=10></font></td> //새로운 경매 게시판에 사용할 테이블 이름을 적는 부분 입니다.// </tr> <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~게시판 Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=10></font></td> // 새로운 경매 게시판의 이름을 적는 부분 입니다.// <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=만들기> // 만들기 버튼을 생성 합니다.// </font></td> </tr> </table> </form> </center> </body> </html> "); }// create_title() 의 끝입니다.//

// 그림 17-1은 그림 17-1에서 Create 자료실을 클릭 했을 경우 링크 입니다.// function create_file() {// 이 함수 역시 새로운 자료실 게시판을 생성하는 부분 입니다. 그림. 17-11을 참고 하세요// echo(" <html> <title> creat_db html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=db_view.php> <input type=hidden name=chanl value=create_title3> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Table Name</b></font></td> <td bgcolor=black width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=ctitle size=10></font></td> // 새로 만들 자료실 게시판에 사용할 테이블 이름을 적는 부분 입니다.// </tr> <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~자료실 Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=title size=10></font></td> //해당 자료실 이름을 적는 부분 입니다.// <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=만들기> </font></td> </tr> </table> </form> </center> </body> </html> "); }// create_file() 의 끝입니다.// function title_view($page,$connect,$s_db) {// 이 함수는 경매 게시판의 메인 화면 출력 부분 입니다.(그림. 17-9) 이렇게 경매 메인 화면과 자료실 메인 화면을 따로 할 수도 있겠지만 보다 부피를 줄인다면 앞의 데이터 베이스 유틸의 화면 다중화처럼 만들 수도 있겠죠. 처음 부분은 지금 까지 봐온 메인 화 면 부분과 동일 합니다. 다만 여기서는 데이터 베이스 연결 부분이 함수 안에 존재 합니다// mysql_select_db(adminp,$connect); $ally = mysql_query("select no,title,mview,view,sum,wdate from admin order by no ",$connect); $t_num=mysql_num_rows($ally); $p_dip = 1 ;//페이지당 글 수 $p_page =4 ;//페이지당 페이지 링크수 $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; if(!$page) { $page = 1; } if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; $pre_p = $page - 1 ; $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; echo("// 메인 화면 타이틀 부분 입니다.// <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=db_view.php> <input type=hidden name=chanl value=del_title> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th bgcolor=white colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>No</b></font></td> <td bgcolor=#808080 width=400> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Title</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>MView</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>View</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>sum</b></font></td> <td bgcolor=#808080 width=150 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>date</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>check</b></font></td> </tr> "); if(!$t_num) {// 해당 데이터 베이스 테이블에 항목들이 없을 경우 입니다.// echo (" <tr> <th bgcolor=black colspan=6> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 글이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else {//항목이 존재할 경우 입니다.// for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { if($pd >= 0 ) { mysql_data_seek($ally,$pd); $put=mysql_fetch_array($ally); echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> $put[no]</font></td> //메인 화면 게시판 번호 출력 부분 입니다.// <td bgcolor=black> <a href =main_view.php?chanl=main_view&f=$put[mview]&f2=$put[view]> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[title]</b></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[mview]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[view]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[sum]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:blue'> <b>$put[wdate]</b></font></td> <td bgcolor=black align=center> <input type=radio name=s value=$put[mview]> <input type=hidden name=x value=$put[view]> </td> </tr> "); } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } else { echo (" <a href =db_view.php?chanl=title_view&page=$pre_p> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } else { if($pp > 0 && $pp <= $t_page) { echo(" <a href =db_view.php?chanl=title_view&page=$pp> <font style='font-size:12px;font-style:italic;color:#808080'> [$pp]</font></a> "); } } }//for의 끝입니다.// if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font>"); } else { echo (" <a href =db_view.php?chanl=title_view&page=$next_p> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } }//else의 끝입니다.// echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =db_view.php?chanl=create_title> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Creat 경매</b></font></a></td> <td bgcolor=black width=100> <a href =db_view.php?chanl=main> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Db Edit</b></font></a></td> <td bgcolor=black width=100> <input type=hidden name=put value=$start_num> <input type=submit value=Del> </td> </tr> </table> </form> </center> </html> "); }// title_view( ) 의 끝입니다.//

function logon($file) { // 이 부분은 각 메인 화면에서 Admin으로 로그온 할 경우 화면 입니다. 그림. 17-12 를 참고 하세요.// echo(" <html> <title> passw view </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=logon.php> //여기 입력한 파일은 logon.php 파일로 인자들이 전달 되어 집니다. Logon.php파일 에 대해서는 뒤에서 설명 하겠습니다.// <input type=hidden name=chanl value=$file> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 align=center width=74> <font style='font-size:13px;font-style:italic;color:#blue'> <b>admin login</b></font></td> </tr> <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Host</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=host size=10></font></td> //mysql에 등록 되어 있는 계정의 host 이름을 적어 줍니다.// </tr> <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Name</b></font></td> fffff0'> <b>~Name</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=id size=10></font></td> //mysql 접속 계정을 입력 합니다.// </tr> <tr> <td bgcolor=#808080 width=74><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~passw</b></font></td> <td bgcolor=black width=100><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=password name=passw size=10></font></td> //mysql 접속 계정의 패스워드를 입력 합니다.// <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=입력> </font></td> </tr> </table> </form> </center> </body> </html> "); }// logon($file) 의 끝입니다.// function file_view($page,$connect,$s_db) {// 자료실 게시판의 Admin(그림 17-1) 부분 입니다. 앞의 다른 메인 화면 부분과 같은 부분 이므로 간략한 설명만 하겠습니다.// mysql_select_db(adminp,$connect); $ally = mysql_query("select no,title,mview,view,sum,wdate from file order by no ",$connect); $t_num=mysql_num_rows($ally); $p_dip = 3 ;//페이지당 글 수 $p_page =4 ;//페이지당 페이지 링크수 $p_pagex = ceil($p_page / 2) ; $t_page = ceil($t_num / $p_dip) ; if(!$page) { $page = 1; } if( $page <= $p_pagex ) { $p_start = $p_pagex + 1 ; } else { $p_start = $page + 1; } $pt_page = ceil($p_start - $p_pagex) ; $next_p = $page + 1 ; $pre_p = $page - 1 ; $start_num = ($t_num - ($page * $p_dip))+($p_dip-1) ; echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=db_view.php> <input type=hidden name=chanl value=del_title> <input type=hidden name=table value=file> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th bgcolor=white colspan=7 align=left> <font style='font-size:12px;font-style:italic;color:#blue'> <b>$t_page / $page </b></font></th> </tr> <tr> <td bgcolor=#808080><font style='font-size:13px;font-style:italic;color:#fffff0'> <b>No</b></font></td> <td bgcolor=#808080 width=400> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>Title</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>MView</b></font></td> <td bgcolor=#808080 width=75 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>View</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>sum</b></font></td> <td bgcolor=#808080 width=150 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>date</b></font></td> <td bgcolor=#808080 width=50 align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>check</b></font></td> </tr> "); if(!$t_num) { echo (" <tr> <th bgcolor=black colspan=6> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>등록된 글이 엄스요... ^^;</b></font></th> </tr> </center> </table> </html> "); } else { for($pd=$start_num ; $pd > $start_num-$p_dip ; $pd--) { if($pd >= 0 ) { mysql_data_seek($ally,$pd); $put=mysql_fetch_array($ally); echo(" <tr> <td bgcolor=black> <font style='font-size:13px;font-style:italic;color:blue'> $put[no]</font></td> <td bgcolor=black> <a href =m.php?chanl=main_view&f=$put[mview]&f2=$put[view]> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[title]</b></font></a></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[mview]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:red'> <b>$put[view]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>$put[sum]</b></font></td> <td bgcolor=black align=center> <font style='font-size:13px;font-style:italic;color:blue'> <b>$put[wdate]</b></font></td> <td bgcolor=black align=center> <input type=radio name=s value=$put[mview]> <input type=hidden name=x value=$put[view]> </td> </tr> "); } } echo(" <tr> <td bgcolor=black colspan=7> </td> </tr> <tr> <td bgcolor=black colspan=7 align=center> "); if($page == 1) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'>first </font> "); } else { echo (" <a href =db_view.php?chanl=file_view&page=$pre_p> <font style='font-size:12px;font-style:italic;color:#fffff0'><< </font></a>"); } for($pp=$pt_page ; $pp < $p_page+$pt_page ; $pp++) { if($pp == $page ) { echo (" <font style='font-size:13px;font-style:italic;color:red'> $pp</font> "); } else { if($pp > 0 && $pp <= $t_page) { echo(" <a href =db_view.php?chanl=file_view&page=$pp> <font style='font-size:12px;font-style:italic;color:#808080'> [$pp]</font></a>"); } } } if($page == $t_page) { echo (" <font style='font-size:12px;font-style:italic;color:#fffff0'> last^^ </font>"); } else { echo (" <a href =db_view.php?chanl=file_view&page=$next_p> <font style='font-size:12px;font-style:italic;color:#fffff0'>pre>></font></a>"); } } echo(" </td> </tr> </center> </table> <br> <center> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=black width=100> <a href =db_view.php?chanl=create_file> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Creat 자료실</b></font></a></td> <td bgcolor=black width=100> <a href =db_view.php?chanl=main> <font style='font-size:13px;font-style:italic;color:#ffd700'> <b>Db Edit</b></font></a></td> <td bgcolor=black width=100> <input type=hidden name=put value=$start_num> <input type=submit value=Del> </td> </tr> </table> </form> </center> </html> "); } ?>//db_func_all.php 의 끝입니다.// 다음은 logon.php 파일에 대해 설명하겠습니다. 그림. 17-12 의 전달인자를 받아 쿠키를 생성하는 부분입니다.
17.3 logon.php 파일
먼저 해당 쿠키를 생성 하는 방법 이외에 php 4.0 부터는 세션 항목이 추가 되어 있습니다. 이것을 이용해서 회원제 사이트를 구성할 경우 해당 계정 마다 각각의 세션을 저장할 필드를 생성함으로 해서 접속과 해당 유저의 접근관리가 수월해 집니다. 여기서는 이러한 방법을 적용하지는 않았지만 어렵지않은 구성이므로 한번 만들어 보기 바랍니다. <?php $connect = mysql_connect('localhost','root','gksmf444'); mysql_select_db('mysql',$connect); $passwput = mysql_query("select password('$passw')"); $passwput1 = mysql_result($passwput,0,0); //전달 받은 패스워드를 암호화 합니다.// $allyp = mysql_query("select Host,User,Password from user where Host='localhost' and User='root' ",$connect ); //해당 조건에 맞는 정보들을 검색 합니다. 여기서 유저와 호스트 부분을 변수로 만들 경우를 생각 해보기 바랍니다. 이러한 방법으로 각 게시판의 인증을 달리 할 수 있습니다.// $puth = mysql_result($allyp,0,'Host'); $puti =mysql_result($allyp,0,'User'); $putp = mysql_result($allyp,0,'Password'); //데이터 베이스 쿼리에서 각각의 정보를 변수에 저장 합니다.// if($puth != $host || $puti != $id || $putp != $passwput1 ) { echo(" <script> window.alert('host,id,passw가 틀립니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; }// 해당 전달 인자가 하나라도 틀릴 경우 에러 화면을 출력 합니다.// else {// 다 맞을 경우 해당 쿠키를 만듭니다. 이것은 전달 인자가 하나라도 틀리면 쿠키는 전혀 생성 되지 않는 것입니다.// $userid = md5(uniqid(rand())); setcookie("root",$userid,0); include('db_func_all.php'); // 포함은 쿠키 보다 뒤에 와야 합니다.// if(!$chanl) { title_view($page,$connect,$s_db,$userid); // 채널이 없을 경우 경매 게시판 Admin으로 이동 합니다.// } else { file_view($page,$connect,$s_db,$userid); // 그 밖의 경우 자료실 게시판으로 이동 합니다.// } } ?> // 만약 쿠키를 얻고 난 후 다시 게시판으로 이동 한다면 게시판 메인 화면에는 Admin 이라는 표시가 생기게 됩니다. 다음은 함수들을 이용한 각 화면 출력 루틴 파일을 살펴 보겠습니다.//
17.4 db_view.php 파일
이 파일의 조건식은 쿠키가 존재 하는지 여부를 묻는 조건에 둘러져 있습니다. 이것은 Admin 영역 이므로 만약 다른 이가 이영역으로 바로 접근한다면 로그인 화면이 뜰것 입니다. 그것은 해당 쿠키의 존재 여부를 확인하는 방법입니다. 이것은 보안상 좋은 방법이 아닙니다. 여러분들은 소스를 다시 확인해서 더 새로운 방법을 택하기 바랍니다. <?php include('db_func_all.php'); ?> <?php if($chanl == rootin || !$root) { logon($file); } //$chanl 의 값이 rootin 이거나 쿠키가 존재 하지 않을 경우 실행 되는 부분 입니다.// if($root) { // 쿠키가 존재 할 때 아래의 조건들을 검색 합니다.// if($chanl == main) { main($page,$connect,$select,$dbs,$tableput,$root); } //메인 화면 출력 부분 입니다.// if($chanl == create_db) { create_db1(); } //새로운 데이터 베이스 생성 때 입력하는 화면 입니다. 여기에 그냥 HTML 코드를 넣어 사용 하는 방법이 더 편할 수도 있습니다.// if($chanl == create_db2) { mysql_query("create database $dbname",$connect); // 새로운 데이터 베이스를 만듭니다. 그리고 아래 코드를 출력 합니다.// echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>db가 만들어 졌습니다.</b></font> <input type=hidden name=chanl value=main> <input type=submit value=확인> </form> </center> </body> </html> "); } if($chanl == e_field) { //새로운 테이블 필드를 생성,삭제하는 부분 입니다.필드 추가및 삭제 여기서 중요한건 마지막 필드는 존재 해야 테이블이 존재 한다.~! default '0' 에서 ' '의 표현은 하지 않아야 합니다.// mysql_select_db($dbs,$connect); mysql_query("alter table $tn $tct $tablequ" , $connect); // $tn(테이블 이름) $tct(add ,drop) $tablequ(필드 정보) 로 구성 되어 alter 쿼리를 수행 하는 부분 입니다.// echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>field를 수정 했습니다.</b></font> <input type=hidden name=chanl value=main> <input type=hidden name=dbs value=$dbs> <input type=hidden name=select value=field> <input type=hidden name=tableput value=$tn> <input type=submit value=확인> </form> </center> </body> </html> ");// 필드의 쿼리를 수행 하고 난후 확인 화면의 출력 입니다.// } if($chanl == dbdel) { // 해당 데이터 베이스를 삭제 하는 루틴 입니다. 이 쿼리는 입력 하자 마자 바로 삭제 되므로 그전에 한번 더 확인을 묻는 박스를 만들면 사용자들이 편할 것입니다.// mysql_query("drop database $dbs",$connect); //해당 데이터 베이스 삭제// echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>Db를 삭제 했습니다.</b></font> <input type=hidden name=chanl value=main> <input type=submit value=확인> </form> </center> </body> </html> "); } if($chanl == tabledel) { // 해당 테이블을 삭제 하는 부분 입니다.// mysql_select_db($dbs,$connect); mysql_query("drop table $tableput",$connect); //삭제 쿼리 입니다.// echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>Table를 삭제 했습니다.</b></font> <input type=hidden name=chanl value=main> <input type=hidden name=select value=tables> <input type=hidden name=dbs value=$dbs> <input type=submit value=확인> </form> </center> </body> </html> "); } if($chanl == title_view) { title_view($page,$connect,$s_db); } //경매 Admin의 메인 화면을 출력 하는 부분 입니다.// if($chanl == file_view) { file_view($page,$connect,$s_db); }// 자료실 게시판의 메인 화면을 출력 하는 부분 입니다.// if($chanl == create_title) { create_title(); } // 새로운 경매 게시판을 만드는 화면 입니다.// if($chanl == create_file) { create_file(); } //새로운 자료실 게시판을 만드는 부분 입니다.// if($chanl == create_table) { // 새로운 테이블을 만들기 위한 입력 화면 입니다.// echo(" <html> <title> creat_db html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <form method=post action=db_view.php> <input type=hidden name=chanl value=create_table2> <input type=hidden name=dbs value=$dbs> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>~Table Name</b></font></td> <td bgcolor=black width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=tablen size=10 ></font></td> </tr> <tr> <td bgcolor=#808080 width=74> <font style='font-size:13px;font-style:italic;color:#fffff0'> <b>query</b></font></td> <td bgcolor=black width=100> <font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=text name=shot size=40></font></td> <td bgcolor=black><font style='font-size:13px;font-style:italic;color:#fffff0'> <input type=submit value=만들기> </font></td> </tr> </table> </form> </center> </body> </html> "); } if($chanl == del_title) { mysql_select_db('libchal',$connect); mysql_query("drop table $s ",$connect); mysql_query("drop table $x ",$connect); mysql_select_db('adminp',$connect); //각각의 게시판(경매 , 자료실)에서 전달 받은 테이블 명을 이용해 게시판을 삭제 합니다. 이 부분은 경매와 자료실 모두 여기서 처리 합니다.// if(!$table) { $table = admin; $select = "<input type=hidden name=chanl value=title_view>"; } else { $select = "<input type=hidden name=chanl value=file_view>"; } mysql_query("delete from $table where mview='$s' ",$connect); // Adminp 데이터 베이스의 해당 게시판 테이블에서 각각의 게시판 정보를 지웁니다.// echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>게시판이 삭제 되었습니다.</b></font> $select <input type=submit value=확인> </form> </center> </body> </html> "); } if($chanl == create_table2) {// 전달 받은 인자로 새로운 테이블을 생성 합니다.// mysql_select_db($dbs,$connect); mysql_query("create table $tablen ($shot)",$connect); //해당 데이터 베이스에 새로운 테이블을 생성 하는 부분 입니다. 여기서 $shot는 테이블 필드 인자 입니다.// echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>Table이 만들어 졌습니다.</b></font> <input type=hidden name=chanl value=main> <input type=submit value=확인> </form> </center> </body> </html> "); } if($chanl == create_title2) { //전달 받은 인자로 새로운 경매 게시판을 만드는 부분 입니다.// $s=$ctitle."cry";//테이블 이름 인자를 하나 더 만듭니다.// $wdate=date('y-m-d'); mysql_select_db('adminp',$connect); $atitle = mysql_query("select mview from admin where mview='$ctitle'",$connect ); $atitler = mysql_fetch_array($atitle); // Adminp 데이터 베이스에 admin 테이블(경매 테이블)에서 같은 테이블 이름이 존재 하는지 검색 합니다.// if($ctitle == $atitler[mview]) { // 같은 이름의 테이블이 있을 경우 출력 입니다.// echo(" <script> window.alert('같은 table가 있습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } else {// 같은 이름의 테이블이 없을 경우 입니다.// mysql_query("insert into admin(title,view,sum,wdate,mview) values('$title','$s','$page','$wdate','$ctitle')",$connect); mysql_select_db('libchal',$connect); //admin(경매 Admin 테이블)에 새로운 경매 게시판의 정보를 입력 합니다.// mysql_query("create table $ctitle (no int(10) NOT NULL default '0' auto_increment,name varchar(10),email varchar(25),tel varchar(12), passw varchar(20),title varchar(54),content text,edate datetime, smoney int(10) unsigned,wdate date, sise int(10) not null default '0' ,hit int(10) not null default '0',PRIMARY KEY(no))",$connect); //첫 번째 새로운 경매 테이블을 생성 합니다.// mysql_query("create table $s (no int(10) NOT NULL default '0' auto_increment, name varchar(10),email varchar(25),tel varchar(12),bmoney int(10), tnum int(10),passw varchar(20),PRIMARY KEY(no))",$connect); //두 번째 새로운 경매 테이블을 생성 합니다. 여기서 $s(두번째 테이블명)은 앞에서 새로운 이름 생성에서 만들어진 이름 입니다.// echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>게시판이 만들어 졌습니다.</b></font> <input type=hidden name=chanl value=title_view> <input type=submit value=확인> </form> </center> </body> </html> "); } } if($chanl == create_title3) { //새로운 자료실 게시판을 생성 하는 부분 입니다.// $s=$ctitle."cry"; // 전달 받은 테이블 이름을 이용해 또 다른 테이블 이름을 생성 합니다. 이것은 두개의 테이블을 만들기 위함 입니다.// $wdate=date('y-m-d'); mysql_select_db('adminp',$connect); $atitle = mysql_query("select mview from file where mview='$ctitle'",$connect ); $atitler = mysql_fetch_array($atitle); //똑 같은 이름의 테이블이 존재하는지 검색 합니다.// if($ctitle == $atitler[mview]) { // 같은 이름의 테이블이 존재할 경우의 출력 입니다.// echo(" <script> window.alert('같은 table가 있습니다. 다시 입력해 주세요') history.go(-1) </script> "); exit; } else {// 같은 이름의 테이블이 없을 경우 입니다.// mysql_query("insert into file(title,view,sum,wdate,mview) values('$title','$s','$page','$wdate','$ctitle')",$connect); mysql_select_db('libchal',$connect); //file(자료실 게시판 admin 테이블)에 새로운 게시판의 정보를 저장 합니다.// mysql_query("create table $ctitle (no int(10) NOT NULL default '0' auto_increment, name varchar(10),email varchar(25),path varchar(50),passw varchar(20), title varchar(54),content text, wdate date,hit int(10) not null default '0',PRIMARY KEY(no))",$connect); //전달 받은 인자로 새로운 자료실 게시판 테이블을 생성 합니다. 처음 테이블// mysql_query("create table $s (name varchar(10),email varchar(25), tnum int(10),wdate date,content text)",$connect); //전달 받은 인자와 $s(새로 생성한 테이블 이름)을 이용해서 두 번째 테이블을 생성 합니다.// echo(" <html> <body> <center> <form method=post action=db_view.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>게시판이 만들어 졌습니다.</b></font> <input type=hidden name=chanl value=file_view> <input type=submit value=확인> </form> </center> </body> </html> "); } } }//이 파일 처음 부분의 쿠키 조건의 끝 입니다.// ?> 이렇게 해서 모든 설명을 했습니다. 이것을 바탕으로 새로운 스크립트를 꼭 한번 만들어 보길 권합니다. 아무리 잘되어 있는 여타 다른 소스를 보더라도 적용할 수 없다면 그것은 그림의 떡일 뿐입니다. 처음 접하는 분들일수록 꼭 한번 직접 만들어 봐야 됩니다. 한번 만들고 난 후 여러분들은 이렇게 말할 것입니다. 되는데…. 라고^^; 자 그럼 이렇게 만들어진 게시판들을 이용해서 Top 화면을 간단히 만들어 봤습니다. 아주 간단한 코드 입니다. 단지 링크뿐 입니다. Top 화면은 최신 뉴스 라든지 각각의 게시판에서 제일 조회수가 많은 글을 보여 준다든지 하는 여러 알림의 글들이 존재해야 합니다. 이것은 고정된 시각입니다. 여러 방법으로 여러분들이 Top화면을 만들어보기 바랍니다.

일단 위 화면은 참고로 하길 바라며 test.php파일로 작성 했습니다. 아래 화면과 비교 하면서 스크립트를 보기 바랍니다. 이것은 예에 불과하며 플래쉬나 다이나믹 코드를 사용해서 보다 깔끔한 Top화면을 만들어 보기 바랍니다. <?php include('db_func_all.php'); mysql_select_db('libchal',$connect); $wdate = date('H:i:s'); $ally = mysql_query("select no,title,hit from cry5 order by hit desc",$connect); $ally2 = mysql_query("select no,title,hit from cry12 order by hit desc",$connect ); $put = mysql_fetch_array($ally); $put2 = mysql_fetch_array($ally2); if($wdate < 7) { $title = " <img src=moon.gif border=0 align=left> 한참 잠잘 시간 이군요~! 우리모두 밤샘을~ 얍~~ cry는 잠자유~ "; } else { $title = " <img src=sam.gif border=0 align=left> 열심히 싸워요 다들~~ 뭐든지 싸워서 이겨여~~~ "; } echo(" <html> <title> main_view html </title> <body bgcolor=black> <center> <img src=skyt1.jpg border=0> <br> <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <tr> <th rowspan=5 bgcolor=black width=240><font style='font-size:12px;color:gray'> $title</font></th> <th bgcolor=black > <a href ='m.php?chanl=main_view&f=cry5&f2=cry5cry' > <font style='font-size:12px;text-decoration:none;color:blue'> <img src=icon.jpg border=0 align=center>cry~ file system ~</font></a></th> </tr> <tr> <td bgcolor=black align=center> <a href ='main_view.php?chanl=main_view&f=cry12&f2=cry12cry' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> <img src=icon.jpg border=0 align=center>cry~ 경매 system ~</font></a></td> </tr> <td bgcolor=black align=center> <a href ='shop.php' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:blue'> <img src=icon.jpg border=0 align=center>cry쇼핑몰 system ~</font></a></td> </tr> </table> "); echo(" <br> <table border=0 cellspacing=2 cellpadding=2 width=700 > <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:white'> <img src=icon.jpg border=0 align=center>Top 경매</font></td> <td bgcolor=black align=left width=500> <a href ='main_view.php?chanl=title&no=$put2[no]&f=cry12&f2=cry12cry' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put2[title]</strong></font></a></td> <tr> <td bgcolor=black align=center width=200> <font style='font-size:13px;font-style:italic;color:white'> <img src=icon.jpg border=0 align=center>Top 자료</font></td> <td bgcolor=black align=left width=500> <a href ='m.php?chanl=title&no=$put[no]&f=cry5&f2=cry5cry' > <font style='font-size:13px;text-decoration:none;font-style:italic;color:gray'> <strong>$put[title]</strong></font></a></td> </tr> </table> </center> </body> <html> "); ?> 이렇게 모든 설명을 했습니다. 여러분들에게 보다 좋은 소스에 다양한 방법을 보여 드리고 싶었지만 필자의 게으름 때문에 이정도의 수준에서 머물러야 했습니다. 하지만 여러분들은 충분이 이것을 바탕으로 이 보다 더 좋은 스크립트는 충분히 만들 수 있을 것입니다. 만약 C에 익숙하다면 더 복잡하고 성능 좋은 스크립트가 탄생 될 것입니다. 웹언어는 각각의 주어진 환경과 조건에 따라 무엇을 사용 해야 할지 선택 하면 될 것입니다 PHP든 ASP든 둘 중 하나의 스크립트에 정통 하길 바랍니다. 둘 다 습득하면 좋지만 하나를 먼저 알고 또 다른 하나에 접근하는 방법이 더 좋을 것 같습니다. 그럼 다들 스크립트에 매진 하시길 바라며 이만 줄이겠습니다.
17.5 역 경매 게시판 만들기
역 경매 게시판의 경우 제일 처음 소개한 경매 소스를 조금만 수정하면 됩니다. 여기서 역 경매란 경매를 올리는 사람이 특정 물건을 보다 적은 가격에 구매하는 것을 원하므로 보다 적은 금액을 입찰하는 사람이 낙찰되는 것입 니다. 그러니 기존의 경매의 스크립트 소스에서 입찰자의 순위를 금액이 작은 순으로 정렬 하면 되는 것입니다. 화면의 구성은 경매와 달리 조금 다르게 여러분이 바꾸어 주면 됩니다. 이 부분은 자세한 설명이 없더라도 여기 까지 읽으신 분은 충분히 이해 하리라 생각 합니다. 만약 모르신다면 경매 게시판의 입찰자 데이터 베이스 쿼리 부분을 참고 하세요.
17.6 간단한 chating 화면 만들기
해당 사이트에 접속을 한 사람들 끼리 대화명 없이 간단히 채팅을 주고 받을 수 있는 부분입니다. 이것은 보다 다양한 방법을 이용해서 대화방을 만들 수 있는 기초 입니다. 오직 php만을 이용한 방법이며, 서버의 부하가 있을 가능성이 있습니다. 즉, 채팅에 사용할 파일을 만든후 이 파일을 읽어 들여 다른 사용자가 자신이 이 파일에 입력한 파일을 확인 하는 방법입니다. 이것은 계속적으로 해당 파일을 읽어야 되므로 서버에 부하가 생길 수도 있습니다. 하지만 조금만 다르게 수정한다면 상당히 좋은 채팅방을 만들 수 있습니다. 그럼 지금까지 생성 했던 스크립트에 조금의 수정과 chat.php파일을 이용한 간단한 채팅모드를 설명 하겠 습니다. 우선 생성 되는 윈도우 두개를 보겠습니다.

위 그림. 17-14는 입력한 글을 확인 하는 창 입니다. 작은 윈도우 크기 이고, 모니터 구석에 두면서 글을 보면 됩니다. 물론 입력한 글은 위 윈도우에 뿌려지며 다른 접속자들도 같이 보여 집니다.

그림.17-15의 경우는 글을 입력 하는 창 입니다. 이 윈도우 역시 작으며 간단히 입력할 수 있습니다. 모니터의 구석에 두고 사이트를 돌아 다니면서 해당 사이트에 접속한 사람과 간단한 질문을 할 수 있습니다. -? 부분은 자신이 전에 입력 했던 글이 출력 되는 부분입니다. 그럼 이 간단한 채트 모드의 소스를 확인 하겠습니다. 아래 소스 부분을 m.php 파일에 추가 해서 사용 하면 됩니다. 필자의 경우 메인 화면에서 자료실을 클릭하면 채트 윈도우 두개가 뜨도록 구성했습니다. 이것은 여러분들이 원하는 방법으로 수정 해서 사용 하시면 됩니다. if($chanl == chat) { echo(" <html> <body> <center> <script> window.open('chat.php','send','height=100px width=325px') window.open('chat_view.php','send2','height=200px width=325px') </script> // 두개의 윈도우를 생성 합니다.// <form method=post action=m.php> <font style='font-size:13px;font-style:italic;color:#808080'> <b>자료실에서 간단히 대화를 할 수 있는 기능 입니다.</b></font> <input type=hidden name=chanl value=main_view> <input type=hidden name=f value=$f> <input type=hidden name=f2 value=$f2> <input type=submit value=확인> // 이 부분은 자료실로 링크 되는 부분 입니다.// </form> </center> </body> </html> "); } 여기서 물론 메인 화면(test.php)의 자료실 링크 부분은 아래와 같습니다. <a href ='m.php?chanl=chat&f=cry5&f2=cry5cry' > 그럼 채팅 모드의 루틴을 수행 하는 chat.php 파일을 살펴 보겠습니다. 그림. 17-15을 참고 하세요. <?php //filesystem function() //chat mod make(cry) date(00.4.17) ?> <?php echo(" <html> <head> <SCRIPT> function set_focus(){ document.chat.wdata.focus(); }</SCRIPT> // 위 부분은 글을 입력 하는 부분에 커서를 두기 위한 설정 입니다.// </head> <body bgcolor=black onload='set_focus()'> // onload 부분에 ‘set_focus()’ 부분을 추가 해야 합니다.// <font style='font-size:13px;font-style:italic;color:#fffff0'> "); if($s == send) { echo(" </font><br> "); $fp = fopen("/home/ftp/pub/cry.txt" , "w+"); // 위 패스에 해당 파일을 엽니다. 여기서 사용한 디렉토리는 ftp 디렉토리 입니다.// fwrite($fp , "$wdata"); // 입력 받은 글을 해당 파일에 저장 합니다.// fclose($fp); // 파일 포인트를 닫습니다.// $open = file("/home/ftp/pub/cry.txt"); //해당 파일의 내용을 배열로 저장 합니다.// } echo(" </font> <form method=post action=chat.php name=chat> <input type=hidden name=s value=send> <input name=wdata size=40><br> <br> <font style='font-size:13px;font-style:italic;color:#fffff0'> ? $open[0] // 파일의 내용을 화면에 출력 합니다.// </font> </form> </body> </html> "); ?> 다음은 chat_view.php 파일을 살펴 보겠습니다. 그림. 17-14를 참고 하세요. <?php //filesystem function() //chat mod make(cry) date(00.4.17) ?> <?php $open = file("/home/ftp/pub/cry.txt"); // 글이 입력 되어 있는 파일을 배열로 읽어 들입니다.// echo(" <html> <body bgcolor=black> <meta http-equiv=/"refresh/" content=/"3 url=http://chat_view.php/"> // 메타 테그를 이용해 해당 파일의 내용을 주기적으로 읽어 들입니다. 여기서는 3초마다 읽어 들이도록 했습니다.// <center> <img src=skyt1.jpg border=0> </center> <br> <font style='font-size:13px;font-style:italic;color:#fffff0'> "); echo(" $open[0]<br> // 화면에 입력되어진 글을 출력 합니다.// </font> </body> </html> "); ?> 여기까지 간단한 채팅 모드를 보여 드렸습니다. 이렇게 간단한 모드는 쉽게 만들 수 있습니다. 하지만 보다 크고 다양한 대화방을 만들 경우 서버의 부하 부분은 꼭 생각 해야 됩니다. 그럼 위 소스를 바탕으로 다양한 대화방을 직접 만들어 보길 바랍니다.
맺음말 시간은 정말 빨리 흘러 갑니다. 인생의 절반을 걸어온 지금 뭔가 해보고 싶었을 때 벌써 인생의 절반이 흘러 갔나 생각하면 정말 가슴이 터질듯 열 받습니다. 지금것 금전을 위해 이러구 저러구 아직도 그러지만.. 정말 금전 문제는 죽기 까지 걱정이 끊이질 않을 듯 합니다. 진정한 부자는 자기가 뭔가를 했을 때 라구 생각하지만 그건 배부른 사람들이 하는 소리 같습니다. 하루 하루 열심히 생활 하시는 우리 어머님과 여러분들의 부모님을 생각하면 이 모든게 뭘 위해 존재 하는지 다 뿌수고 싶습니다.
Apache, Mysql, PHP 입문하기이홍일 skycry@kldp.orgv, 2000년 01월부터 05월까지 sgml 변환: 고은정
GOWILL@chollian.net
2000년 9월 20일
저작권 : 이 글은 비상업적이며 저자와 출처를 명확히 할 경우 무단으로 복제,배포,수정 할 수 있습니다. (단, 상업적일 경우 저자의 허락이 있어야 합니다.)
주의. 지금부터 시작할 모든 내용은 저자의 나름대로 생각이며, 이로 인한 피해는 책임지지 않습니다. (단, 글의 의문점은 메일로 문의하기 바랍니다.) 들어가기 앞서 글의 내용은 처음 입문하는 초보자를 위주로 저가 처음 접했을 때부터 아무것도 모르는 상태에서 집필한 글이며.. 다소 무식 하고 무지막지한 방법도 있을 것이며 잘 알려진 방법도 있을 것입니다. 단지 이 글은 아무것도 모르는 이가 처음 입문을 할 경우 도움을 주기 위해 쓰여 졌습니다. 참고로…. 이 글은 linux에 입문한지 얼마 되지 안고, 웹프로그래밍에 관심이 있으며 공개된 모든 irc서버에서 고수를 찾아 돌아 다녔지만 통 대답을 듣지 못한 이, 또한 여타 잘 알려진 linux모임 게시판에 질문 했을 때 linux는 유어셀프니 머시기니라는 말만 들은 사람… 여타 초보자의 설움을 맨날 느끼는 이 그리고, 모출판사 실장님과 신촌 로타리에 위치한 한 서점 사장님, 마지막으로 아들 잘되는 날만 기다리시는 울 엄니에게 바칩니다. 1. 웹 서버와 전자상거래의 대략적인 설명PHP를 접하기에 앞서 이 장은 웹 서버의 역할과 요즘 한창 이슈가 되고 있는 전자상거래와 쇼핑 몰에 관해 간단히 알아 보겠습니다. 1.1 웹 서버의 역할월드와이드웹은 인터넷을 보다 더 쉽게 항해 하게끔 발전되어 영화나 책을 보듯이 여러분�"� 다가와 있습니다. 앞으로도 더 사용자 중심으로 발전할 것입니다. 우리가 이렇게 안방에서 웹 브라우저로 볼 수 있는 것도 웹 서버가 있어야지만 가능한 것입니다. 웹을 이용한 인터넷의 대중적인 확산이 커짐에 따라 웹 서버의 기능도 다양해져 갔습니다. 하지만 옛날의 웹 서버의 역할은 파일의 송수신, 텍스트의 링크, 게시판 정도 였습니다. 지금은 대화방에서부터 상품의 쇼핑, 오락, 전화, 경매에 이르기까지 그 사용 용도가 다양해졌습니다. 우리가 일상에서 하던 모든 일을 웹상에서 해결하는 상태가 된 것입니다. 이 중에도 웹상에서 쇼핑을 하고 선택한 물건을 주문하는 쇼핑 몰 사이트는 요즘 들어 한창 부각 중입니다. 안방에서 책과 음악 앨범, 옷 등 원하는 것들을 구입할 수 있고 게다가 전자 결재도 가능해진 것입니다. 이렇듯 웹 서버의 역할이 점점 더 커지기 때문에 서버의 운영자들은 보다 강력하고 안정적인 웹 서버를 선택하게 됩니다. 웹 서버의 역할을 간략히 그림으로 확인하면 다음과 같습니다.
![]() |
The Tree of Learning bears the noblest fruit, but noble fruit tastes bad. |