66
지금까지 본 프로그래밍 책 중에서 최고다. 용이 풍부하고 예제도 따라하기 쉽게 구성되어 있다. 지금까지의 컴퓨터 관련 서적 중에서 가 장 좋은 예제를 포함하고 있다. 정말 따라하기 쉽다! - 닉 랜드먼 웰링과 톰슨이 집필한 Sams 출판사의 이 책 을 결코 놓쳐서는 안된다. 명료하고 직관적인 내용은 시간을 허비하지 않도록 해준다. 책의 구성역시 정말 잘 짜여져 있다. 각 장의 길이 는 적당하고 제목만으로도 필요한 내용을 쉽게 찾을 수 있다. - 라이트 설리반 , A&E 엔지니어링 대표 이 책은 정말 굉장하다! 논리적인 구성과 적당 한 수준(중급) 덕분에 아주 재미있고, 이해하 기 쉬우며, 유익한 정보로 가득 차 있다. - CodE-E, 호주 PHP에 대한 좋은 입문서는 많이 있다. 그러나 신뢰할 수 있는 복잡한 시스템을 구축하려는 사 람들에게 이 책은 정말 탁월한 선택이다. 실용 적인응용 프로그램 개발에 탄탄한 배경 지식을 가지고 있는 저자들이 혼동하기 쉬운 내용들을 명쾌하게 풀어낸다. 단순히 언어만을 가르치는 것이 아니라, 어떻게 적용해야 좋은 소프트웨어 를 만들 수 있는지 알려준다. - 사비에르 가르시아 , Telefonica R&D 연구소 선임 연구원 , 마드리드 나는 이틀 전에 이 책을 집어 들고 대략 반쯤 읽었는데, 도저히 책을 손에서 뗄 수가 없다. 구성과 흐름이 완벽하고 모든 것이 필요한 그 자리에 있어 독자 입맛에 딱 맞다. 필요한 개념 을 쉽게 이해할 수 있으며, 예제도 아주 훌륭하 . 독서삼매경에서 잠깐 짬을 내어 여러분에게 이 책을 소개한다. - 제이슨 B. 랜캐스터 이 책은 믿을 수 있는 친구이다. 웹 응용 프로그 램 개발을 위한 PHPMySQL 의 훌륭한 입문 서이자 매뉴얼이다. 실제로 적용할 수 있는 다양 한 예제를 다룬다. PHP로 모듈화되고 확장이 쉬운 소프트웨어를 어떻게 구현할 수 있는지 자 세한 예제를 통해 배울 수 있다. 초보자든 전문 가든 상관없이 책상 위에 놓아둘가치가 있다. 여러분에게 좋은 경험이 될 것임을 확신한다. - WebDynamic 진정한 PHP/ MySQL 바이블이다. 이제 프로 그래밍과 데이터베이스가 일반인에게도 가까이 다가왔음을 실감나게 해주었다. 여기에 나오는 내용의 만분의 1도 잘 모르지만, 나는 이미 이 책에 사로잡혀 버렸다. - 팀 루오마 , TnTLuoma.com 실제 프로젝트를 진행하면서 막혔던 부분을 해 결하고 싶은 사람들에게 웰링과 톰슨의 이 책은 좋은 나침반이 될 것이다. 이 책에서는 웹 메일, 장바구니, 세션 관리, 웹 포럼, 웹 로그 같은 이 슈를 다룬다. 물론 PHP의 기초와 MySQL 용법 같은 기초적인 내용도 빠뜨리지 않는다. - twilight30, Slashdot 에서 이 책은 정말 탁월하다. 루크와 로라는 내가 지 나쳤던 정규 표현식, 클래스, 객체, 세션과 같은 부분에 대한 깊이 있는 설명을 해주었다. 확실히 이해하지 못해서 생겼던 생각의 골을 잘 채워 주 었다. 개념을 설명한 다음에는 PHP에서 주로 사용하는 함수와 주요 특징에 대한 설명을 하고, 실제 프로젝트 적용에 대한 언급과 MySQL , 보안 이슈를 프로젝트 관리자의 입장에서 설 명한다. 나는곧 이 책이 아주 작은 부분에까지 치밀한 구성과 이해하기 쉬운 설명으로 가득 차 있다는 사실을 깨닫게 되었다. - codewalkers.com의 게시물 P HP and MySQL We b De v e l o pme n t

PHP a nd MySQL We b De ve l opme nt - ::: 정보문화사 :: IT 도서의 … · 2009-12-02 · D- ROM에포함된내용 이책에포함된CD-ROM에는PHP, MySQL, Apache 전체버전과다양한그래픽라이브러

  • Upload
    voxuyen

  • View
    212

  • Download
    0

Embed Size (px)

Citation preview

지금까지 본 프로그래밍 책 중에서 최고다. 내

용이 풍부하고 예제도 따라하기 쉽게 구성되어

있다. 지금까지의 컴퓨터 관련 서적 중에서 가

장 좋은 예제를 포함하고 있다. 정말 따라하기

쉽다!

- 닉 랜드먼

웰링과 톰슨이 집필한 S a m s 출판사의 이 책

을 결코 놓쳐서는 안 된다. 명료하고 직관적인

내용은 시간을 허비하지 않도록 해준다. 책의

구성 역시 정말 잘 짜여져 있다. 각 장의 길이

는 적당하고 제목만으로도 필요한 내용을 쉽게

찾을 수 있다.

- 라이트 설리반 , A & E 엔지니어링 대표

이 책은 정말 굉장하다! 논리적인 구성과 적당

한 수준(중급) 덕분에 아주 재미있고, 이해하

기 쉬우며, 유익한 정보로 가득 차 있다.

- Cod E- E, 호주

PHP에 대한 좋은 입문서는 많이 있다. 그러나

신뢰할 수 있는 복잡한 시스템을 구축하려는 사

람들에게 이 책은 정말 탁월한 선택이다. 실용

적인 응용 프로그램 개발에 탄탄한 배경 지식을

가지고 있는 저자들이 혼동하기 쉬운 내용들을

명쾌하게 풀어낸다. 단순히 언어만을 가르치는

것이 아니라, 어떻게 적용해야 좋은 소프트웨어

를 만들 수 있는지 알려준다.

- 사비에르 가르시아 , Te le fo nica R& D 연구소

선임 연구원 , 마드리드

나는 이틀 전에 이 책을 집어 들고 대략 반쯤

읽었는데, 도저히 책을 손에서 뗄 수가 없다.구성과 흐름이 완벽하고 모든 것이 필요한 그

자리에 있어 독자 입맛에 딱 맞다. 필요한 개념

을 쉽게 이해할 수 있으며, 예제도 아주 훌륭하

다. 독서삼매경에서 잠깐 짬을 내어 여러분에게

이 책을 소개한다.

- 제이슨 B. 랜캐스터

이 책은 믿을 수 있는 친구이다. 웹 응용 프로그

램 개발을 위한 PHP와 MySQL의 훌륭한 입문

서이자 매뉴얼이다. 실제로 적용할 수있는 다양

한 예제를 다룬다. PHP로 모듈화되고 확장이

쉬운 소프트웨어를 어떻게 구현할 수 있는지 자

세한 예제를 통해 배울 수 있다. 초보자든 전문

가든 상관없이 책상 위에 놓아둘 가치가 있다.여러분에게 좋은 경험이 될 것임을 확신한다.

- We b Dyna mic

진정한 PHP/ MyS QL 바이블이다. 이제 프로

그래밍과 데이터베이스가 일반인에게도 가까이

다가왔음을 실감나게 해주었다. 여기에 나오는

내용의 만분의 1도 잘 모르지만, 나는 이미 이

책에 사로잡혀 버렸다.

- 팀 루오마 , T nTLuo ma .c o m

실제 프로젝트를 진행하면서 막혔던 부분을 해

결하고 싶은 사람들에게 웰링과 톰슨의 이 책은

좋은 나침반이 될 것이다. 이 책에서는 웹 메일,

장바구니, 세션 관리, 웹 포럼, 웹 로그 같은 이

슈를 다룬다. 물론 PHP의 기초와 MySQL 사

용법 같은 기초적인 내용도 빠뜨리지 않는다.

- twilig ht3 0 , S la s hdot에서

이 책은 정말 탁월하다. 루크와 로라는 내가 지

나쳤던 정규 표현식, 클래스, 객체, 세션과 같은

부분에 대한깊이있는 설명을 해주었다. 확실히

이해하지 못해서 생겼던 생각의골을잘 채워 주

었다. 개념을 설명한 다음에는 PHP에서 주로

사용하는 함수와 주요 특징에 대한설명을하고,실제 프로젝트 적용에 대한 언급과 MySQL 통

합, 보안 이슈를 프로젝트 관리자의 입장에서설

명한다. 나는 곧 이 책이 아주 작은 부분에까지

치밀한 구성과 이해하기 쉬운 설명으로 가득 차

있다는 사실을 깨닫게 되었다.

- c ode wa lke rs .c o m의 게시물

P HP a n d My S QL We b De v e l o p me n t

PHP와 MyS QL을 사용하는 프로그래머를 위

한 최고의 참고서. 강력 추천!

- The Inte rne t W rit ing J o urna l

굉장하다! 나는 이미 C/ C + + 프로그래밍에

대한 경험이 풍부하기 때문에 PHP의 문법에

대한 자세한 설명이 필요하지 않다. 둘은 아주

비슷하기 때문이다. 하지만 데이터베이스에 대

해서는 문외한에 가깝다. 그래서 처음 서평 관

리 엔진를 구현할 때 O ' Re illy에서 나온

m S QL a nd My S QL을 참고했는데, 아주 훌

륭한 S QL 지침서이긴 하지만 실제 구현에는

큰 도움이 되지 못했다. 그러나 이 책은 정말

많은 도움이 되었다. 강력하게 추천한다.

- 폴 로비콕스

지금까지 읽어본 최고의 프로그래밍 가이드 중

하나!

- ja c kofs o me t ra de s , 핀란드 라티

이 책은 오픈 소스 웹 개발 기술의 쌍두마차인

PHP와 MyS QL을 사용해서 인터넷 소프트웨

어를 구현하는 방법을 배우고 싶은 사람들을 위

해 아주 잘 쓴 책이다. 특히 프로젝트가 이 책

에서 가장 빛나는 부분이다. 논리적으로 설계되

어 있고 컴포넌트 기반으로 잘 구성되어 있을

뿐만 아니라, 예제로 선택한 주제들은 많은 웹

사이트에서 공통적으로 사용해야 하는 컴포넌

트들을 훌륭하게 대표하고 있다.

-크래그 세실

이 책은 PHP를 전혀 모르는 프로그래머들도

쉽게 따라할 수 있도록 예제와 함께 차근차근 설

명한다. 어느정도자신감이생긴지금도웹디자

인을하다보면이책을찾아보게된다. 아직도나

는 PHP에 대한 새로운 사실들을 발견한다. 이

책은 언제 어디서나 도움이 되는 탄탄한 기초를

제공한다.

- 스테판 워드

이 책은 나를 정말 감동시키고 사랑하게 만든

몇 안 되는 책 중 하나이다. 나는 도저히 이 책

을 책장에 꽂아둘 수 없다. 항상 손이 닿을 만

한 위치에 두고 필요할 때마다 펼쳐든다. 구성

도 좋고 설명은 간결하고 이해하기 쉬우며 예제

는 명료해서 쉽게 따라할 수 있다. 나는 이 책

을 읽기 전까지 PHP와 MyS QL에 대해 전혀

몰랐다. 그러나 이 책을 읽고 나서 어떤 복잡한

웹 응용 프로그램이라고 해도 만들 수 있다는

자신감과 그에 상응하는 기술을 익히게 되었다.

- 파워 웡

오 마이 갓. . . 데이터베이스 기반 웹 프로그래

밍을 깊이 이해하고 싶은 사람에게 강력하게 추

천한다. 더 많은 책들이 이렇게 나와야 한다.

- 션 C 스커텔

PHP a n d My SQL We b De v e l o p me n t

서문

저자 소개

로라 톰슨(Laura Thomson)은 호주 멜버른의 RMIT 대학에서 컴퓨터 과학과 정보 기술을 가

르치고 있으며, 최근에 수상 경력이 있는 웹 개발 회사인 Tangled Web Design에서 일하고

있다. 과거에는 Telstra와 보스턴 컨설팅 그룹에서 근무한 적이 있다. 응용과학(컴퓨터 과학)

과 공학(컴퓨터 시스템 공학)에 대한 학사 학위를 가지고 있으며, 현재는 적응성 있는 웹

사이트를 주제로 박사 학위를 준비중이다. 여가 시간에는 주로 잠을 즐긴다. 로라에게 연락

을 하고 싶으면 [email protected]로 이메일을 보내면 된다.

루크 웰링(Luke Welling)은 로라와 함께 RMIT 대학에서 컴퓨터 과학과 정보 기술을 강의하

고 Tangled Web Design에 재직하고 있다. 응용과학(컴퓨터 과학)에 대한 학사 학위를 가지

고 있으며, 지금은 석사 과정에서 커뮤니케이션 네트워크 설계에 유전 알고리즘을 적용하는

연구를 하고 있다. 그는 시간이 남으면 불면증에서 벗어나기 위해 여러 가지 시도를 한다.

루크의 이메일 주소는 [email protected]이다.

기고자 소개

이스라엘 데니스 주니어(Israel Denis, Jr.)는 전자상거래 프로젝트를 주로 다루는 프리랜서 컨

설턴트로 전세계를 무대로 활동하고 있다. 전문 분야는 SAP이나 Lawson 같은 ERP 패키지

를 웹 사이트에 통합하는 작업이다. 소프트웨어를 설계하거나 책을 쓰는 데 주로 바쁜 시간

을 보내고, 여유가 있을 때면 이탈리아를 여행한다. 그는 그곳을 고향처럼 여긴다. 이스라엘

은 1998년에 아틀랜타의 조지아 공대에서 전자공학 석사 학위를 받았다. 리눅스, Apache,

PHP와 MySQL에 대한 수많은 글을 기고했으며, 지금까지 GE와 Procter & Gamble 같은 회

사에서 주로 유닉스 기반 시스템에 대한 프로젝트를 진행해왔다. 이스라엘의 연락처는

[email protected]이다.

크리스 뉴먼(Chris Newman)은 다이내믹한 인터넷 응용 프로그램 개발의 전문가이다. 그는

PHP와 MySQL을 사용하는 응용프로그램 개발에 대한 광범위한 경력의 소유자이기도하다.

성 공 적 인 웹 프 로 그 래 밍 - PHP와 MySQL

영국의 Keele 대학을 졸업했으며 Stoke-on-Trent에 살고 있다. 이곳에서 1999년에 세운

Lightwood Consultancy Ltd.라는 회사를 경영하고 있다. 크리스는 대학을 다니는 동안 인터

넷의 잠재력에 매혹되었고, 새로운 세상을 여는 기술에 승부를 걸기 위해 회사를 세웠다.

이 회사에 대한 자세한 정보는 http://www.lightwood.net에서 볼 수 있다. 크리스의 이메일

주소는 [email protected]이다.

감사의 말

Sams 출판사 직원 모두의 노고에 감사드린다. 특히 셀리 존스턴에게 감사한다는 말을 전하

고 싶다. 그녀의 헌신과 인내가 없었다면 이 책은 세상에 나오지 못했을 것이다. 그리고 많

은 도움을 준 이스라엘 데니스 주니어와 크리스 뉴먼에게도 고마운 마음을 전한다.

우리는 PHP와 MySQL 개발 공동체의 작업에 이루 말할 수 없는 고마움을 느낀다. 그들의

노력으로 우리의 삶은 훨씬 더 편안해졌으며, 앞으로도 더욱 그럴 것이다.

eSec에 있는 아드리안 클로즈에게 감사드린다. 그는 1998년에 그것은 PHP로 만들 수 있

어. 라며 우리가 곧 PHP를 좋아하게 될 것이라고 예언했다. 결과적으로 그의 말이 옳았다.

마지막으로 비사교적인 우리들에게 힘을 북돋아준 가족과 친구들에게 감사의 마음을 전한

다. 줄리, 로버트, 마틴, 레슬리, 아담, 폴, 제임스, 아처와 바톤에게 감사한다.

여러분의 연락을 기다립니다!

이 책을 읽으신 여러분은 우리에게 가장 중요한 비평가이자 조언자입니다. 우리는 여러분의

의견을 통해 어떤 점을 잘했고, 어떤 점을 개선해야 하며, 여러분이 진정으로 원하는 것이

무엇이고, 우리에게 전해주고자 하는 지혜로운 충고가 어떤 것인지 알고자 합니다.

이메일이나 편지에 이 책의 좋았던 점과 부족한 점을 적어서 보내주세요. 더 좋은 책을 만들

수 있는 조언도 환영합니다.

하지만 한 가지 부탁드릴 것이 있습니다. 이 책과 관련된 기술적인 문제를 어떻게 해결할

수 있는지 물어보거나 엄청나게 큰 용량의 메일을 보내면 도와드릴 수가 없습니다. 일일이

모든 메시지에 응답을 해드릴 수 없는 점에 대해서도 미리 죄송하다는 말씀을 드립니다.

5서 문

우리에게 연락을 할 때에는 보내는 분의 이름과 전화번호나 이메일 주소와 함께 이 책의

제목과 저자를 꼭 적어주세요. 여러분의 평가를 주의 깊게 살펴보고 이 책의 공동 저자와

편집자와 함께 필요한 내용을 논의하도록 하겠습니다.

▶ 이메일 : o p e n s o u rc e @s a m s p u b lis h in g .co m

▶ 주 소 : Ma rk Ta b e r

As s o c ia t e P u b lis h e r

S a m s P u b lis h in g

2 0 1 W e s t 10 3 rd S t re e t

In d ia n a p o lis , IN 4 6 2 9 0 US A

독자 서비스

이 책에 대한 자세한 정보와 Sams 출판사에서 나온 다른 책들에 대한 정보를 얻고 싶다면,

웹 사이트 www.samspublishing.com을 방문하기 바랍니다. 검색 입력창에서 - 을 빼고

ISBN을 입력하거나 제목을 입력하면 원하는 책을 찾을 수 있습니다.

이 책의 정오표(Errata)나 새로 갱신된 소스 코드를 받고 싶다면 www.lukelaura.com이나

www.infopub.co.kr에서 찾아보기 바랍니다.

D- ROM에 포함된 내용

이 책에 포함된 CD-ROM에는 PHP, MySQL, Apache 전체 버전과 다양한 그래픽 라이브러

리, 이 책의 예제 코드 그리고 원서 PDF 파일이 들어 있다.

윈도우즈

부록 A에서는 윈도우즈 플랫폼에 Apache, MySQL, PHP를 설치하는 방법을 설명한다. 이

제품들의 윈도우즈 버전이 CD-ROM에 포함되어 있다.

Apache 1.3.27 버전이 Software\Apache\Windows\Binary 디렉토리에 있다. 여기에 있는

apache_1.3.27-win32-x86-no_src를 더블 클릭하면 Apache 설치 프로그램이 실행된다.

MySQL 3.23.54 버전은 Software\MySQL\Windows\Binary 디렉토리에 있다. SETUP.EXE를

더블 클릭하면 MySQL 설치 프로그램이 실행된다.

PHP 4.3.0이 Software\PHP\Windows\Binary에 있다. 설치 프로그램(php-4.3.0-installer.exe)을

바로 실행하면 MySQL을 사용할 수 있는 PHP 스크립터를 설치할 수 있다. 그러나 이렇게

설치하면 일부 옵션과 확장 모듈을 사용할 수 없다. 패키지 전체를 설치하고 싶다면

php-4.3.0-Win32.zip의 압축을 푼 다음, Readme 파일의 내용에 따라 설치하면 된다.

그래픽 라이브러리와 PDF 라이브러리(PDFlib)는 Libraries 디렉토리에 있으므로 필요한 라

이브러리를 골라서 설치한다. WinZip이나 알집 같은 프로그램을 사용해서 압축을 풀고 그

안의 내용을 참조한다.

리눅스/유닉스

대부분의 리눅스 배포판과 유닉스 워크스테이션에는 Apache, MySQL, PHP가 이미 설치되

어 있다. 그렇지만 여러분이 이것들을 직접 설치해야 하는 경우에는 부록 A의 설치 가이드

7CD-ROM에 포 함 된 내 용

를 따라 하면 된다. CD-ROM 안에는 Apache, MySQL, PHP의 소스 코드와 MySQL의 바이

너리 설치 버전이 들어 있다.

Apache 1.3.27의 소스 코드는 Software/Apache/Unix/Source 디렉토리에 있다. GNU tar가 설

치되어 있다면 httpd-1.3.27.tar.gz를 사용하고, 그렇지 않다면 httpd-1.3.27.tar.Z를 사용한다.

리눅스용 MySQL 3.23.54a의 바이너리 설치 버전은 Software/MySQL/Unix/Binary 디렉토리

에 있다. 사용중인 리눅스 배포판이 레드햇 계열이라면 RPM 패키지 관리자를 사용해서

MySQL-3.23.54a-1.i386.rpm과 MySQL-client-3.23.54a-1.i386.rpm을 설치한다. 두 패키지는 각각

MySQL의 서버와 클라이언트이다. RPM을 사용할 수 없다면 mysql-3.23.54a-pc-linux-i686.tar.gz

파일의 압축을 풀어서 바이너리를 직접 설치할 수도 있다.

유닉스용 MySQL 3.23.54a의 소스 코드는 Software/MySQL/Unix/Source에 있는 mysql-3.23.54a.

tar.gz이다. Solaris에서 설치하기 위해서는 GNU tar를 다운로드받아 설치해야 한다. 왜냐하면

Solaris용 tar 프로그램에서 버그가 발견되었기 때문이다.

PHP 4.3.0의 소스 코드는 Software/PHP/Unix/Source/php-4.3.0.tar.gz이다.

그래픽 라이브러리와 PDF 라이브러리(PDFlib)는 Libraries 디렉토리에 있다.

CD- ROM을 개봉하기 전에

여러분이 CD-ROM의 포장을 개봉할 때, 다음과 같은 사항에 동의한다고 가정한다.

CD-ROM 전체를 복사하거나 재배포할 수 없다. 단, 소프트웨어 각각을 복사하거나 재배포

하는 것은 소프트웨어 저작권자의 정책에 따른다.

이 책의 예제 코드에 대한 저작권은 출판사와 저자에게 있다. 각각의 프로그램과 아이템의

저작권은 해당 프로그램의 개발자 또는 다른 저작권자에게 있다. 일부 프로그램은 오픈 소

스 라이센스에 따른다. 오픈 소스 라이센스는 재배포를 허용한다. 라이센스 정보를 보면 좀

더 자세한 내용을 알 수 있다.

CD-ROM에 포함된 프로그램 중 일부는 개발자가 임의로 지정한 라이센스 정책을 따르고

있다. 여기에 담긴 소프트웨어에 대해 어떠한 형태의 보증도 하지 않는다. 특정한 목적을

위해 사용했을 때 제대로 동작한다고 보증할 수 없다. 실제로 사용했을 때 발생할 수 있는

기술적인 위험에 대해 출판사와 판매자, 배포자는 책임지지 않는다.

이 책을 들어가며

성공적인 웹 프로그래밍 - P HP와 MySQ L 의 세계에 오신 것을 진심으로 환영합니다. 이

책에서 우리는 가장 인기 있는 웹 개발 도구인 PHP와 MySQL에 대한 농축된 지식을 전해

드리려고 합니다.

본격적인 내용에 들어가기에 앞서, 다음의 주제를 잠시 다루고 넘어가겠습니다.

이 책을 읽어야 하는 이유

이 책을 통해 얻을 수 있는 것들

PHP와 MySQL이란 무엇이고, 왜 좋은가?

PHP 4의 최신 기능

이 책의 구성

자, 이제 시작해봅시다.

이 책을 읽어야 하는 이유

여러분은 이 책을 통해 간단한 주문 폼부터 복잡한 전자상거래 사이트에 이르기까지 인터랙

티브한 웹 사이트의 모든 것을 배울 수 있습니다. 아울러, 오픈 소스 기술을 사용해서 이

모든 것을 해낼 수 있는 방법도 배우게 됩니다.

이 책에서는 여러분이 최소한 기본적인 HTML은 다루어 보았고, 최신 프로그래밍 언어 중

하나를 사용해봤을 것이라고 가정합니다. 하지만 인터넷 프로그래밍이나 관계형 데이터베

이스에 대한 지식이 꼭 필요하지는 않습니다. 설사 프로그래밍 초심자라고 해도 이 책은 여

전히 유용합니다. 그러나 내용을 이해하는 데 조금 더 많은 시간이 걸리긴 할 것입니다. 필

자는 기본 개념을 빠뜨리지 않으려고 노력했습니다만 빨리 넘어갈 수 있도록 간단하게 다루

었습니다. 아마도 이 책을 읽는 사람들은 규모가 크거나 상업적인 목적으로 사용하는 웹 사

3 1이 책 을 들 어 가 며

이트를 구축하기 위해 PHP와 MySQL를 마스터하려는 분들일 것입니다. 이미 다른 웹 개발

언어로 일을 해본 경험이 있다면 이 책을 아주 쉽게 이해할 수 있을 것입니다.

이 책을 집필하게 된 동기는 이제 PHP 함수 레퍼런스로만 이루어진 관련 서적을 뒤지는

데 지쳤기 때문입니다. 물론 레퍼런스도 필요하지만, 어느 날 여러분의 상사나 고객이 여보

게, 사이트에 장바구니 기능을 추가해주게. 라고 했을 때 그런 종류의 책, 즉 레퍼런스 도서

는 별 도움이 되지 않습니다. 그래서 이 책은 현실적인 예제를 다루는 데 중점을 두었습니

다. 이 책의 예제 코드들은 여러분의 웹 사이트에 즉시 적용할 수 있고, 또한 조금만 수정하

면 쓸 수 있어 아주 실용적입니다.

이 책을 통해 얻을 수 있는 것들

이 책을 통해 실용적이고 다이내믹한 웹 사이트를 만들 수 있습니다. 예전에 HTML만을 사

용해서 웹 사이트를 만들어본 경험이 있는 분이라면, 이런 접근 방식의 한계를 잘 알고 있을

것입니다. 순수하게 HTML만을 사용한 정적인 컨텐츠는 말 그대로 고정적입니다. 직접 웹

페이지를 수정하지 않는 한 아무런 변화를 줄 수 없습니다. 사이트를 방문하는 사람들은 일

방적으로 읽기만 할 수 있을 뿐 자신의 견해나 소감을 전달할 수 있는 방법이 없습니다.

하지만 PHP와 MySQL 같은 웹 개발 언어와 데이터베이스를 사용하면 웹 사이트를 다이내

믹하게 바꿀 수 있습니다. 쉽게 변경할 수 있고 실시간 정보를 포함시킬 수도 있습니다.

이 책에서는 의도적으로 현실적인 예제만 사용하는 데 치중했습니다. 이 책의 첫 번째 예제

는 간단한 온라인 주문 시스템입니다. PHP와 MySQL의 다양한 기능을 소개하는 부분에서

비슷한 종류의 실용적인 예제를 사용합니다.

이어서 상업적인 웹 사이트를 구축할 때 중요한 이슈인 전자상거래와 보안에 대해 살펴봅니

다. 물론 이런 기능을 PHP와 MySQL을 사용해서 어떻게 구현할 수 있는지에 대해 자세히

다룹니다.

이 책의 마지막 부분에서는 실제 프로젝트에 어떻게 접근해야 하는지 다루게 됩니다. 다음

의 8가지 프로젝트를 설계하고, 계획하며, 구현하는 과정을 살펴보게 될 것입니다.

사용자 인증과 개인화

장바구니

컨텐츠 관리 시스템

2성 공 적 인 웹 프 로 그 래 밍 - PHP와 MySQL

웹 메일

메일링 리스트 관리자

웹 포럼

문서 만들기

XML을 사용한 웹 서비스 접속

위의 예제들을 조금만 수정하면 여러분의 프로젝트에 즉시 사용할 수 있을 것입니다. 필자

가 위의 주제를 정할 때 대부분의 웹 기반 응용 프로그램에서 공통적으로 다루는 핵심적인

기능이 무엇인가를 기준으로 삼았습니다. 지금 당장 필요한 내용이 없다고 하더라도 이 책

에서 사용하는 접근 방식을 기억하고 있으면 여러분의 목적을 이루는 데 큰 도움이 될 것입

니다.

PHP란?

PHP는 웹에서 사용하기 위해 특별히 설계된 서버 스크립트 언어입니다. HTML 페이지 안

에 포함된 PHP 코드는 누군가가 페이지를 방문할 때마다 실행됩니다. 웹 서버는 PHP 코드

를 해석해서 HTML을 생성하거나 다른 형식의 출력을 만들어냅니다.

PHP는 라스머스 러도프(Rasmus Lerdorf)라는 사람이 혼자 고안해 낸 것으로 1994년에 처음

세상에 모습을 드러냈습니다. 이후로 재능 있는 많은 사람들이 사용하면서 여러 번의 수정

을 거쳐 핵심적인 세 사람의 개발자에 의해 오늘날 우리들이 볼 수 있는 형태를 갖추게 되었

습니다. 2002년 10월 현재 900만이 넘는 도메인에서 PHP를 사용하고 있습니다. 이 사용자

수치는 날마다 빠른 속도로 증가하고 있습니다( 2003년 9월 현재 1,300만).

http://www.php.net/usage.php를 방문하면 현재 PHP를 사용하고 있는 도메인의 개수를 확인

할 수 있습니다.

PHP 개발은 오픈 소스 프로젝트입니다. 여러분은 소스 코드를 보고 수정한 다음 재배포할

수 있습니다. 물론 무료입니다.

PHP는 원래 Personal Home Page 의 약자였습니다. 그러나 최근 들어 GNU(GNU = GNU

is Not Unix)와 같이 순환적인 구조의 새로운 이름을 가지게 되었습니다. PHP는 이제 PHP

Hyp ertext Preprocessor 를 의미합니다.

3 3이 책 을 들 어 가 며

PHP의 현재 정식 버전은 4.x대입니다( 2003년 9월 현재, 5.0 베타 버전이 나왔습니

다). 최신 버전에서 개선된 기능에 대해서는 아래에서 자세히 다루겠습니다.

PHP의 공식 사이트 주소는 http://www.php.net입니다.

Zend는 PHP 4의 개발자가 세운 회사로 홈페이지는 http://www.zend.com입니다.

PHP 4.3 버전의 새로운 기능

예전에 PHP를 사용해본 사람이라면, 4.3 버전에서 개선된 기능이 얼마나 유용한지 알 수

있을 것입니다.

대부분의 I/O 함수는 공통된 스트림 접근 방식을 사용합니다. 즉, 파일을 여는 작

업을 HTTP, HTTPS, FTP 접속처럼 쉽게 해결할 수 있습니다.

편리한 설치 프로그램인 PEAR가 베타 딱지를 떼었습니다.

GD 라이브러리가 기본적으로 포함되었습니다.

Apache 버전 2 지원이 아직 실험 단계이긴 하지만 점차 개선되고 있습니다.

커맨드라인 스크립트와 함께 사용할 수 있는 실행파일들이 PHP를 설치할 때 기

본적으로 만들어집니다.

MySQL이란?

MySQL(마이-에스-큐-엘이라고 읽습니다)은 매우 빠르고 견고한 관계형 데이터베이스 관리

시스템(RDBMS)입니다. 데이터베이스는 여러분이 효율적으로 데이터를 저장하고, 검색하고,

정렬하며, 탐색할 수 있도록 도와줍니다. MySQL 서버는 많은 사람들이 동시에 동일한 데이

터를 접근할 수 있도록 관리하는 것으로 빠른 접근 방법을 지원하고 허용된 사용자만이 접

근 권한을 얻을 수 있도록 합니다. 그런 의미에서 MySQL은 다중 사용자, 다중 쓰레드 지원

서버입니다. MySQL은 표준 데이터베이스 질의 언어인 SQL(Structured Query Language)을 사

용합니다. MySQL이 세상에 알려진 것은 1996년부터입니다. 그러나 이것의 개발 역사는

1979년까지 거슬러 올라갑니다. MySQL은 세계적인 리눅스 잡지인 Linux Journal에서 선정

한 독자들의 선정상(Reader 's Choice Award) 을 수상하였습니다.

MySQL은 오픈 소스 라이센스를 따릅니다. 그러나 상업적으로 사용하고자 하는 경우에는

별도의 상업용 라이센스를 사용해야 합니다.

3 4성 공 적 인 웹 프 로 그 래 밍 - PHP와 MySQL

왜 PHP와 MySQL을 사용하는가?

전자상거래 사이트를 구축한다고 생각해봅시다. 여러 가지 제품들을 사용해야 하는데, 간단

하게 정리해보면 다음과 같습니다.

웹 서버로 사용하기 위한 하드웨어

운영체제

웹 서버 소프트웨어

데이터베이스 관리 시스템

프로그래밍 언어나 스크립트 언어

위의 제품들은 상호 의존성을 가지고 연결되어 있습니다. 예를 들어, 어떤 운영체제는 특정

하드웨어에서만 동작합니다. 그리고 어떤 스크립트 언어도 모든 데이터베이스에 대한 연결

라이브러리를 제공하지는 않습니다. 다른 경우도 마찬가지입니다.

이 책에서는 하드웨어나 운영체제, 웹 서버 소프트웨어를 별로 중요하게 다루지 않습니다.

그럴 필요가 없기 때문입니다. PHP의 훌륭한 특징 중의 하나는 대부분의 운영체제에서 돌

아간다는 점입니다. 마이크로소프트 윈도우즈든, 어떤 버전의 유닉스든 간에 제대로 돌아가

는 웹 서버만 있으면 대부분 아무 문제없이 잘 돌아갑니다. MySQL도 같은 의미에서 다재

다능하다고 볼 수 있습니다.

이런 특성을 보여주기 위해, 이 책에서 다루는 대부분의 예제를 다음의 두 가지 환경에서

테스트하였습니다.

Apache 웹 서버를 사용하는 리눅스

IIS(마이크로소프트 인터넷 정보 서버)를 사용하는 마이크로소프트 윈도우즈 2000

여러분이 어떤 하드웨어, 운영체제, 웹 서버를 사용하든지 간에, PHP와 MySQL을 사용할지

신중하게 고려해볼 것이라고 생각합니다.

PHP의 장점

PHP의 주요 경쟁 제품으로는 Perl, ASP, JSP, Allaire 콜드퓨전(ColdFusion) 등이 있습니다.

3 5이 책 을 들 어 가 며

이 제품들에 비해 PHP는 많은 장점을 가지고 있는데, 요약하자면 다음과 같습니다.

뛰어난 성능

다양한 데이터베이스 지원 인터페이스

일반적인 웹 기능을 지원하는 다양한 내장 라이브러리

저렴한 비용

배우기 쉽고 사용하기 쉬운 문법

호환성

소스 코드 공개

각각의 장점에 대해 자세하게 다루어 보겠습니다.

성능

PHP는 대단히 효율적입니다. 값싼 서버 한 대로 하루에 수백만에 달하는 히트를 감당할 수

있습니다. Zend Technologies(http://www.zend.com)에서 공개한 자료에 따르면 PHP는 다른

경쟁 제품들을 압도하는 성능을 자랑합니다.

데이터베이스 통합

PHP는 다양한 데이터베이스를 기본적으로 지원합니다. MySQL뿐만 아니라 PostgreSQL,

mSQL, Oracle, dbm, filePro, Hyperwave, Informix, InterBase, Sybase 데이터베이스 등에 모

두 연결할 수 있습니다.

ODBC(Open Database Connectivity Standard)를 사용하면, ODBC 드라이버가 지원하는 모

든 데이터베이스에 연결할 수 있습니다.

내장 라이브러리

PHP는 웹에서 사용할 목적으로 설계되었기 때문에 웹 관련 작업을 수행할 수 있는 다양한

내장 함수를 가지고 있습니다. GIF 형식의 이미지를 실시간에 만들 수도 있고, 다른 네트워

크에 접속하거나 이메일을 보낼 수도 있습니다. 그리고 쿠키를 사용하거나 PDF 문서를 만

들 수도 있습니다. 이 모든 작업이 단지 몇 줄의 PHP 코드로 가능합니다.

3 6성 공 적 인 웹 프 로 그 래 밍 - PHP와 MySQL

비용

PHP는 무료입니다. http://www.php.net을 방문하면 PHP 최신 버전을 무료로 다운로드받을

수 있습니다.

PHP 배우기

PHP는 다른 프로그래밍 언어와 비슷한 문법을 가지고 있습니다. 특히 C 언어와 Perl에서

많은 부분을 차용했습니다. 이미 C 언어나 Perl 또는 C++와 Java처럼 C 언어와 비슷한 언어

를 알고 있다면, PHP를 아주 쉽게 익힐 수 있습니다.

호환성

PHP는 다양한 운영체제에서 사용할 수 있습니다. 여러분이 리눅스와 FreeBSD 같은 공개

유닉스 계열의 운영체제에서 작성한 PHP 코드를 가지고 있다고 합시다. Solaris와 IRIX 같

은 상용 유닉스는 물론 윈도우즈 같이 전혀 다른 운영체제에서도 여러분이 작성한 코드를

전혀 수정하지 않고 사용할 수 있습니다.

소스 코드

PHP의 소스 코드를 직접 볼 수 있습니다. 다른 상용 제품이나 소스 비공개 제품과 달리,

기존의 코드를 수정하거나 새로운 기능을 추가할 수 있습니다.

새로운 패치가 발표될 때까지 기다릴 필요도 없고, 더 이상 생산 회사가 비즈니스적인 이유

로 제품 지원을 중단할까봐 마음 졸일 이유가 없습니다.

MySQL의 장점

MySQL의 주요 경쟁자로는 PostgreSQL, 마이크로소프트 SQL 서버, Oracle 등이 있습니다.

MySQL만의 다양한 장점들이 있는데, 요약하면 다음과 같습니다.

뛰어난 성능

저렴한 비용

쉬운 설정과 구조

3 7이 책 을 들 어 가 며

호환성

소스 코드 공개

마찬가지로 각 장점들에 대해 자세하게 다뤄보도록 하겠습니다.

성능

MySQL의 속도는 논란의 여지가 없습니다. mysql.com에 접속하면 개발자들이 작성한 벤치

마크 자료를 볼 수 있습니다. 많은 벤치마크 자료들이 MySQL이 다른 경쟁 제품보다 월등

히 빠르다는 사실을 보여줍니다.

저렴한 비용

MySQL을 오픈 소스 라이센스로 사용하면 비용이 들지 않습니다. 개인적인 용도가 아니라

상업적인 용도로 사용하려면 상용 라이센스를 사용해야 하는데 별로 비싸지는 않습니다.

간단한 사용법

최신 데이터베이스는 대부분 SQL을 지원합니다. 다른 RDBMS를 사용해본 적이 있다면 그

지식을 그대로 활용할 수 있습니다. 그리고 MySQL은 비슷한 다른 제품들보다 훨씬 더 쉽

게 설치 및 설정할 수 있습니다.

호환성

MySQL은 다양한 유닉스 시스템과 윈도우즈 시스템에서 사용할 수 있습니다.

소스 코드

PHP와 마찬가지로 MySQL의 소스 코드를 얻어서 필요에 따라 수정할 수 있습니다.

이 책의 구성

이 책은 크게 다섯 부분으로 구성되어 있습니다.

첫 번째 파트인 P HP 사용하기 에서는 PHP 언어의 핵심적인 부분들을 예제와 함께 살펴봅

니다. 각각의 예제들은 전자상거래 사이트를 구축하는 데 사용할 수 있을 만큼 실용적입니

3 8성 공 적 인 웹 프 로 그 래 밍 - PHP와 MySQL

다. 다른 책에서처럼 장난감 코드는 취급하지 않습니다. 이 파트는 1장 PHP 훑어보기 로

시작합니다. 이미 PHP를 사용한 경험이 있다면 대충 훑어보기만 하면 됩니다. PHP를 전혀

다뤄본 적이 없거나 프로그래밍이 처음이라면, 시간을 두고 천천히 읽어보기 바랍니다.

두 번째 파트인 MySQL 사용하기 에서는 MySQL과 같은 관계형 데이터베이스를 사용하

는 데 필요한 기본 개념을 다룹니다. SQL 쿼리 사용법, PHP를 사용해서 MySQL의 데이터

를 출력하는 방법 및 보안과 최적화와 같은 MySQL에 대한 고급 지식을 다룹니다.

세 번째 파트인 전자상거래와 보안 에서는 전자상거래 사이트를 개발하는 데 필요한 일반

적인 이슈를 다룹니다. 가장 중요한 이슈는 보안입니다. 이어서 PHP와 MySQL을 사용해서

사용자를 인증하고 데이터를 안전하게 모으고, 전송하고, 저장하는 방법에 대해 다루게 됩

니다.

네 번째 파트인 고급 P HP 에서는 PHP 내장 함수에 대해 조금 더 자세히 알아보게 됩니다.

주로 전자상거래 사이트를 구축하는 데 필요한 함수들을 모아서 살펴보겠습니다. 서버와 통

신하고, 네트워크를 통해 정보를 주고받으며, 이미지를 생성하거나 시간에 관련된 처리를

하고 세션 변수를 다루는 방법에 대해 배우게 될 것입니다.

마지막 파트인 P HP와 MySQL로 실용적인 사이트 만들기 에서는 대규모 프로젝트를 관리

하고 디버깅할 수 있는 실제적인 예제를 다룹니다. 이 예제를 통해 PHP와 MySQL의 편리함

을 다시 한 번 느끼게 될 것입니다.

이 책의 소개를 마치며

필자가 이 책을 집필하면서 처음에 느꼈던 즐거움을 여러분도 PHP와 MySQL을 배우고 사

용하는 과정에서 느끼길 바랍니다. 이것들을 사용하는 것은 정말 즐거운 일입니다. 이제 곧

여러분은 다이내믹한 실시간 웹 사이트를 구축할 수 있는 견고하고 강력한 도구인 PHP와

MySQL을 사용하는 수많은 웹 개발자의 대열에 들어서게 될 것입니다.

용어대역표

한글 영문

a pplicat ion 응용 프로그램

a rg ume nt 인자

a rt icle 게시물

att ribute 속성

a udit 감사

backs las h 역슬래시

browse r 브라우저

ca rdina lity 카디널리티

ca rriage return , new line 줄바꿈(문자)

case s ens it ive 대소문자를 구분하다

ce rt if icat io n 인증서

characte r s et 문자셋

characte r 문자

child node 자식 노드

collapse 축소

column 열

conf ide nt ia l 신용

connect io n 접속

consta nt 상수

4 0성 공 적 인 웹 프 로 그 래 밍 - PHP와 MySQL

한글 영문

co nst ructor 생성자

co nst ruct 구조

co ntents 컨텐츠

co nt rol st ruct ure 제어 구조

co nve nt io n 관례

co nve rs ion s pecif icat io n 변환 명세

custome r 고객

data hiding 데이터 감춤

decrypt io n 암호해독

default 기본값

des ig n 설계

deta il 세부사항

doma in name 도메인 이름

dummy 더미

dynamic 동적

e le me nt 엘리먼트

end tag 종료 태그

ex pa nding 확장

ex pos ure 노출

ex press io n 표현식

extens io n 확장 (라이브러리)

fetch 페치

f ie ld 필드

f ilte ring 필터링

f lowcha rt 순서도

fore ign key 외래 키

form 폼

funct io na lity 기능성

1용 어 대 역 표

한글 영문

ha nd le 핸들

has h 해시

header 헤더

hie ra rchica l 계층적

hie ra rchy 계층 구조

hig hlight 강조

ide nt if ie r 식별자

inde nt 들여쓰기

index 인덱스

inherita nce 상속

insta nt iat io n 인스턴스 생성

integ rity 무결성

inte rprete r 인터프리터

inte rprete 해석하다

iss ue 발행하다

ite m 상품

ite rat io n 반복문

leaf node 단말 노드

link 링크

methodology 방법론

method 메소드

mirro ring 미러링

mult idime ns io na l 다차원

mult iple chat 카테고리

nest 중첩

network 네트워크

node 노드

norm 척도

4 2성 공 적 인 웹 프 로 그 래 밍 - PHP와 MySQL

한글 영문

note 참고

ope ra nd 피연산자

ope rato r 연산자

orde r 주문

pa ramete r 파라미터

pa rent node 부모 노드

pa rse r 파서

pa rty 집단

pa rt 파트

pass by refe rence 참조로 전달

pe rforma nce 성능

pe rmiss ion 퍼미션

pe rso na lizat ion 개인화

policy 정책

polymorphis m 다형성

precede nce 우선순위

prima ry key 기본 키

principle 원칙

private key 개인 키

privilege 권한

prod uct 물품

property 특성

prototype 프로토타입

public key 공개 키

public method 공개 메소드

query 쿼리

recovery 복구

reg ular express ion 정규 표현식

re lat iona l a lge bra 관계형 대수

3용 어 대 역 표

한글 영문

re lat iona l data bas e 관계형 데이터베이스

re lat iona l theory 관계 이론

re mote 리모트

re pud iat io n 부인

re putat io n 명성

request 요구

res et 리셋

res ource 리소스

ret urn 리턴

re use 재활용

reve rs e s pam 역 스팸

ripple effect 리플 효과

root node 루트 노드

s afe mode 안전 모드

sca la r 스칼라

sco pe 범위

script 스크립트

s ecret key 비밀 키

s e rve r s ide script 서버 스크립트

s ig n 부호

sta rt tag 시작 태그

s ubclass 하위클래스

s ubmit 확인

s ubscriber 가입자

s upe rclass 상위클래스

symbo l 기호

syntax 문법

tag 태그

4성 공 적 인 웹 프 로 그 래 밍 - PHP와 MySQL

한글 영문

t ime sta mp 타임 스탬프

to ken 토큰

t raff ic 트래픽

t ra ns act ion 트랜잭션

una ry 단항 연산자

us a bility 가용성

us e r dec lare 사용자 정의

va riable 변수

ve rif icat ion 검증

whites pace 공백

PHP 사용하기

I

Chapter 1 PHP 훑어보기

Chapter 2 데이터 저장하고 불러오기

Chapter 3 배열 사용하기

Chapter 4 문자열 연산과 정규 표현식

Chapter 5 코드 재활용과 함수 작성

Chapter 6 객체지향 PHP

PHP 훑어보기

이 장에서는 PHP 문법과 PHP 구조에 대해 훑어보고자 한다. 만약에 PHP를 사용해본 적이

있다고 하더라도 그 동안 모르고 지나쳤던 부분들을 다시 한 번 자세히 알아보자. C 언어와

ASP 그 외 다른 프로그래밍 언어를 사용해봤다면 좀더 빠르게 익힐 수 있을 것이다.

전자상거래를 구축해본 경험을 바탕으로 작성한 실제 예제를 가지고 PHP를 배워보자. 다른

프로그래밍 교재들은 간단한 예제로 기본적인 문법을 가르치지만 온라인 매뉴얼과 다를 바

없는, 단지 함수와 문법을 나열하는 방식보다는 구체적으로 뭔가를 만들어서 실행해보며 언

어가 어떻게 쓰이는지 알아보는 것이 더 좋은 방법이라고 생각한다.

예제들을 입력하거나 이 책에 수록된 CD-ROM에서 불러와서 바꿔도 보고, 해석해보기도

하면서 이를 고쳐 활용해볼 수 있는 방법을 배워보자.

이 장에서 온라인 상품 주문 폼을 가지고 변수, 연산자, 표현식(expressions)이 PHP에서 어

떻게 쓰이는지 알아보자. 그리고 변수형과 연산자 우선순위도 알아보자. 또한 폼 변수에

접근해서 고객 주문의 총합이나 세금을 계산하기 위해 폼 변수를 사용하는 방법을 배워볼

것이다.

그리고 PHP를 사용해서 입력 값을 확인하는 방법도 만들어보고, 불리언 값의 개념과 i f ,

el se, ? 와 같은 연산자와 swi t ch 문을 사용하는 예제를 살펴보자.

마지막으로, 반복되는 HTML 테이블을 만들기 위해 PHP 반복문을 사용해보자.

다음은 이번 장의 주요 주제를 정리한 것이다.

HTML에서 PHP 사용하기

동적으로 컨텐츠 추가하기

폼 변수 다루기

식별자

1

4 8PART I PHP 사 용 하 기

사용자 정의 변수

변수에 값 대입하기

변수형

상수

변수의 범위

연산자와 우선순위

표현식

변수 함수

i f , el se, swi t ch와 같은 조건문

whi l e, do, f or와 같은 반복문

PHP 사용하기

책의 예제를 실행해보기 위해서는 PHP를 사용할 수 있는 웹 서버가 필요하다. 예제를 제대

로 익히기 위해서는, 실행시키고 코드를 바꿔볼 실험 장소가 필요하다.

만약 컴퓨터에 PHP가 설치되어 있지 않다면 직접 설치하거나 관리자에게 설치해달라고 요

청하자. PHP를 설치하는 방법은 부록 A PHP, MySQL 설치 가이드 에 나와 있다. 이 책에

수록된 CD-ROM에서 유닉스나 윈도우즈 NT에서 PHP를 설치할 때 필요한 모든 정보를 찾

을 수 있다.

예제 : Bob's Auto Pa rts

PHP와 같은 서버 스크립트 언어는 HTML 폼을 처리하기 위해서 많이 쓰인다. Bob's Auto

Parts라는 부품 가공 회사에서 사용할 주문 폼을 PHP로 만들어보자. 이 장에서 사용되는

Bob의 예제는 CD-ROM의 chapt er 01 디렉토리에 있다.

주문 폼

Bob이 파는 부품에 대한 주문 폼을 만들어 보았다([그림 1.1] 참조). 웹을 서핑하는 동안 흔

히 볼 수 있는 간단한 주문 양식이다. 우선 Bob은 고객이 주문한 것이 무엇인지, 총액은 얼

마인지 또 그 주문에 따른 세금은 얼마나 되는지 알고 싶어한다.

4 9Chapter 1 PHP 훑 어 보 기

[그 림 1.1] Bob의 주문 폼 초기 화면, 아직은 물품과 개수 칸만 있다.

[리스트 1.1] orderf orm.ht ml - 주문 폼을 만드는 HTML

<for m act i on="pr oces sor der .php " met hod=pos t ><t abl e bor der=0><t r bgcol or =#cccccc>

<t d wi dt h=150>I t em</ t d><t d wi dt h=15>Quant i t y</ t d>

</ t r ><t r >

<t d>Ti r es</ t d><t d al i gn="cent er "><i nput t ype="t ext " name="t i r eqt y" s i ze="3"

maxl engt h="3"></ t d></ t r ><t r >

<t d>Oi l </ t d><t d al i gn="cent er "><i nput t ype="t ext " name="oi l qt y" s i ze="3" maxl engt h="3"></ t d>

</ t r ><t r >

<t d>Spar k Pl ugs</ t d><t d al i gn="cent er "><i nput t ype="t ext " name="spar kqt y" s i ze="3"

maxl engt h="3"></ t d></ t r ><t r >

<t d col span="2" al i gn="cent er "><i nput t ype="submi t " val ue="Submi t Or der "></ t d></ t r ></ t abl e></ f orm>

5 0PART I PHP 사 용 하 기

먼저 [리스트 1.1]에서 중요한 부분을 살펴보자. 첫 번째로 살펴볼 부분은 폼의 act i on 부분

에 고객의 주문을 처리할 PHP 스크립트의 이름을 적어 주었다는 점이다. 이번 폼은 웹을

서핑하는 동안 흔히 볼 수 있는 간단한 주문 양식이다. act i on 속성의 값은 대부분 고객이

확인 버튼을 눌렀을 때 실행되는 페이지의 URL을 적어준다. 이 URL로 사용자가 폼에 입력

한 정보를 보내는데, met hod 속성이 get 이면 URL의 뒷부분에 붙여서 보내고 post 이면 다

른 패킷으로 보낸다.

두 번째 부분은 t i r eqt y, oi l qt y, spar kqt y라는 폼 필드(f i el d)의 이름이다. PHP 스크립

트에서도 같은 이름을 쓰기 때문에 폼 필드에 의미 있는 이름을 써야 기억하기 쉽다. HTML

편집기는 필드 이름을 의미 없는 f i el d23과 같이 만들어주지만 폼에 들어올 데이터와 관련

된 이름을 사용하는 편이 훨씬 좋다.

사이트의 필드 이름을 같은 방법으로 짓는다면 기억하기 훨씬 편하다. 예를 들면, 단어를

요약해서 쓴다든가 공백 대신에 _ 을 넣는다 등의 방법이 있다.

폼 처리하기

act i on 값에 들어간 pr ocessorder .php 스크립트를 만들어서 폼을 처리해보자. 텍스트 편

집기를 열어서 다음과 같은 코드를 입력해보자.

<ht ml ><head>

<t i t l e>Bob ' s Aut o Par t s - Or der Resul t s</ t i t l e></ head><body><h1>Bob ' s Aut o Par t s</ h1><h2>Or der Resul t s</ h2></ body></ ht ml >

입력한 코드들은 단순한 HTML이며, 그 안에 PHP 코드를 삽입해보자.

HTML에서 PHP 사용하기

<?phpecho ' <p>Or der pr oces sed .</ p> ' ;

?>

5 1Chapter 1 PHP 훑 어 보 기

이와 같은 코드를 삽입한 후에 파일을 저장하고 Bob의 폼을 모두 채운 뒤에 확인 버튼을

눌러 보자. [그림 1.2]와 같은 그림이 나왔는가?

[그 림 1.2] PHP의 echo를 사용하면 브라우저에 글자가 출력된다.

방금 전에 삽입한 PHP 코드가 어떻게 됐는지 확인해보기 위해서 브라우저에서 소스 보기를

해보자.

<ht ml ><head>

<t i t l e>Bob ' s Aut o Par t s - Or der Resul t s</ t i t l e></ head><body><h1>Bob ' s Aut o Par t s</ h1><h2>Or der Resul t s</ h2><p>Or der pr oces sed .</ p></ body></ ht ml >

PHP 인터프리터가 스크립트를 읽어서 결과물로 바꿔놓기 때문에 실제 PHP 코드는 보이지

않는다. PHP는 브라우저가 이해할 수 있는 HTML 형식으로 바뀌기 때문에 사용자의 브라

우저는 PHP를 이해할 필요가 없다.

PHP는 웹 서버에서 실행하는 서버 스크립트로 웹 브라우저에서 실행하는 JavaScript나 다른

클라이언트 기술과는 다르다.

pr oces sor der .php의 구성 요소를 살펴보자.

5 2PART I PHP 사 용 하 기

HTML

PHP 태그

PHP 문

공백

여기에 하나 더 추가하면 아래와 같다.

주석

하지만 예제의 대부분은 HTML이 차지하고 있다.

PHP 태그 사용하기

앞 예제에서 사용한 PHP 코드는 <?php로 시작해서 ?>로 끝났다. 다른 HTML 태그처럼 <

로 시작해서 > 로 끝난다. 이런 기호들을 가지고 웹 서버가 PHP 시작과 끝을 인식할 수

있다. PHP 태그 사이에 있는 모든 문장은 PHP로 인식되고 PHP 태그 밖에 있는 것은 일반

HTML로 인식된다. 따라서 PHP 태그를 사용하면 HTML을 빠져나올 수 있다.

사용 가능한 여러 가지 태그를 살펴보자.

PHP 태그 스타일

사용할 수 있는 PHP 태그에는 총 네 가지 방식이 있고 아래 예제 코드들은 모두 동일한

기능을 한다.

XML 스타일

<?php echo ' <p>Or der pr oces sed .</ p> ' ; ?>

예제에서 사용되는 태그 스타일로 PHP 3과 4에서 자주 쓰이는 태그 방식이며 모

든 서버에서 사용할 수 있다. 이 스타일은 XML 문서에서도 사용되기 때문에 사

이트에서 SML을 지원할 생각이라면 이 스타일의 태그를 사용해야 한다.

짧은 스타일

<? echo ' <p>Or der pr oces sed .</ p> ' ; ?>

SGML 방식을 따르는 가장 간단한 스타일이다. 이 스타일을 사용하려면 conf i g

파일의 shor t _t ags를 활성화시키거나, 짧은 스타일 태그를 사용할 수 있도록

PHP를 컴파일해야 한다. 이것에 대한 정보는 부록 A에 자세히 나와 있다.

5 3Chapter 1 PHP 훑 어 보 기

스크립트 스타일

<scr i pt l anguage= ' php ' > echo ' <p>Or der pr ocess ed . </ p> ' ; </ s cr i pt >

가장 긴 스타일로 JavaScript나 VBScript를 사용해본 적이 있다면 익숙한 방식일

것이다. HTML 편집기를 쓸 때 사용할 수 있는 방법이다.

AS P 스타일

<%echo ' <p>Or der pr oces sed .</ p> ' ; %>

ASP와 같은 스타일로 conf i g 파일에서 asp_t ags를 활성화해 놓았다면 사용할

수 있다. 편집기를 ASP 방식으로 사용하고 있다든가, 이미 ASP로 만든 스크립트

를 PHP에서 사용하고 싶을 때 가능하다.

PHP 문

PHP 인터프리터는 PHP 태그 사이의 PHP 문을 가지고 동작한다. 앞 예제의 문장 하나를

사용해 보았다.

echo ' <p>Or der pr oces sed .</ p> ' ;

예제에서 살펴보았듯이 echo는 문자열을 브라우저에서 출력한다. [그림 1.2]에서 결과를 확

인할 수 있다.

echo 문 마지막에 찍힌 세미콜론은 . 가 문장의 끝을 나타내듯이 C 언어나 Java처럼 PHP

문의 끝을 나타낸다. 초보자들이 세미콜론을 빼먹는 실수를 자주 하긴 하지만 고치기 쉬운

에러이다.

공백

줄바꿈 문자, 스페이스, 탭과 같은 공간 문자를 공백(whitespace)이라고 부른다. 브라우저는

HTML에 있는 공백을 무시하고 PHP도 PHP 코드의 공백을 무시한다. 다음 두 개의 HTML

코드를 살펴보자.

<h1>Wel come t o Bob ' s Aut o Par t s !</ h1><p>What woul d you l i ke t o or der t oday?</ p>

<h1>Wel come t o Bob ' sAut o Par t s !</ h1>

4PART I PHP 사 용 하 기

<p>What woul d you l i ket o or der t oday?</ p>

위 두 HTML 코드는 브라우저에서 동일하게 보여진다. 하지만 HTML, PHP 코드의 가독성

을 높이기 위해서 공백을 적절히 사용해보자. PHP 문 사이에 공백이 있을 필요는 없지만

각기 다른 줄에 쓰는 것이 훨씬 읽기에 편하다. 예를 들어,

echo ' hel l o ' ;echo ' wor l d ' ;

echo ' hel l o ' ; echo ' wor l d ' ;

위 두 경우는 동일하지만 처음 코드가 읽기 더 편하다.

주석

주석은 코드에 대한 설명을 코드 속에 적어놓은 것이다. 주석에는 스크립트의 목적, 누가

작성한 것인지, 왜 이런 방식으로 만들어졌는지, 언제 마지막으로 수정되었는지 등에 대한

정보가 포함된다. 예제 중 아주 간단한 PHP 스크립트를 제외하고는 모두 주석이 달려 있다.

PHP 인터프리터는 주석은 건드리지 않는다. 특히 PHP 파서(parser)는 주석을 공백처럼 처리

한다.

PHP는 C 언어, C++와 쉘 스크립트 스타일의 주석을 모두 지원한다.

아래는 PHP 스크립트의 처음에 나올 만한 C 언어 스타일의 여러 줄 주석의 예이다.

/ * 작성자: Bob Smi t h마지막수정일: 4월 10일

고객주문을처리한다.*/

여러줄 주석은 / *로 시작해서 */ 로 끝난다. C 언어에서처럼 여러줄 주석은중첩될수 없다.

한 줄 주석을 달고 싶으면 C++ 스타일로 써보자.

echo ' <p>Or der pr oces sed .</ p> ' ; / / 주문을출력한다.

5Chapter 1 PHP 훑 어 보 기

혹은 쉘 스크립트 스타일로도 쓸 수 있다.

echo ' <p>Or der pr oces sed .</ p> ' ; # 주문을출력한다.

둘 다 주석 기호 다음부터 그 줄의 끝이나 PHP 태그까지 주석으로 처리된다.

동적으로 컨텐츠 추가하기

아직까지는 단순한 HTML도 할 수 있는 기능만을 다루었다.

서버 스크립트의 사용 목적은 사이트의 사용자에게 동적인 컨텐츠를 제공하기 위해서이다.

사용자의 요구나 시간에 따라 컨텐츠가 달라지게 하는 스크립트를 만들어보자.

간단한 예제부터 시작해보자. pr ocessor der .php를 다음 코드로 바꾸어보자.

<?phpecho ' <p>Or der pr oces sed at ' ;echo dat e ( ' H: i , j S F ' ) ;echo ' </ p>' ;

?>

이 코드는 PHP에서 제공하는 dat e () 함수를 사용하여 고객의 주문이 처리되고 있는 시간

을 알려준다. 실행되는 시기에 따라 시간은 달라지겠지만 스크립트를 실행한 결과는 [그림

1.3]과 비슷할 것이다.

.

[그 림 1.3] PHP의 date() 함수를 사용하면 주문을 처리한 날짜를 보여준다.

5 6PART I PHP 사 용 하 기

함수 호출

dat e () 함수를 호출하는 부분을 보자. PHP는 웹 응용 프로그램의 개발시에 사용할 수 있는

함수 라이브러리를 제공하고 있다. 대부분의 함수는 인자를 받아서 결과를 리턴한다.

다음 함수의 호출을 보자.

dat e ( ' H: i , j S F ' )

한 쌍의 괄호 안에 문자열을 넣어 함수로 전달해줄 수 있다. 이런 것을 함수의 인자 혹은

파라미터라고 부른다. 인자는 함수의 입력값이 되고 함수는 결과를 되돌려준다.

date() 함수

dat e () 함수는 건네준 인자를 결과 형식을 나타내는 포맷 문자열로 사용한다. 문자열의 문

자들은 날짜와 시간을 나타낸다. H는 24시간 형식의 시간 을 나타내고, i (소문자)는 두 자

리로 나타낸 분 을 가리킨다(01분 등으로 표시). j 는 이번 달의 날짜를 나타내는데 0은 붙

이지않는다. S는 서수접미사를 나타내고(이 경우 t h ), F는 이번 달의 이름을 가리킨다(단,

1월이라면 Jan 으로 표시하지 않고 January 로 표시한다).

폼 변수 다루기

주문 폼에서 필요한 것은 고객의 주문을 모아오는 일이다. 고객이 입력한 정보를 모으는 일

은 PHP에서 아주 쉬운 일이기는 하지만 정확한 방법은 PHP 버전과 php.ini 파일에 설정한

것에 따라 다를 수 있다.

폼 변수

PHP 스크립트에서 폼 필드 값은 PHP 변수처럼 접근할 수 있다. PHP에서는 변수가 $ 부호

로 시작하기 때문에 쉽게 알아볼 수 있다($ 기호를 빼먹지 말자!).

PHP 버전과 세팅에 따라서 폼 데이터를 변수로 접근하는 방법은 세 가지가 있다. 공식적인

이름이 없으므로 일단 짧은, 중간, 긴 스타일이라고 부르자.

t i r eqt y라는 필드는 다음과 같이 접근할 수 있다.

$t i r eqt y / / 짧은스타일

$_POST[ ' t i r eqt y ' ] / / 중간스타일

$HTTP_POST_VARS [ ' t i r eqt y ' ] / / 긴스타일

5 7Chapter 1 PHP 훑 어 보 기

앞으로는 폼 변수에 접근하기 위해서 긴 스타일을 사용하지만 필요하다면 짧은 버전으로도

만들 수 있다. 긴 버전을 사용하는 것이 PHP 버전이나 세팅에 관계없이 모든 시스템에서

사용할 수 있는 편리하고 안전한 방법이다.

PHP 코드를 작성할 때는 다른 스타일을 사용할 수도 있으므로 여러 가지 방법을 살펴보자.

짧은 스타일은 편하지만 r egi st e r_gl obal s를 활성화시켜야 한다(기본 설정으로

되어 있지만 어떤 시스템은 설정되어 있지 않기도 하다). 이 스타일은 코드가 안

전하지 못할 수도 있다.

중간 스타일은 꽤 편하지만 PHP 4.1.0 이후에서만 사용할 수 있기 때문에 더 오

래된 시스템에서는 쓸 수 없다.

긴 스타일은 길긴 하지만 모든 서버에서 설정과 관계없이 사용할 수 있다. 하지

만 너무 길어서 잘 사용되지 않기 때문에 앞으로는 지원하지 않을 수도 있다.

예제들이 어떤 시스템에서도 잘 동작해야 하기 때문에 긴 스타일을 선택했지만 상황에 따라

서 다른 스타일을 사용해도 된다.

짧은 스타일을 사용하면 스크립트에서 사용하는 변수의 이름이 폼 필드의 이름과 같다. 변

수를 정의한다든가 변수를 생성할 필요는 없다. 그 변수들은 함수에 인자를 건네주듯이 스

크립트로 넘겨진다. 짧은 스타일을 사용한다면 $t i r eqt y와 같이 변수로 사용할 수 있다. 폼

필드 t i r eqt y는 $t i r eqt y 변수를 생성한다.

짧은 스타일을 사용하려면 r egi st e r_gl obal s를 설정해야 한다. PHP 4.2에서는 기본으로

설정되지 않고, 더 오래된 버전에서는 기본으로 설정되어 있다.

변수처럼 바로 접근하는 방식은 매우 편하지만, 프로그램을 작성할 때 폼 변수와 자신이 만

든 변수와 섞이는 일이 발생할 수도 있다. 만약 짧은 스타일을 사용하는 경우라면 자신의

모든 변수를 기본값으로 설정해주는 것이 좋다.

중간 스타일은 $_POST, $_GET, $_REQUEST 중 하나로 폼 변수를 접근할 수 있다. $_ POST나

$_GET 둘 중 하나는 폼 변수 값을 저장하는데, 메소드를 POST로 했을 경우 $_ POST에서 폼

변수 값을 구할 수 있고, GET으로 했다면 $_GET에서 얻을 수 있다. 그리고 POST로 보내든

GET으로 보내든 간에 모든 변수는 $_REQUEST에서도 접근할 수 있다.

POST 방식을선택했을때 t i r eqt y에적힌데이터는 $_ POST [ ' t i r eqt y ' ]에저장되어있다.

GET을 선택했다면 $_GET[ ' t i r eqt y ' ]에 저장되어 있을 것이다. 두 경우 모두 $_REQUEST

[ ' t i r eqt y ' ]에는 값이 저장되어 있다.

5 8PART I PHP 사 용 하 기

이런 배열은 소위 수퍼글로벌이라고 불리는 것으로 변수 범위에 대해 설명할 때 자세히 알

아보자.

PHP 구버전을 사용한다면 $_POST나 $_GET에 접근할 수 없고 대신에 $HTTP_POST_VARS와

$HTTP_GET_VARS라는 배열에 폼 변수 값이 저장되어 있다. 이 방식은 모든 PHP 버전에서

사용 가능하지만 별로 사용되지 않기 때문에 다음 버전에서는 지원하지 않을지도 모른다.

그리고 $_REQUEST와 같은 역할을 하는 배열은 긴 버전에는 없다.

긴스타일을사용한다면 $HTTP_POST_VARS [ ' t i r eqt y ' ]나 $HTTP_GET_VARS [ ' t i r eqt y ' ]로

폼 변수를 사용할 수 있다.

아직까지는 폼 필드에서 넘어온 값이 제대로 된 값인지 검사하는 과정이 없었다. 책 뒷부분

에 데이터의 유효성을 검사하는 방법이 설명되어 있다.

예제를 한 번 살펴보자.

긴 스타일 변수 이름은 좀 귀찮기도 하고 배열 형식이므로 사용하기 쉬운 형태로 바꿔서

저장하자.

한 변수의 값을 다른 변수로 복사하기 위해서는 대입 연산자를 사용한다(PHP에서는 = 기

호). $HTTP_ POST_VARS [ ' t i r eqt y ' ]의 값을 $t i r eqt y라는 새로운 변수에 대입하는 코드는

다음과 같다.

$t i r eqt y = $HTTP_POST_VARS [ ' t i r eqt y ' ] ;

처리 스크립트의 처음에 다음 코드들을 삽입해보자. 폼에서 오는 데이터를 처리하는 스크립

트들은 모두 첫 부분에 비슷한 코드들을 가지고 있다. 이 코드들은 결과가 출력되지 않기

때문에 HTML 태그 앞에 넣거나 뒤에 넣어도 다를 게 없다. 하지만 찾기 쉽도록 스크립트의

첫 부분에 넣는 것이 좋다.

<?php/ / 짧은스타일의변수로만든다.

$t i r eqt y = $HTTP_POST_VARS [ ' t i r eqt y ' ] ;$oi l qt y = $HTTP_POST_VARS[ ' oi l qt y ' ] ;$spar kqt y = $HTTP_POST_VARS [ ' spar kqt y ' ] ;

?>

위 코드는 $t i r eqt y, $oi l qt y, $spar kqt y라는 새 변수를 만들어서 POST 방식으로 넘어온

데이터를 저장한다. 스크립트의 기능을 알아보기 위해서 다음과 같은 코드를 추가해보자.

9Chapter 1 PHP 훑 어 보 기

echo ' <p>Your or der i s as f ol l ows : </ p> ' ;echo $t i r eqt y . ' t i r es<br / >' ;echo $oi l qt y . ' bot t l es of oi l <br / >' ;echo $spar kqt y . ' spar k pl ugs<br / > ' ;

이 파일을 브라우저에 띄우면 [그림 1.4]와 비슷한 화면이 뜰 것이다. 실제 값은 당연히 폼에

입력한 값에 달려 있다.

[그 림 1.4] 사용자가 입력한 폼 변수는 processorder.php에서 쉽게 사용할 수 있다.

문자열 연결

사용자가 입력한 폼 필드의 값 뒤에 설명을 위해 넣은 문장이 화면에 출력되었다. echo 문

을 자세히 보면 변수 이름과 문자열 사이에 . 가 찍혀 있는 것을 볼 수 있다.

echo $t i r eqt y . ' t i r es<br / >' ;

. 는 문자열 연결 연산자(string concatenation operator)라는 것으로 문자열들을 연결하는 데

쓰인다. echo를 사용해서 출력할 때 자주 사용되는 연산자이다. 이렇게 하면 echo를 여러

번 사용하지 않아도 된다.

배열이 아닌 변수는 큰따옴표 안에 넣어서 출력할 수도 있다. 예를 들면 다음과 같다.

echo "$t i r eqt y t i r es<br / >";

0PART I PHP 사 용 하 기

이와 같이 해도 첫 번째 문장과 동일하다. 둘 중 마음에 드는 것을 사용하면 된다. 하지만

이것은 큰따옴표(" )의특징이며작은따옴표 ( ' )는이렇게 사용할 수 없다. 다음 코드를 실행

해보자.

echo ' $t i r eqt y t i r es<br / > ' ;

그러면 화면에 "$t i r eqt y t i r es<br / >"가찍히는 것을 볼 수 있다. 큰따옴표를 쓰면 변수

이름이 그 값으로 변환되지만 작은따옴표 안에서는 아무 것도 바뀌지 않은 채 출력된다.

변수와 문자

echo 문에서 연결한 변수와 문자열은 다른 형을 가지고 있다. 변수는 데이터의 기호이고

문자열은 데이터 자체이다. 실제 데이터는 변수와 달리 문자라고 부른다. $t i r eqt y는 변수

이고 고객이 입력한 값을 가지고 있지만, t i r es<br / >는 문자이다. 문자는 보이는 대로의

값을 가진다.

PHP는 큰따옴표 안에 있는 변수를 그 변수의 값으로 치환하지만 작은따옴표는 문자로 인식

한다고 할 수 있다.

식별자

식별자(identifier)는 변수의 이름을 말한다. 식별자에 관한 몇 가지 간단한 규칙을 알아보자.

식별자는 어떤 길이도 가질 수 있으며 문자, 숫자, _̀ , $ 로 만들 수 있다. 하지만

$를 식별자에 사용할 때는 주의해야 한다. 그 이유는 다음에 Variable Variables 부

분에 설명되어 있다.

식별자는 숫자로 시작할 수 없다.

PHP에서 식별자는 대소문자를 구별한다. $t i r eqt y는 $Ti r eqt y와 같지 않다. 그

러나 함수의 이름은 대소문자를 구별하지 않는다.

변수는 함수와 같은 이름을 가질 수 있지만 피하는 것이 좋으며, 다른 함수와 같

은 이름을 가지는 함수는 만들 수 없다.

사용자 정의 변수

HTML 폼에서 보낸 변수 이외의 사용자 자신의 변수를 정의해서 사용할 수 있다.

6 1Chapter 1 PHP 훑 어 보 기

변수는 처음 그 변수에 값을 대입하는 순간에 생기기 때문에 변수를 사용하기 전에 정의하

지 않아도 된다.

변수에 값 대입하기

변수에 값을 대입할 때는 대입 연산자인 = 를 사용한다. 한 변수의 값을 다른 변수에 복사

할 때도 사용할 수 있다. 예를 들어, Bob의 사이트에서 주문한 목록의 수와 총액을 계산해야

한다고 하자. 이 값을 저장하기 위한 두 변수를 만들어 보기 전에 먼저 변수들을 0으로 초기

화시켜 보자.

PHP 스크립트 아래에 다음 코드를 추가해보자.

$t ot al qt y = 0;$t ot al amount = 0. 00;

위 두 줄은 변수를 생성하고 값을 대입한다. 그리고 변수에 변수를 대입할 수도 있다.

$t ot al qt y = 0;$t ot al amount = $t ot al qt y;

변수형

변수의 형(type)은 저장된 데이터의 종류에 따른다.

PHP의 데이터형

정수형

실수형

문자열

불리언 - 참, 거짓의 값을 가진다.

배열 - 같은 형의 여러 데이터를 저장한다.

객체 - 클래스의 인스턴스를 저장한다.

PHP 4에는 불리언, NULL, r esour ce의세 가지 형이 추가되었다. 값을 가지고 있지 않거나

특별한 값인 NULL을 가지는 변수는 NULL 형이다. 데이터베이스 함수에서는 r esour ce

형의 변수를 리턴하기도 한다. 하지만 r esour ce 변수를 직접 다룰 기회는 흔치 않다.

2PART I PHP 사 용 하 기

PHP가 PDF를 지원한다면 phfdoc과 pdf i nfo 형을 가진다.

형 강도

PHP는 형 강도(type strength)가 매우 약한 언어이다. 대부분의 프로그래밍 언어에서 변수는

미리 어떤 형으로 선언하고 한 가지 형의 데이터만을 저장할 수 있지만 PHP에서는 변수에

저장된 값에 따라 형이 결정된다.

$t ot al qt y와 $t ot ql amount 를 만들어서 초기값을 넣어보자.

$t ot al qt y = 0;$t ot al amount = 0. 00;

$t ot al qt y에는 정수인 0을 대입했기 때문에 $t ot al qt y는 정수형이 된다. 같은 방식으로

$t ot ql amount 는 실수형이 된다.

좀 이상해 보이겠지만 다음 코드를 추가해보자.

$t ot al amount = ' Hel l o ' ;

추가한 후에는 $t ot al amount 는 문자열이 된다. PHP는 변수에 저장된 값이 바뀔 때마다 그

데이터의 형으로 변수의 형도 같이 바뀐다.

형이 자유자재로 바뀌는 것은 매우 유용하게 쓰인다. PHP에서는 변수에 데이터를 넣을 때마

다 변수의형이그에맞게변하기때문에 변수를불러왔을 때저장한 값그대로 찾을 수있다.

형 변환

형 변환(type casting)을 사용하면 데이터를 다른 형의 데이터로 전환할 수 있다. C 언어의

형 변환처럼 변수 앞에 괄호를 넣고 그 안에 바꾸고 싶은 형을 적으면 된다.

두 변수를 형 변환을 사용해서 정의해보자.

$t ot al qt y = 0;$t ot al amount = (doubl e) $t ot al qt y;

두 번째 줄은 $t ot al qt y의 값을 가져와서 실수로 변환한 다음에 $t ot al amount 에 저장하

라 라는 뜻이다. $t ot al amount 변수는 실수형이 되지만 $t ot al qt y는 여전히 정수형이다.

6 3Chapter 1 PHP 훑 어 보 기

Variable Variables

PHP는 var i abl e var i abl e이라는 변수를 지원한다. var i abl e var i abl es를 사용하면 변

수의 이름을 동적으로 바꿀 수 있다.

(대부분의 언어가 변수의 값을 바꿀 수 있을지는 몰라도 변수의 형을 바꾸기는 힘들다. 더군

다나 변수의 이름을 바꾸기는 더욱 어렵다. 하지만 PHP에서는 이를 모두 지원하고 있다.)

한 변수의 이름을 다른 변수가 값으로 가지는데, 다음 예를 살펴보자.

$var name = ' t i r eqt y ' ;

$t i r eqt y 대신에 이제 $$var name을 써도 된다. $t i r eqt y의 값도 바꾸어보자.

$$var name = 5;

위와 같이 하는 것은 다음 방법과 동일하다.

$t i r eqt y = 5;

불명확해 보일지 모르겠지만 일단은 그냥 넘어가자. 리스트를 가지고 폼 변수를 따로따로

쓰는 것보다 var i abl e var i abl es를 사용하여 반복문을 통해 처리하는 것이 더 좋은 방법

이라는 것만 알아두자.

상수

앞에서 언급했듯이 변수 안의 값은 바뀔 수 있다. 변수처럼 값을 저장할 수는 있지만 한 번

값이 결정되면 스크립트 내에서 그 값을 바꿀 수 없는 것을 상수라고 한다.

다음 예제에서 상품의 가격을 상수로 저장해보자.

def i ne ( ' TI REPRI CE' , 100) ;def i ne ( ' OI LPRI CE' , 10) ;def i ne ( ' SPARKPRI CE' , 4) ;

위 코드를 스크립트에 추가해보자.

C 언어의 관례를 따라 상수의 이름을 모두 대문자로 만들면 상수와 변수를 쉽게 구별할 수

있다(물론 C 언어나 PHP에서 꼭 그래야 하는 것은 아니다). 이런 관례를 지키면 코드의 유

지보수에 편리하다.

4PART I PHP 사 용 하 기

이제 고객 주문의 총합을 계산하기 위한 상수를 모두 갖추었다.

변수는 $를 붙이지만 상수는 상수의 이름만 적어주면 된다. 상수를 사용해보자.

echo TI REPRI CE;

정의한 대로 값이 화면에 출력된다. phpi nfo () 함수를 호출하면 이런 것에 관한 간략한 설

명을 볼 수 있다.

phpi nf o () ;

phpi nfo ()는 PHP에 정의되어 있는 변수와 상수에 대한 유용한 정보를 제공해준다.

변수의 범위

변수의 범위(scope)란 스크립트 안에서 특정 변수를 사용할 수 있는 구간을 말한다.

PHP에는 네 가지 범위가 있다.

수퍼글로벌 변수는 스크립트 내에서 모두 사용할 수 있다.

전역 변수는 스크립트 내에서 정의된 변수로 스크립트 내에서 사용할 수 있지만

함수 안에서는 사용할 수 없다 .

함수 안에서 정의된 변수는 함수 내에서만 사용할 수 있다.

함수 안에서 전역으로 정의된 변수는 같은 이름으로 스크립트 내에서 전역 변수

로 쓰일 수 있다.

PHP 4.2에서 $_GET과 $_POST와 그 외 특별한 변수의 범위는 수퍼글로벌이며 함수 안과 밖

모두에서 사용할 수 있다.

수퍼글로벌의 전체 리스트는 다음과 같다.

$GLOBALS - 모든 전역 변수의 배열

$_ SERVER - 서버 환경 변수의 배열

$_GET - GET 메소드로 넘어온 변수의 배열

$_ POST - POST 메소드로 넘어온 변수의 배열

$_COOKI ES - 쿠키 변수의 배열

6 5Chapter 1 PHP 훑 어 보 기

$_ FI LES - 파일 업로드와 관련된 변수의 배열

$_ENV - 환경 변수의 배열

$_REQUEST - 사용자가 입력한 변수의 배열

$_ SESSI ON - 세션 변수의 배열

위 변수들에 대해서는 이 책을 진행하면서 적절한 상황에서 언급하기로 한다.

지금 스크립트에서 사용하는 변수는 전역 변수이다.

연산자

연산자(operator)는 값과 변수를 사용해서 어떤 일을 하는 기호를 말한다. 연산자를 사용해서

고객 주문의 총합과 세금을 계산해보자.

대입 연산자인 = 와 문자열 연결 연산자인 . 는 이미 앞에서 언급했지만, 이번에는 연산

자 전체를 살펴보자.

연산자는 한 개나 두 개 혹은 세 개의 인자를 가지고 그 중 대부분은 두 개의 인자를 가진다.

예를 들어, 대입 연산자는 저장될 곳은 = 왼쪽에, 저장할 값은 오른쪽에 두어 모두 두 개

의 인자를 가진다. 이런 인자를 피연산자(operand)라 한다.

산술 연산자

산술 연산자(arithmetic operator)는 수학적 연산자와 비슷하게 생겼다.

[표 1.1] PHP 산술 연산자

연 산 자 이 름 예

+

-

*

/

%

덧셈

뺄셈

곱셈

나눗셈

모듈러

$a + $b

$a - $b

$a * $b

$a / $b

$a %$b

연산 결과를 대입 연산자를 사용해서 저장할 수 있다.

$r esul t = $a + $b ;

6 6PART I PHP 사 용 하 기

덧셈과 뺄셈은 $a와 $b 변수에 저장된 값을 더하기/빼기한다.

뺄셈 기호인 - 는 음수 값을 가리키는 단항 연산자(피연산자를 하나 가지는 연산자를 말한

다)로도 쓰인다. 예를 들면 다음과 같이 사용할 수 있다.

$a = - 1;

곱셈과 나눗셈 역시 생각하는 대로 동작하는데, 수학적인 기호와 달리 * 가 곱셈 연산자이

고 / 가 나눗셈 연산자라는 것을 기억해둔다.

모듈러 연산자는 $a를 $b로 나눈 나머지를 리턴한다. 예를 들면 다음과 같다.

$a = 27;$b = 10;$r esul t = $a%$b ;

$r esul t 에 저장되는 값은 27을 10으로 나눈 나머지로 7이 된다.

산술 연산자는 정수와 실수형에서만 쓰일 수 있으며 문자열을 산술 연산하려고 시도하면

문자열을 숫자로 바꾸어서 실행한다. 만약에 문자열에 e 나 E 가 들어 있다면 실수형으로

변환하고 그 외에는 정수형으로 변환한다. PHP는 문자열 처음에서 숫자를 찾아서 그것을

값으로 인식하는데, 만약에 문자열에 숫자가 없다면 문자열의 값은 0이 된다.

문자열 연산자

문자열 연산자는 앞에서 살펴본 문자열 연결 연산자 . 밖에 없다. 문자열 연결 연산자는

두 문자열을 앞뒤로 붙여서 새로운 문자열을 만들어낸다.

$a = "Bob ' s ";$b = ' Aut o Par t s ' ;$r esul t = $a . $b ;

$r esul t 에 저장된 값은 Bob ' s Aut o Par t s 이다.

대입 연산자

대입 연산자는 이미 언급한 = 이고, 이 연산자는 ~에 ~를 대입한다 라고 읽는다.

$t ot al qt y = 0;

7Chapter 1 PHP 훑 어 보 기

이와 같은 경우 $t ot al qt y에 0을 대입한다 라고 읽으면 된다. 뒤에 가서 비교 연산자를

다룰 때 왜 이렇게 읽어야 하는지 이해할 수 있을 것이다.

대입 연산자의 리턴값

대입 연산자도 다른 연산자들처럼 값을 리턴한다.

$a + $b

위와 같은 표현식의 값은 $a와 $b의 합이 된다.

마찬가지로 다음 표현식의 값은 0이 된다.

$a = 0

대입 연산자도 값을 리턴하기 때문에 다음과 같은 것도 가능하다.

$b = 6 + ($a =5) ;

$b의 값은 11이 되며, 대입 연산자 왼쪽에 대입되는 값이 대입 연산문이 리턴하는 값이

된다.

괄호 안의 표현식은 더 높은 우선순위를 가지기 때문에 표현식의 값을 사용할 수 있으며

괄호는 수학에서와 같은 방식으로 쓰인다.

복합 대입 연산자

식을 간단하게 만들기 위해서 대입 연산자와 그 외 연산자를 결합해서 쓰는 경우도 있다.

$a += 5 ;$a = $a + 5 ;

위 두 문장은 같은 식이다. 복합 대입 연산자는 산술 연산자와 문자열 연결 연산자와 함께

쓸 수 있다.

복합 대입 연산자의 목록은 [표 1.2]에 나와 있다.

6 8PART I PHP 사 용 하 기

[표 1.2] PHP 복합 대입 연산자

연 산 자 사 용 법 동 일 식

+=

-=

*=

/=

%=

.=

$a += $b

$a -= $b

$a *= $b

$a /= $b

$a %= $b

$a .= $b

$a = $a + $b

$a = $a - $b

$a = $a * $b

$a = $a / $b

$a = $a %$b

$a = $a . $b

전·후 증가와 감소 연산자

전·후증가(++)와 감소(- - ) 연산자는 += 와 - = 연산자와비슷하지만조금다른 면이있다.

증가 연산자는 값을 증가시킨 후 변수에 대입한다.

$a = 4;echo ++$a ;

두 번째 것은 변수 앞에 ++ 를 쓰는 전 증가 연산자를 사용하였다. 그 결과 $a는 1만큼

증가하여 값이 5가 되어 5를 출력하게 된다.

하지만 $a 뒤에 ++ 를 쓰게 되면(후 증가 연산자) 결과가 조금 달라진다.

$a = 4;echo $a++;

이번 경우 일단 $a의 값을 출력한 후에 그 값을 증가시키게 된다. 출력되는 값은 4이겠지만

그 다음 줄부터 $a의 값은 5가 된다.

- - 연산자도 ++ 연산자와 비슷한 역할을 하지만 - - 는 값을 1만큼 감소시킨다.

참조 연산자

PHP 4에는 대입 연산자와 결합해서 쓸 수 있는 참조 연산자인 &가 추가되었다. 한 변수

값을 다른 변수에 대입하면 첫 번째 변수의 값을 복사하여 메모리 어딘가에 저장한다.

$a = 5;$b = $a;

9Chapter 1 PHP 훑 어 보 기

이렇게 하면 $a의 값을 복사하여 $b에 저장하게 된다. 만약 $a의 값이 변경되어도 $b의 값

에는 전혀 영향을 미치지 않는다.

$a = 7; / / $b는여전히 5이다.

이때 & 연산자를 사용하면 좀 다른 결과를 가져온다.

$a = 5;$b = &$a ;$a = 7; / / $a와 $b 모두 7이다.

비교 연산자

두 값을 비교하는 연산자가 비교 연산자이다. 비교 연산자는 두 값을 비교해서 t r ue나

f al se의 값을 리턴한다.

등위 연산자

등위 연산자 == 는 두 값이 같은지 비교할 때 사용한다.

$a == $b

위 식은 $a와 $b의값이같은지비교한다. 만약같다면 t r ue를, 다르다면 f al se를 리턴한다.

등위 연산자는 대입 연산자인 = 와 혼동하기 쉬운데다 바꿔 써도 대부분 0이 아닌 값은

t r ue로, 0이면 f al se로 인식한다. 따라서 다음과 같이 한 후 $a = $b로 연산을 하면 t r ue

가 리턴된다.

$a = 5;$b = 7;

왜냐하면 $a = $b의 리턴값은 대입 연산자에서 설명했듯이 왼쪽에 대입되는 값이 7로서 0이

아니기 때문에 t r ue로 인식한다. 만약 $a == $b였다면 f al se가 리턴되었을 것이다. 이러한

에러는 문법상으로는 잘못이 없기 때문에 매우 고치기 힘들다. 따라서 대입 연산자와 등위

연산자를 사용할 때는 항상 주의를 기울여야 한다.

기타 비교 연산자

PHP에서 사용할 수 있는 등위 연산자 이외에 여러 가지 비교 연산자를 살펴보자. [표 1.3]에

사용 가능한 비교 연산자가 모두 나와 있다.

70PART I PHP 사 용 하 기

PHP 4에는 새로 identical 연산자( === )가 추가되었는데, 이것은 두 피연산자의 값이 같고

같은 형을 가질 때에만 t r ue를 리턴한다.

[표 1.3] PHP 비교 연산자

연 산 자 이 름 사 용 법

==

===

!=

<>

<

>

<=

>=

등위

identical

같지 않다

같지 않다

작다

크다

같거나작다

같거나크다

$a == $b

$a === $b

$a != $b

$a <> $b

$a < $b

$a > $b

$a <= $b

$a >= $b

논리 연산자

논리 연산자들은 논리적 조건들을 연결하는 데 쓰인다. 예를 들어, 만약 $a의 값이 0과 100

사이에 있는지 알아보고자 한다. 이럴 때는 $a >=0과 $a <=100을 AND 연산자로 연결해서

사용할 수 있다.

$a >= 0 &&$a <=100

PHP에서 사용할 수 있는 논리 연산자에는 AND, OR, XOR(exclusive or), NOT이 있다.

[표 1.4] PHP 논리 연산자

연 산 자 이 름 사 용 법 결 과

!

&&

| |

and

or

NOT

AND

OR

AND

OR

!$b

$a &&$b

$a | | $b

$a and $b

$a or $b

$b가 fal se이면 t rue를리턴한다.

$a와 $b 모두 t rue여야 t rue를 리턴한다.

$a와 $b 중하나라도 t rue이면 t rue를 리턴한다.

&&와 같다.

| |와 같다.

and와 or 연산자는 &&와 | | 연산자보다 우선순위가 낮다. 우선순위에 대해서는 뒤에서

알아보기로 하자.

7 1Chapter 1 PHP 훑 어 보 기

비트 연산자

비트 연산자를 사용하면 정수를 비트들의 나열로 처리할 수 있다.

PHP에서는 별로 사용할 일이 없긴 하지만 [표 1.5]에 비트 연산자를 나열해 보았다.

[표 1.5] PHP 비트 연산자

연 산 자 이 름 사 용 법 결 과

&

|

~

^

<<

>>

비트 단위 AND

비트 단위 OR

비트 단위 NOT

비트 단위 XOR

왼쪽 시프트

오른쪽 시프트

$a &$b

$a | $b

~$a

$a ^ $b

$a << $b

$a >> $b

$a와 $b 모두 1인비트만 1 바꾼다.

$a와 $b 중하나라도 1인비트를 1 바꾼다.

$a의 0인비트를 1로, 1인비트를 0으로 바꾼다.

$a와 $b 중하나만 1인비트를 1로바꾼다.

$a의 비트를 $b 값만큼 왼쪽으로옮긴다.

$a의 비트를 $b 값만큼오른쪽으로옮긴다.

기타 연산자

위에서 언급한 연산자 이외에도 다른 연산자들이 더 있다.

쉼표 연산자 , 는 함수 인자와 같이 상품들을 열거할 때 사용된다.

new와 - > 는 클래스를 새로 생성하거나, 클래스의 멤버에 접근할 때 사용되는데, 이것은

6장에서 자세히 알아볼 것이다.

배열 요소 연산자인 [] 는 배열의 요소에 접근할 때 사용된다. 어떤 배열에서는 => 연산

자도 사용하는데, 3장에서 알아보기로 하자.

이제 삼항 연산자(ternary operator)에 대해서 알아보자.

삼항 연산자

? : 이라는 연산자는 C 언어에서의 사용 방법과 같다.

조건 ? 참일때의값 : 거짓이었을 때의값

삼항 연산자는 i f - el se 문과 비슷한데, 좀 복잡하므로 예를 통해 알아보자.

($gr ade > 50 ? ' Pas s ed ' : ' Fai l ed ' ) ;

2PART I PHP 사 용 하 기

이 표현식은 만약 $gr ade의 값이 50을 넘지 않으면 Fai l ed'라는 값을 리턴한다.

에러 억제 연산자

에러 억제 연산자(error suppression operator) @ 는 어떠한 표현식 앞에서도 쓸 수 있다. 예

를 들어보자.

$a = @(57/ 0) ;

@ 가 없다면 위 문장은 0으로 나누기 에 의한 에러가 발생하지만 @를 앞에 써주면 에러

는 무시되고 넘어간다.

만약 에러를이런방식으로 억제한다면 에러를처리하는코드를작성해야 한다. 만약 PHP에서

t r ack_er r or s를 설정해 놓았다면 에러 메시지를 전역 변수인 $php_er r ormsg에 저장한다.

실행 연산자

실행 연산자(execution operator)는 ` 와 ` 로 이루어진 한 쌍의 연산자로 ` 는 작은따옴표

( ')와 다른 기호로 키보드에서는 ~' 아래에 있다.

PHP에서 서버의 커맨드라인에서 실행하고 싶은 것이 있다면 ` ` 사이에 명령어를 쓰면 된

다. 그러면 ` `의 결과값이 표현식의 리턴값이 된다.

유닉스와 같은 환경이라면 다음과 같이 입력해보자.

$out = `l s - l a ` ;echo ' <pr e>' . $out . ' </ pr e> ' ;

혹은 윈도우즈 서버를 사용하고 있다면 다음과 같이 해보자.

$out = `di r c : ` ;echo ' <pr e>' . $out . ' </ pr e> ' ;

그러면 C 디렉토리의 파일 리스트가 화면에 보이게 된다.

연산자 사용하기 : 폼에서 받은 값 처리하기

이제 PHP 연산자를 어떻게 사용하는지 알았으므로 Bob의 주문 폼을 가지고 총합과 세금을

계산해보자.

73Chapter 1 PHP 훑 어 보 기

일단 다음 코드를 PHP 스크립트의 아래쪽에 덧붙여보자.

$t ot al qt y = 0;$t ot al qt y = $t i r eqt y + $oi l qt y + $spar kqt y;echo ' I t ems or der ed : ' . $t ot al qt y . ' <br / > ' ;

$t ot al amount = 0. 00;

def i ne ( ' TI REPRI CE' , 100) ;def i ne ( ' OI LPRI CE' , 10) ;def i ne ( ' SPARKPRI CE' , 4) ;

$t ot al amount = $t i r eqt y * TI REPRI CE+ $oi l qt y * OI LPRI CE+ $spar kqt y * SPARKPRI CE;

echo ' Subt ot al : $ ' . number_ f or mat ($t ot al amount , 3) . ' <br / > ' ;

$t axr at e = 0. 10; / / 세금이 10%이다.$t ot al amount = $t ot al amount * (1 + $t axr at e ) ;echo ' Tot al i ncl udi ng t ax : $ ' . number_ f or mat ($t ot al amount , 2) . ' <br / > ' ;

브라우저에서 새로고침을 눌러보자. [그림 1.5]와 비슷한 결과가 나왔을 것이다.

[그 림 1.5] 고객 주문의 총합을 계산하여 화면에 출력한다.

74PART I PHP 사 용 하 기

이번에 덧붙인 코드에는 여러 가지 연산자를 사용하였다. + 와 * 연산자를 사용해서 총합

을 구하였고 . 를 사용하여 출력할 형태를 정하였다.

그리고 number_ format () 함수를 사용하여 총합을 소수점 이하 두 자리 숫자로 표현하여

보았다. 이 함수는 PHP의 Mat h 라이브러리에 포함되어 있다.

계산 과정을 자세히 보면 우리가 알고 있는 상식적인 순서대로 계산이 되어 있다는 것을

알 수 있다.

$t ot al amount = $t i r eqt y * TI REPRI CE+ $oi l qt y * OI LPRI CE+ $spar kqt y * SPARKPRI CE;

총 가격은 제대로 나온 것 같은데 어떻게 곱셈이 덧셈보다 먼저 계산되었는지 궁금하지 않

은가? 그 이유는 연산자마다 우선순위가 있기 때문이다.

우선순위와 결합 순서 : 수식 처리

연산자들은 계산되는 순서를 지정한 우선순위(precedence)를 가지고 있다.

또한 연산자들이 같은 우선순위일 때 오른쪽이 먼저 계산될 것인지 왼쪽이 먼저 계산될 것

인지를 결정하는 결합 순서(associativity)라는 것도 가지고 있다.

[표 1.6]에 연산자의 우선순위와 결합 순서가 나와 있다.

이 표는 맨 위에 가장 낮은 우선순위 연산자부터 해서 아래로 갈수록 우선순위가 높아진다.

[표 1.6] 연산자 우선순위

결 합 순 서 연 산 자

왼쪽

왼쪽

왼쪽

왼쪽

오른쪽

왼쪽

왼쪽

,

or

xor

and

pr i nt

= += - = *= / = .= %= &= |= ^= ~= <<= >>=

? :

▶ 다음 페이지에 계속

75Chapter 1 PHP 훑 어 보 기

[표 1.6] 연산자 우선순위

결 합 순 서 연 산 자

왼쪽

왼쪽

왼쪽

왼쪽

왼쪽

없음

없음

왼쪽

왼쪽

왼쪽

오른쪽

오른쪽

없음

없음

| |

&&

|

^

&

== != ===

< <= > >=

<< >>

+ - .

* / %

! ~ ++ - - (i nt ) (doubl e ) (st r i ng ) (ar r ay ) (obj ect ) @

[]

new

()

지금까지 우선순위가 제일 높은 연산자를 언급한 적은 없지만 (, )라는 것을 잘 알고 있을

것이다. (, )의 사용법은 수학에서 사용하는 방법과 같다.

예제의 마지막 부분을 다시 떠올려보자.

$t ot al amount = $t ot al amount * (1 + $t axr at e ) ;

위 식에서 괄호를 제거해보자.

$t ot al amount = $t ot al amount * 1 + $t axr at e ;

위 식을 계산하면 곱셈 연산자가 덧셈 연산자보다 더 높은 우선순위를 가지므로 먼저 계산

되어 원하는 값과 다른 값이 나온다. 이때 괄호를 사용하면 1+$t axr at e를 먼저 계산할 수

있다.

변수와 관련된 함수

변수와 연산자에 대한 설명을 마치기 전에 PHP에서 사용할 수 있는 변수와 관련된 함수들

을살펴보자. 이함수들을사용하면변수들을여러가지방법으로바꾸거나검사해볼수있다.

76PART I PHP 사 용 하 기

변수형 검사 및 설정

가장 널리 쓰이는 함수는 get t ype ()과 set t ype ()으로 이 함수들의 프로토타입을 알아보

자(프로토타입은 어떤 형의 인자를 받아들여서 어떤 형의 데이터를 리턴하는지 알려준다).

s t r i ng get t ype (mi xed var ) ;bool s et t ype (mi xed var , st r i ng t ype ) ;

get t ype ()에 어떤 변수를 넘겨주면 get t ype ()은 그 변수의 형을 알아내어 형 이름을 포함

한 unknown t ype 과 같은 문자열을 리턴한다. 리턴하는 값에는 i nt eger , doubl e ,

st r i ng , ar r ay , obj ect 등이 있다.

set t ype ()을 사용할 때는 변수와 바꾸고 싶은 형을 문자열로 넘겨주어야 한다.

$a = 56;echo get t ype ($a ) . ' <br / > ' ;s et t ype ($a , ' doubl e ' ) ;echo get t ype ($a ) . ' <br / > ' ;

get t ype ()이 처음 호출되었을 때 $a는 정수형이었지만 set t ype ()이 호출된 뒤에는 실수

형으로 바뀌었다.

PHP는 그 외에도 여러 가지 형 검사 함수를 제공하고 있는데, 변수를 인자로 받아들여

t r ue나 f al se를 리턴한다.

i s_ar r ay ()

i s_doubl e (), i s_ f l oat (), i s_ r eal () (모두 같은 함수)

i s_l ong (), i s_i nt (), i s_i nt eger () (모두 같은 함수)

i s_ st r i ng ()

i s_obj ect ()

변수 상태 검사

PHP에서 변수의 상태를 검사하는 방법은 여러 가지가 있다.

맨 먼저 i s set ()의 프로토타입을 알아보자.

bool ean i s set (mi xed var ) ;

7Chapter 1 PHP 훑 어 보 기

이 함수는 변수의 이름을 인자로 받아서 만약 이 변수가 존재한다면 t r ue를, 아니면 f al se

를 리턴한다.

만약 어떤 변수를 삭제하고 싶다면 unset ()이라는 함수를 사용하면 된다.

voi d uns et (mi xed var ) ;

unset ()을 사용하면 인자로 받은 변수의 존재 자체를 없애고 t r ue를 리턴한다.

마지막으로 empt y ()라는 함수가 있는데, 이 함수는 변수가 존재하고, 비어 있지 않으며, 0

이 아닌 값을 가지고 있다면 t r ue를 리턴하고, 아니면 f al se를 리턴한다.

bool ean empt y (mi xed var ) ;

자, 이제 이 함수들을 사용해보자.

스크립트에 다음과 같은 코드를 잠시 덧붙여보자.

echo i ss et ($t i r eqt y) ;echo i ss et ($not her e) ;echo empt y ($t i r eqt y) ;echo empt y ($not her e) ;

그런 다음 브라우저에서 새로고침 을 누르고 결과를 살펴보자.

$t i r eqt y 안에 값이 있든 없든 간에 i s set ()은 t r ue를 리턴하겠지만, 만약 필드에 어떤

값을 넣느냐에 따라 empt y ()의 리턴값은 달라진다.

$not her e는 없는 변수이기 때문에 i s set ()이 f al se를 리턴하겠지만 empt y ()는 t r ue를

리턴한다.

이런 함수들을 사용하면 사용자가 입력해야 하는 필드들을 검사할 수 있다.

변수형 변환

함수를 사용하여 변수를 형 변환(type casting) 을 해보자. 세 가지 형 변환 함수가 있다.

i nt i nt val (mi xed var ) ;f l oat doubl eval (mi xed var ) ;s t r i ng s t rval (mi xed var ) ;

8PART I PHP 사 용 하 기

이 함수들은 인자로 받은 변수의 값을 적절한 형으로 변환해서 리턴한다.

mi xed라는 데이터형은 특정 데이터형이 아니라 여러 가지 데이터형을 인자로 받아들일 수

있다는 뜻이다. 인자로 여러 가지 형을 받을 수 있다면 mi xed 형이다.

제어 구조

프로그램이나 스크립트에서 실행되는 순서를 다룰 수 있게 하는 구조를 제어 구조라고 한

다. 제어 구조는 조건 구조(br anchi ng)와 반복 구조 혹은 루프로 나눌 수 있다. 그 각각을

살펴보기로 하자.

조건식 만들기

사용자의 입력에 민감하게 반응하려면 스크립트가 어떤 상황에 대한 결정을 내릴 수 있어야

한다. 결정을 내릴 수 있는 방법을 조건 이라고 부르자.

if 문

조건문으로 i f 문을 사용할 수 있다. i f 문을 사용하기 위해서는 조건을 주어야 하는데, 만

약 그 조건이 t r ue라면 i f 문에 뒤따르는 코드들이 수행된다.

예를 들어, 사용자가 타이어와 기름, 스파크 플러그를 주문하지 않았다면 아마도 사용자가

실수로 확인 버튼을 누른 것이라고 생각할 수 있다. 그럴 경우 주문이 처리중입니다 라는

것보다 다른 메시지를 내보내는 것이 더 좋은 생각이다.

만약 사용자가 아무 것도 사지 않았다면 이전 페이지에서 아무 것도 안 사셨군요! 라고 말

하고 싶을 것이다. 이것을 i f 문을 사용해서 구현해보자.

i f ( $t ot al qt y == 0 )echo ' You di d not or der anyt hi ng on t he pr evi ous page !<br / >' ;

조건으로 사용한 것은 $t ot al qt y == 0이다. 여기서 등위 연산자가 대입 연산자와 다르다는

것을 다시 한 번 기억해두자.

만약 $t ot al qt y ==0이 t r ue이면 $t ot al qt y가 0이라는 것이다. 만약 $t ot al qt y가 0이 아

니라면 조건은 f al se가 된다. 만약 조건이 t r ue이면 echo 문이 실행된다.

79Chapter 1 PHP 훑 어 보 기

코드 블록

i f 문과 같은 조건문 다음에 실행할 코드가 여러 문장이 될 수도 있다. 이럴 경우 또 i f

문을 쓰는 대신에 여러 문장을 블록으로 묶어서 사용한다. 블록으로 묶을 문장들을 {, }로

감싸준다.

i f ( $t ot al qt y == 0 ){

echo ' <f ont col or =r ed>' ;echo ' You di d not or der anyt hi ng on t he pr evi ous page !<br / >' ;echo ' </ f ont >' ;

}

세 문장이 {, }로 묶여 한 블록의 코드가 되었다. 만약 조건이 t r ue이면 세 문장 모두 실행

되고 f al se라면 당연히 세 문장 모두 실행되지 않는다.

이미말했듯이 PHP는여러분이어떻게코드를작성하든신경쓰지않지만그래도가독성을높이려면코드

에들여쓰기를하는것이좋다. 들여쓰기를하면 i f 조건이맞을경우어떤코드가실행되는지한눈에알아

볼 수 있다. 앞 예제에서는 블록 안의 문장을 들여쓰기 하였다.

else 문

조건이 맞을 때에만 실행하는 것이 아니라 여러 가지 코드를 상황에 따라 골라서 실행하고

싶은 경우가 있다.

el se 문을 사용하면 i f 문이 f al se가되었을 때 실행할 코드를 정의할 수 있다. 만약 Bob의

고객이 아무 것도 사지 않았다면 그에 대해 경고하는 메시지를 보내고 싶다고 하자. 그 경우

고객이 주문을 했다면 경고 대신에 고객이 주문한 물품을 보여주자.

다음과 같이 코드를 수정하면 경고나 주문 물품을 보여줄 수 있다.

i f ( $t ot al qt y == 0 ){

echo ' You di d not or der anyt hi ng on t he pr evi ous page !<br / >' ;}el s e{

echo $t i r eqt y . ' t i r es<br / >' ;echo $oi l qt y . ' bot t l es of oi l <br / >' ;echo $spar kqt y . ' spar k pl ugs<br / > ' ;

}

8 0PART I PHP 사 용 하 기

i f 문 안에 i f 문을 다시 사용한다면 좀더 복잡한 상황도 처리할 수 있다. 코드를 다음과

같이 작성하면 주문한 물품에 대해서만 몇 개를 샀는지 화면에 표시해준다.

i f ( $t ot al qt y == 0){

echo ' You di d not or der anyt hi ng on t he pr evi ous page !<br / >' ;}el s e{

i f ( $t i r eqt y>0 )echo $t i r eqt y . ' t i r es<br / > ' ;

i f ( $oi l qt y>0 )echo $oi l qt y . ' bot t l es of oi l <br / > ' ;

i f ( $spar kqt y>0 )echo $spar kqt y . ' spar k pl ugs<br / > ' ;

}

e lseif 문

두 개 이상의 결정을 내려야 할 때도 있다. 이때는 el sei f 문을 사용해서 각각의 상황을

처리할 수 있다. 프로그램이 나열된 조건문을 차근차근 읽어가면서 조건이 t r ue가 되면 그

조건에 맞는 코드를 수행한다.

타이어를 많이 사는 사람에게 할인 혜택을 준다고 하자. 그 할인율은 다음과 같다.

10개 이하 - 할인율 0%

10~49개 - 5%

50~99개 - 10%

100개 이상 - 15%

i f와 el si e f 문을사용하여 위의 할인율에 맞게 코드를 만들어보자. 두 개의 조건을 연결하

기 위해서 AND 연산자(&&)를 사용한다.

i f ( $t i r eqt y < 10 )$di s count = 0;

el s ei f ( $t i r eqt y >= 10 && $t i r eqt y <= 49 )$di s count = 5;

el s ei f ( $t i r eqt y >= 50 && $t i r eqt y <= 99 )$di s count = 10;

el s ei f ( $t i r eqt y >= 100 )$di s count = 15;

8 1Chapter 1 PHP 훑 어 보 기

el sei f는 el se i f와 같다.

el se i f 문을 연속해서 사용할 때에는 연속된 i f 문 중에서 하나만 실행된다는 데 주의하

자. 위의 예제는 어떤 상황에서도 한 조건만이 t r ue가되기 때문에 상관없지만, 만약 조건문

두 개가 동시에 t r ue가될 수 있다면 그 중에서 먼저 검사되는 조건문의 코드만이 실행된다.

switch 문

swi t ch 문은 i f 문과 비슷한 방식으로 사용할 수 있지만 조건문에 한 가지 값 이상을 받아

들일 수 있다. i f 문에서는 조건이 t r ue가 아니면 f al se였지만, swi t ch 문에서는 조건이

간단한 형(정수형, 실수형, 문자열)으로만 바뀔 수 있다면 어떤 형태의 값이어도 된다. 각각

의 조건에 대한 처리는 case 문에서 수행되며 어떤 case 문에서도맞지 않은 값을 처리하기

위해서 de faul t case 문을 두는 경우도 있다.

Bob이 만약 어떤 방법으로 광고를 하는 것이 좋을지 알고 싶다면 주문 폼에 다음과 같은

코드를 추가시켜 알아볼 수도 있다.

<t r ><t d>How di d you f i nd Bob ' s</ t d><t d><s el ect name="f i nd">

<opt i on val ue = "a">I ' m a r egul ar cus t omer<opt i on val ue = "b">TV adver t i s i ng<opt i on val ue = "c">Phone di r ect or y<opt i on val ue = "d">Wor d of mout h

</ s el ect ></ t d>

</ t r >

[그 림 1.6] Bob s Auto Part를 어떻게 알게 되었는지 묻는 주문 폼

2PART I PHP 사 용 하 기

HTML 코드에 a , b , c , d 값을 갖는 폼 변수를 추가하였다. 새 변수를 사용하기 위

해서 i f와 el se i f 문을 사용해보자.

i f ($f i nd == ' a ' )echo ' <p>Regul ar cus t omer . </ p> ' ;

el s ei f ($f i nd == ' b ' )echo ' <p>Cust omer r ef er r ed by TV adver t . </ p> ' ;

el s ei f ($f i nd == ' c ' )echo ' <p>Cust omer r ef er r ed by phone di r ect or y . </ p> ' ;

el s ei f ($f i nd == ' d ' )echo ' <p>Cust omer r ef er r ed by wor d of mout h .</ p> ' ;

swi t ch 문으로도 똑같이 해보자.

swi t ch ($f i nd){

cas e ' a ' :echo ' <p>Regul ar cus t omer . </ p> ' ;br eak;

cas e ' b ' :echo ' <p>Cust omer r ef er r ed by TV adver t . </ p> ' ;br eak;

cas e ' c ' :echo ' <p>Cust omer r ef er r ed by phone di r ect or y . </ p> ' ;br eak;

cas e ' d ' :echo ' <p>Cust omer r ef er r ed by wor d of mout h .</ p> ' ;br eak;

def aul t :echo ' <p>We do not know how t hi s cus t omer found us . </ p>' ;br eak;

}

swi t ch 문은 i f와 el se i f 문과는 조금 다른 방식으로 실행된다. i f 문은 단 하나의 코드

블록만을 실행하지만 swi t ch 문 내의 case 문이 실행되면 br eak 문이 나오기 전의 문장들

을 모두 실행한다. br eak 문을 사용하지 않으면 case 문이 t r ue가 될 때부터 모든 코드를

실행한다. br eak 문이 나오게 되면 swi t ch 블록 밖의 코드로 이동하게 된다.

조건문 비교하기

조건문에 익숙하지 않으면 뭐가 제일 좋은 거야 하고 불평하게 된다.

8 3Chapter 1 PHP 훑 어 보 기

항상 좋은 조건문이란 없다. el se, el sei f, swi t ch 문을 써서 만들 수 있는 조건문이라면

if문을 여러 개 써서 만들 수도 있다. 상황에 맞춰 가장 적절하다고 생각하는 조건문을 사용

하자. 경험이 늘면 어떤 것을 사용해야 할 지 잘 알 수 있게 된다.

반복문

컴퓨터는 인간과 달리 단순하고 반복적인 일을 즐기기 때문에 프로그램에서 똑같은 일을

여러 번 해야 할 때 반복문(루프문)을 사용하는 것이 좋다.

주문 배송에 드는 배송비도 같이 보여주자. 배달해야 하는 거리에 따라 배송비가 비례한다

는 것을 간단한 식을 사용해서 보여주도록 하자.

[그림 1.7]과 같은 배송비 표를 만들어보자.

[그 림 1.7] 거리에 따른 배송비를 나타내는 표

[리스트 1.2]가 이 표의 HTML인데 꽤 길고 반복되는 부분이 많다.

[리스트 1.2] f rei ght .ht ml - 배송비

<ht ml ><body><t abl e bor der="0" cel l paddi ng="3"><t r >

<t d bgcol or ="#CCCCCC" al i gn="cent er ">Di st ance</ t d><t d bgcol or ="#CCCCCC" al i gn="cent er ">Cost </ t d>

</ t r >

8 4PART I PHP 사 용 하 기

<t r ><t d al i gn="r i ght ">50</ t d><t d al i gn="r i ght ">5</ t d>

</ t r ><t r >

<t d al i gn="r i ght ">100</ t d><t d al i gn="r i ght ">10</ t d>

</ t r ><t r >

<t d al i gn="r i ght ">150</ t d><t d al i gn="r i ght ">15</ t d>

</ t r ><t r >

<t d al i gn="r i ght ">200</ t d><t d al i gn="r i ght ">20</ t d>

</ t r ><t r >

<t d al i gn="r i ght ">250</ t d><t d al i gn="r i ght ">25</ t d>

</ t r ></ t abl e></ body></ ht ml >

이 코드를 컴퓨터에서 작성해보자. 반복문을 사용하면 한 문장이나 블록을 반복해서 실행시

킬 수 있다.

while 문

PHP에서 whi l e 문이 가장 간단한 루프로 i f 문처럼 조건문을 사용한다. whi l e 문은 i f 문

과 달리 whi l e의 조건문이 t r ue인 동안 반복 실행된다.

whi l e 문은 조건문이 언제쯤 f al se가 될지 확실히 알 수 없을 때에 주로 사용하며 일정하

게 반복된다면 for 문을 주로 사용한다.

whi l e 문의 기본 구조는 다음과 같다.

whi l e ( condi t i on ) expr ess i on;

whi l e 문을 사용하여 1에서부터 5까지 화면에 출력해보자.

5Chapter 1 PHP 훑 어 보 기

$num = 1;whi l e ($num <= 5 ){

echo $num. "<br / >" ;$num++;

}

매반복마다조건문을검사하여 f al se이면 whi l e 블록은 수행되지 않고 루프를 빠져나간다.

whi l e 문으로 [그림 1.7]과 같은 배송비 표를 만들어보자.

[리스트 1. 3] f rei ght .php - PHP로 Bob의 배송비표 만들기

<body><t abl e bor der="0" cel l paddi ng="3"><t r >

<t d bgcol or ="#CCCCCC" al i gn="cent er ">Di st ance</ t d><t d bgcol or ="#CCCCCC" al i gn="cent er ">Cost </ t d>

</ t r ><?$di s t ance = 50;whi l e ($di s t ance <= 250 ){

echo "<t r >\ n <t d al i gn"="r i ght ">$di s t ance</ t d>\ n" ;echo " <t d al i gn="r i ght ">" . $di s t ance / 10 . "</ t d>\ n</ t r >\ n";$di s t ance += 50;

}?></ t abl e></ body></ ht ml >

스크립트가 만드는 HTML의 가독성을 높이기 위해서 줄바꿈 문자와 공백을 넣어주는 것이

좋다. 앞에서도 말했지만 브라우저는 공백을 무시하지만 사람들이 읽는 데는 중요한 요소

이다.

[리스트 1.3]을 보면 문자열 내에 줄바꿈 문자(\ n)가 있다. 만약 큰따옴표(") 문자열 내에 줄

바꿈 문자가 있다면 HTML에서 <br >로 바뀐다.

8 6PART I PHP 사 용 하 기

for와 foreach 루프

whi l e 문을 사용할 때 카운터를 쓴다면 for 문을 사용하여 깔끔하게 구현해보자.

f or 문의 기본 구조는 다음과 같다.

f or ( expr ess i on1; condi t i on ; expr es s i on2)expr es s i on3;

exp r es s i on1은 시작할 때 한 번 실행된다. 여기서 카운터의 초기값을 설정해줄

수 있다.

condi t i on은 반복을 하기 전에 검사하며 조건이 f al se를 리턴하면 루프를 빠져

나간다.

exp r es s i on2는 매 반복의 마지막에 실행되는데 여기서 카운터의 값을 조정한다.

exp r ess i on3은 반복해서 실행할 코드 부분이다. 이 표현식은 코드 블록으로 이

루어진다.

[리스트 1.3]에서 whi l e을 사용했던 부분을 f or 문으로 바꾸어보자.

<?f or ($di st ance = 50; $di s t ance <= 250; $di s t ance += 50){

echo "<t r >\ n <t d al i gn= ' r i ght ' >$di st ance</ t d>\ n" ;echo " <t d al i gn= ' r i ght ' >" . $di st ance / 10 . "</ t d>\ n</ t r >\ n";

}?>

whi l e 문을 사용하든 for 문을 사용하든 하는 일은 동일하지만 for 문을 사용하는 것이 좀

더 깔끔해 보인다.

덧붙여서 for 문에서 var i abl e var i abl e 5를 사용하여 폼 필드를 사용할 수도 있다. 예를

들어, 폼 필드의 이름을 name1, name2, name3과 같은 방식으로 정했다고 해보자.

f or ($i =1; $i <= $numnames ; $i ++){

$t emp= "name$i " ;echo $$t emp . ' <br / >' ; / / 혹은실행하고싶은코드를작성한다.

}

8 7Chapter 1 PHP 훑 어 보 기

변수의 이름을 동적으로 생성해서 순서대로 폼 필드를 사용할 수 있다.

f or each 문은 for 문을 조금 바꾸어서 배열을 사용하기 쉽게 만든 것인데 지금은 그냥 넘

어가고 3장에서 자세히 알아보자.

do..while 문

do . . .whi l e 문은 다른 루프와 조금 다르다. 먼저 기본 구조를 살펴보자.

doexpr es s i on ;

whi l e ( condi t i on ) ;

do . . .whi l e 문은 whi l e 문과 달리 조건을 마지막에 검사한다. 따라서 do . . .whi l e 문에서

는 블록이 적어도 한 번은 실행된다.

설사 조건이 절대 t r ue가 될 수 없다 하더라도 조건을 마지막에 검사하기 때문에 블록을

한 번은 실행하게 된다.

$num = 100;do{

echo $num. ' <br / > ' ;}whi l e ($num < 1 ) ;

제어 구조와 스크립트 빠져나가기

코드를 빠져나가고 싶을 때에는 세 가지 방법을 사용할 수 있다.

만약에 루프를 빠져나가고 싶다면 swi t ch 문에서 언급한 br eak 문을 사용할 수 있다.

br eak 문을 루프에서 사용하면 스크립트는 루프를 빠져나와 루프 다음에 있는 문장을 실행

한다.

만약에 지금루프를끝내고다음 번루프로넘어가고 싶다면 cont i nue 문을사용할 수 있다.

아예 PHP 스크립트를 끝내고 싶다면 exi t 문을 사용할 수 있다. exi t 문을 사용해서 오류

를 검사해볼 수 있다. 앞 예제에 exi t 문을 추가해보자.

8 8PART I PHP 사 용 하 기

i f ( $t ot al qt y == 0){

echo ' You di d not or der anyt hi ng on t he pr evi ous page !<br / >' ;exi t ;

}

exi t 문을 호출하는 순간 PHP를 완전히 끝내게 된다.

다음 장에서는 : 고객 주문 저장하기

이제 고객의 주문을 받아서 사용하는 법을 알았으므로 다음 장에서는 주문을 어떻게 저장하

고 어떻게 저장한 값을 불러와서 사용하는지 알아보자.