92

PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

  • View
    257

  • Download
    1

Embed Size (px)

DESCRIPTION

래리 울만 지음 | 정성철 옮김 | 오픈소스 & 웹 시리즈_020 | ISBN: 9788992939461 | 28,000원 | 2010년 05월 28일 발행 | 648쪽

Citation preview

Page 1: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기
Page 2: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 6 & MySQL 5다이내믹한 웹사이트 만들기

Page 3: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

iv

고 마 운 분 들

항상 그렇듯이 Peachpit 출판사의 모든 분들에게 진심 어린 감사를 전한다.

일을 정말 쉽게 만들어주는 비범한 편집자 레베카 갈릭에게 감사드린다. 너무나 열심히 일하고 유용한 제안들과

세세하고 인상적인 배려를 해 준 밥 캠벨에게 감사드린다. 인덱스를 만들어준 레베카 풀런켓, 마리나 발라딕, 제리

벨로우에게 감사드리고, 책의 레이아웃을 만들어준 릭 고든에게도 감사드리며, 기술적인 리뷰를 도와준 아파드

레이에게 감사를 전한다.

PHP와 MySQL, Apache, phpMyAdmin, XAMPP를 포함한 다른 훌륭한 프로젝트에서 일하는 모든 분들에게

영광을 돌리고 싶다. 또한 필요할 때마다 지원과 조언을 아끼지 않았던 다양한 뉴스그룹과 메일링 리스트, 지원 포

럼의 관계자 분들에게 따뜻한 응원을 보낸다.

항상 그렇듯이 내 일의 진정한 가치를 만들어주는 독자들에게 진심으로 감사를 드린다. 15장에서의 번역을 제공

해준 분들과 이번 판에 다루어졌으면 하는 내용을 제안해준 분들에게도 특별한 감사를 전한다.

책을 쓰는 동안 아이들을 돌봐준 니콜과 크리스티나에게 감사한다. 이들 덕분에 일을 무사히 끝마칠 수 있었다.

마지막으로, 사랑하는 아내 제시카의 애정 어린 지원이 없었다면 이 한 권의 책은 결코 완성되지 못했을 것이다.

그리고 내가 책을 쓰는 이유이기도 하고 책을 쓰지 못하는 이유이기도 한 샘과 조를 큰소리로 불러본다.

헌 정

이 책을 나의 모교인 북동부 미주리 주립 대학의 훌륭한 동지들에게 바친다. 특히 내가 친구라 불러 마지 않는 모

니카 배런 박사, 데니스 레이븐 박사, 에드 테일러 박사, 콜 우드콕 박사에게 감사하고 싶다. 이들의 아량과 애정이

넘치는 훌륭한 가르침이 없었다면 나는 한 사람의 작가나 학생, 교육자는 물론이고 한 사람의 인간으로서도 마땅

히 설 수 없었을 것이다.

Page 4: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

v

옮긴이

PHP와 MySQL의 조합은 가볍고 역동적인 WEB 2.0의 파고에서도 당당한 주역이었으며, 이미 오래 전부터 세계

적인 규모의 프로젝트 내에서도 하나의 축으로서 든든하게 자리매김하고 있습니다. 이러한 인기에 부응하여 수

많은 입문서가 출간되어 있으며, 오히려 이점이 독자들이 적절한 입문서를 찾는데 더 어려움을 줍니다.

입문서의 특성상 같은 내용을 전개하더라도 책의 가치는 완전히 다릅니다. 초심자의 호흡에 맞춰 차근차근 이끌

어주는 PHP 6 and MySQL 5 for Dynamic Web Sites는 여러모로 완벽한 입문서 중 하나입니다.

이 책은 모든 페이지를 2개 단으로 나눠 적은 지면을 효율적으로 활용하고 있습니다. 이해를 돕는 많은 양의 소스

코드와 PHP 프로그래머가 알아야 할 방대한 종류의 기술을 거의 모두 다루면서도 그 내용이 부실하지 않은 이유

입니다.

또한 따라 하기가 무척 쉽습니다. 핵심적인 이론을 간략하게 정리한 후, 안내하는 단계를 하나씩 따라가기만 하면

완전하게 동작하는 작은 단위의 어플리케이션이 완성됩니다. 각 단계는 자세한 설명과 함께 주요한 소스코드가

꼼꼼히 제공되므로 실수하는 일 없이 정확한 실행결과를 확인할 수 있습니다.

모든 장이 기초부터 실제의 프로젝트로 이어지는 완벽한 하나의 흐름을 가지고 전개됩니다. 저자는 입문자의 학

습 패턴을 예상하여 알맞은 주제를 알맞은 시점에 소개합니다. 각각의 장은 앞 뒤 장과 자연스럽게 연계되어 더 큰

지식의 단위로 통합됩니다.

마지막으로, 이 책은 PHP 6를 표방하고 있습니다만, 유니코드 지원의 변화를 제외하면 입문 수준에서 PHP 6의

변화는 그리 주목할 대상이 아닙니다. 실제로 책에서도 국제화와 관련하여 강화된 유니코드 지원을 자세하게 설

명하고 있을 뿐입니다.

이 책은 프로그래밍 경험이 전혀 없는 독자가 보기에는 다소 어려울 수 있습니다. 그러나 다른 언어를 통해 프로그

래밍에 대한 감각이 있는 독자라면 더할 나위 없이 훌륭한 PHP 입문서가 될 것입니다.

Page 5: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

vi

·차 례·

헌 정 ....................................................................................................................iv

고 마 운 분 들 .....................................................................................................iv

도입 xi동적인 웹사이트란 무엇인가 ......................................................................... xii

준비물 ............................................................................................................ xviii

이 책에 대해서 ................................................................................................ xix

자매 사이트 ..................................................................................................... xxi

1장 PHP 입문 1기본 문법 .............................................................................................................2

웹 브라우저로 데이터 전송 ...............................................................................6

주석 작성하기 .................................................................................................. 10

변수란 무엇인가? ............................................................................................ 14

문자열 입문 ...................................................................................................... 18

문자열 연결하기 .............................................................................................. 21

숫자형 입문 ...................................................................................................... 23

상수 입문하기 .................................................................................................. 27

작은따옴표와 큰따옴표 .................................................................................. 30

2장 PHP 프로그래밍 33HTML 폼 만들기 ............................................................................................ 34

HTML 폼 처리하기 ........................................................................................ 38

조건절과 연산자 .............................................................................................. 42

폼 데이터 검증하기 ......................................................................................... 46

배열 입문 .......................................................................................................... 52

for와 while 루프 .............................................................................................. 70

Page 6: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

vii

3장 동적 웹사이트 개발 73파일 인클루드 .................................................................................................. 74

HTML 폼 다루기 2 ......................................................................................... 84

스티키 폼 만들기 ............................................................................................. 89

사용자 정의 함수 ............................................................................................. 92

4장 MySQL 입문 107데이터베이스 요소 이름 짓기 ...................................................................... 108

칼럼 타입 선택하기 ....................................................................................... 110

다른 칼럼 속성 선택하기 .............................................................................. 114

MySQL 접속 .................................................................................................. 116

5장 SQL 소개 123데이터베이스와 테이블 생성 ....................................................................... 124

레코드 저장하기 ............................................................................................ 127

데이터 검색하기 ............................................................................................ 131

조건절의 사용 ................................................................................................ 133

LIKE와 NOT LIKE의 사용 .......................................................................... 136

쿼리 결과 정렬하기 ....................................................................................... 138

쿼리 결과 제한하기 ....................................................................................... 140

자료 수정 ........................................................................................................ 142

데이터의 삭제 ................................................................................................ 144

함수의 사용 .................................................................................................... 146

6장 SQL과 MySQL 고급 157데이터베이스 설계 ........................................................................................ 158

조인 ................................................................................................................. 173

검색 결과 그룹화 ........................................................................................... 178

인덱스 만들기 ................................................................................................ 180

여러 타입의 테이블 사용하기 ...................................................................... 185

FULLTEXT 검색하기 ................................................................................... 188

트랜잭션 수행 ................................................................................................ 194

Page 7: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

viii

7장 에러 처리와 디버깅 199에러의 종류와 기본적인 디버깅 .................................................................. 200

PHP 에러 출력하기....................................................................................... 206

PHP 에러보고 레벨 조절하기 ...................................................................... 208

사용자 정의 에러 핸들러 만들기 ................................................................. 211

PHP 디버깅 테크닉....................................................................................... 216

SQL과 MySQL 디버깅 기법 ......................................................................... 220

8장 PHP와 MySQL 연동 223템플릿 수정 .................................................................................................... 224

MySQL에 접속하기 ...................................................................................... 226

쿼리 실행하기 ................................................................................................ 230

쿼리 결과 값 가져오기 .................................................................................. 239

안전한 SQL 보장하기 ................................................................................... 243

반환된 레코드 개수 세기 .............................................................................. 249

레코드 갱신 .................................................................................................... 251

9장 일반적인 프로그래밍 테크닉 259스크립트로 값 전달하기 ............................................................................... 260

히든 입력 폼 ................................................................................................... 264

입력된 레코드의 수정 ................................................................................... 270

페이지 나누기 ................................................................................................ 277

정렬하기 ......................................................................................................... 285

10장 웹 애플리케이션 개발 291이메일 전송 .................................................................................................... 292

날짜와 시간 함수 ........................................................................................... 298

파일 업로드 .................................................................................................... 302

PHP와 자바스크립트 .................................................................................... 315

HTTP 헤더의 이해 ....................................................................................... 322

Page 8: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

ix

11장 쿠키와 세션 327로그인 페이지 제작하기 .............................................................................. 328

로그인 함수 만들기 ....................................................................................... 331

쿠키 사용하기 ................................................................................................ 336

세션 사용하기 ................................................................................................ 349

세션의 보안 .................................................................................................... 358

12장 보안 361스팸메일 방지 ................................................................................................ 362

데이터 타입 검사 ........................................................................................... 369

XSS 공격 방어하기 ........................................................................................ 374

SQL 인젝션 공격 방지 .................................................................................. 377

데이터베이스 암호화 .................................................................................... 383

13장 펄 호환 정규표현식 389테스트 스크립트 작성 ................................................................................... 390

간단한 패턴 정의하기 ................................................................................... 394

수량자 사용하기 ............................................................................................ 397

문자 클래스 사용하기 ................................................................................... 400

전체 매치하기 ................................................................................................ 403

변경자의 사용 ................................................................................................ 407

패턴 매치와 치환 ........................................................................................... 409

14장 국제화된 사이트 제작 413문자 집합과 인코딩 ....................................................................................... 414

다국어 웹페이지 ........................................................................................... 416

PHP에서의 유니코드 .................................................................................... 420

PHP 콜레이션 ............................................................................................... 424

음역 ................................................................................................................. 427

언어와 MySQL .............................................................................................. 430

표준시간대와 MySQL .................................................................................. 434

로케일 ............................................................................................................. 437

Page 9: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

x

15장 게시판 예제 441데이터베이스 설계 ........................................................................................ 442

템플릿 적용 .................................................................................................... 451

인덱스 페이지 ............................................................................................... 460

포럼 페이지 ................................................................................................... 461

게시물 페이지 ............................................................................................... 466

메시지 작성하기 ............................................................................................ 471

16장 예제–사용자 등록 483템플릿 작성하기 ............................................................................................ 484

설정 변경 스크립트 작성하기 ...................................................................... 490

홈페이지 만들기 ............................................................................................ 498

회원 등록 ........................................................................................................ 500

계정 활성화 .................................................................................................... 509

로그인과 로그아웃 ........................................................................................ 513

비밀번호 관리 ................................................................................................ 519

17장 전자상거래 예제 529데이터베이스 디자인 .................................................................................... 530

사이트 관리 .................................................................................................... 536

일반 페이지용 템플릿 만들기 ...................................................................... 553

제품 카탈로그 ................................................................................................ 557

쇼핑 카트 ........................................................................................................ 569

주문 기록하기 ................................................................................................ 579

부록 설치 587윈도우에서 설치하기 .................................................................................... 588

맥 OS에서 설치하기 ..................................................................................... 591

MySQL 권한 .................................................................................................. 594

설치 테스트하기 ............................................................................................ 598

PHP 설정 ....................................................................................................... 601

Page 10: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xi

오늘날의 웹 사용자들은 자주 갱신되고 잘 개인화된 서비스를 제공하는 재미있는 웹 페이지를 기대한다. 그

들에게 이러한 사이트는 커뮤니티 이상의 의미가 있으며 반복적으로 방문을 시도할 것이다. 동시에 웹 사이

트의 관리자들은 갱신과 유지보수가 간편하기를 바라고 그것이 방문자들의 기대를 충족시키는 유일한 방법

이라는 것도 잘 이해하고 있다. 이러한 기대들 때문에 PHP와 MySQL은 데이터베이스 기반의 동적인 웹 사

이트를 만드는 사실상의 표준이 되었다.

이 책은 필자의 이전 몇 권의 관련 도서를 집필하던 경력과 다년간의 웹 개발 경험의 성취를 총 망라하고 있

다. 이 책의 핵심은 가장 효율적인 방법으로 가장 중요한 지식들을 다루고자 것이다. 이 책은 동적인 웹 사이

트 개발을 시작하는 방법을 알려주고 이를 위해 많은 예제코드를 제공할 것이다. 다만 필요한 것은 배우려는

열정뿐이다.

아! 그리고 보니 컴퓨터도 필요하다.

i도입

Page 11: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xii

도입

동적인 웹사이트란 무엇인가

동적인 웹 사이트는 유연하고 강력하며, 웹사이트라

기보다는 애플리케이션이라는 하는 게 더 정확할 것

이다. 동적인 웹 사이트는

◆ 다양한 조건에 응답한다(예를 들어, 시간이나 방

문자 웹 브라우저의 버전)

◆ 사용자의 회원등록 로그인, 전자상거래 같은 프

로세스를 처리할 수 있는 기억장소를 가진다.

◆ 대부분이 HTML 폼을 가지고 있기 때문에, 검색

을 수행하거나 피드백 등을 받을 수 있다.

◆ 보통 사이트의 콘텐츠를 관리할 수 있는 관리자

인터페이스를 가지고 있다.

◆ 정적인 웹사이트에 비해 유지보수와 업그레이드

가 용이하다.

동적인 웹 사이트를 만들기 위한 여러 기술 표준

이 있다. 가장 일반적인 것으로 ASP.NET, JSP,

ColdFusion, Ruby on Rails, PHP 등이 있다. 동적인

웹 사이트가 항상 데이터베이스에 의존하는 것은 아

니지만 거의 무료로 사용할 수 있는 MySQL과 같은

훌륭한 데이터베이스 애플리케이션도 있다.

그림 i.1 PHP의 홈페이지

Page 12: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xiii

도입

PHP란 무엇인가?

PHP가 1994년 Rasmus Lerdorf에 의해 그의 온라인

이력서 페이지에 방문하는 사람들을 추적하기 위해

처음 만들어졌을 때에는 Personal Home Page라는

의미였다. 그러나 그 유용성과 성능이 점차 증가함에

따라 이제는 PHP:HyperText Preprocessor를 의미

한다.

공식 웹 사이트 www.php.net(그림 i.1)의 “PHP는 웹

개발을 위한 범용 스크립트 언어이며 HTML과 혼합

되어 사용될 수 있다.”라는 설명이 필자가 내리고자

하는 정확한 PHP에 대한 정의다.

이 설명에서 PHP가 HTML에 혼합되어 사용될 수

있다고 말한 것은, 표준적인 HTML 페이지에 필요한

PHP 코드를 써 넣으면 즉시 동적인 결과를 얻을 수

있다는 의미이다. 이러한 PHP의 속성은 PHP를 누구

나 쉽게 접근할 수 있도록 해 준다.

또한 PHP는 프로그래밍 언어가 아니라 스크립트 언

어이다. PHP는 단일한 애플리케이션이 아닌 웹 스크

립트를 짜도록 디자인 되었기 때문에 사용자가 폼을

제출하거나 특정 URL로 이동하는 것과 같은 이벤트

가 발생해야만 실행된다(물론 지금의 PHP는 조금 수

고를 들이면 애플리케이션을 만들 수도 있다).

필자는 PHP의 정의에 서버사이드, 크로스 플랫폼 기

술이라는 중요한 의미를 추가하고 싶다. 서버 사이드

라는 말은 PHP가 하는 모든 일이 서버에서 일어난다

는 사실을 알려준다. 아파치나 IIS같은 웹 서버 애플

리케이션도 마찬가지인데, PHP 스크립트에는 반드

시 URL을 통해 접근되어야 한다. 크로스 플랫폼이라

는 특징은 PHP가 윈도우를 비롯하여 유닉스, 매킨토

시와 같은 대부분의 운영체제에서 실행된다는 의미이

다. 가장 중요한 것은 한 서버에서 작성된 PHP는 다른

서버에서도 약간의 수정을 거치거나 또는 거의 수정

하지 않아도 대부분 정상적으로 작동한다는 것이다.

이 책이 만들어질 당시의 PHP는 5.2.4 버전이었으며

4.4.7 버전도 여전히 유지되고 있었다. 그러나 버전 4

는 이미 지원이 전혀 이루어지지 않고 있으며 모든 사

용자가 버전 5를 사용하도록 권고하고 있다. 또한 이

책의 이번 판에서는 PHP 6에 초점을 맞추고 있다. 혹

시 아직까지 버전 4를 사용하고 있다면 업그레이드를

해야 한다. 업그레이드할 계획이 없다면 이 책의 두

번째 판을 보라. PHP 5는 두 번째 판과 이번 판에서

도 모두 잘 작동될 것이다. 이번 판에서는 모든 기능

과 함수가 PHP 6에 초점을 맞추고 있다는 것을 다시

분명히 밝혀둔다.

Page 13: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xiv

도입

PHP 6에서 새로워진 점

PHP 4에서부터 계획된 기능의 차이 때문에 많은 사

용자들과 웹 호스팅 회사들이 PHP 4에서 PHP 5로,

PHP 5에서 PHP 6으로 빠른 이동을 할 것이다. PHP

6에서 새로워진 점을 논의하기 위해 PHP4와 PHP 5

의 큰 차이점을 먼저 설명한다.

PHP 5는 PHP 4처럼 이 인기있는 프로그래밍 언어

의 주요한 버전이다. PHP 5에서의 가장 큰 변화는

PHP 5가 OOP(object-oriented programming)를 지

원한다는 것이다. 여기서는 OOP를 다루지 않기 때문

에 이 변화가 이 책에 주는 영향은 거의 없다(필자의

다른 책 PHP 5 Advanced: Visual QuickPro Guide

에서는 OOP를 다루고 있다). 이 책의 관점에서 PHP

5의 가장 큰 변화는 MySQL과의 통신을 위해 개선된

MySQL 확장 기능(Improved MySQL Extension)이

추가된 것이다. 개선된 MySQL 확장 기능은 이전의

MySQL 확장 기능에 비해 많은 장점이 있으며, 이 둘

은 함께 사용할 수 없다.

PHP 6에서의 큰 변화는 유니코드의 지원인데, 이제

는 PHP가 세상의 모든 언어를 다룰 수 있다는 것을

의미한다. 이것은 매우 큰 변화이며 PHP 6를 사용해

야만 하는 이유이기도 하다. 프로그래밍의 관점에서

는 이러한 방법이 14장 “유니버설 사이트 만들기”에

서 다루어졌으며, 14장의 중요한 정보는 15장 “예제-

메시지보드 제작”에서도 사용되었다. PHP 6에서는

유니코드 추가 이외에도, 사용을 자제할 것을 권고하

였던 PHP 5의 여러 불필요한 요소들이 제거되었다.

제거된 내용 중 가장 주요한 것은 “매직 쿼트”와 “글로

벌 변수”이다.

왜 PHP를 사용해야 하는가?

간단히 말하면 동적인 웹 사이트를 개발하려고 할 때

에 PHP는 다른 대안들보다 더 뛰어나고 더 빠르고

더 배우기 쉽기 때문이다. PHP를 통해서 최상의 성

능을 얻을 수 있고 거의 모든 데이터베이스와 훌륭하

게 통합되며 안정성과 이동성을 보장하는데다가 특

유의 확장성으로 필요한 거의 모든 기능을 사용할 수

있다. 이 모든 것이 전부 무료이고(PHP는 오픈소스

다) 관리가 아주 용이하다. PHP는 초보 프로그래머

가 손쉽게 시작할 수 있는 가장 훌륭한 선택이고, 실

력 있는 프로그래머도 PHP를 사용해서 그들이 원하

는 모든 것을 할 수 있다.

백문이 불여일견이다. PHP는 처음 생겨난 이래 기하

급수적인 사용률 증가 추세를 보여왔으며 현재는 가

장 인기 있는 스크립트 언어였던 ASP를 압도하고 있

다. PHP는 아파치의 가장 중요한 모듈 중 하나로 자리

잡았으며 이 책이 발매될 즈음에는 거의 2500만 개의

PHP로 제작된 사이트의 도메인이 생겨날 것이다.

물론 PHP 책의 저자로서 약간의 선입견이 있을 수는

있다. 그러나 필자는 PHP만큼은 아니지만 JSP(Java

Server Page), 루비 온 레일즈(Ruby on Rails), ASP.

NET 등을 사용하기도 한다. 각각은 모두 장단점이

있으나, 결국은 PHP로 작업하게 된다. 아마도 PHP

는 다른 기술에 비해 대용량 처리가 약하다라는 이야

기를 들어봤을 것이다. 그러나 야후(Yahoo!)는 PHP

를 사용하여 매일 35억 건의 요청을 처리한다. 또한

PHP가 얼마나 안전한지에 대해서도 궁금할 것이다.

그러나 보안은 언어 자체의 몫이 아니라 그 언어를 어

떻게 사용하는가에 달려 있다. 그러나 안심하라. 이

책에서는 당면한 최신 보안 관련 문제들에 관해 완벽

하게 논의할 것이다.

Page 14: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xv

도입

PHP의 작동원리

이미 이야기했듯이 PHP는 서버사이드 언어이다. 이

말은 PHP 사이트의 코드를 작성하는 호스트 컴퓨터

가 서버라는 의미이다. 서버는 방문자가 요청하면 웹

페이지를 전송한다(클라이언트는 웹 브라우저다).

방문자가 PHP로 작성된 웹 사이트를 방문하면 서버

는 PHP를 코드를 읽고 내용대로 처리한다. 그림 i.2

에서 볼 수 있듯이 PHP 코드는 서버에게 명령하여

웹 브라우저에 적절한 HTML 코드를 전송하도록 하

는데, 웹 브라우저는 전달받은 코드를 표준 HTML

페이지로 인식하게 된다.

정적인 HTML 페이지에 요청이 오면 서버는 웹 브라

우저에 HTML 데이터를 전송하는데 이러한 경우에

는 서버사이드 번역(Interpretation)이 일어나지 않는

다. 왜냐하면 서버 사이드 액션이 필요하지 않기 때문

인데, HTML 페이지는 서버와 전혀 관계없이 웹 브라

우저로 실행할 수 있다.

사용자와 웹 브라우저의 관점에서는 home.html과

home.php가 거의 차이가 없지만, 페이지의 내용이

만들어지는 방법에는 분명한 차이가 있다.

그림 i.2 사용자가 웹 페이지를 요청했을 때 PHP가 서버와 클라이언트를 조화시키는 방법

그림 i.3 정적인 HTML을 요청했을 때 클라이언트/서버의 프로세스

Page 15: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xvi

도입

MySQL은 무엇인가?

MySQL(www.mysql.com, 그림 i.4)은 세계적으로

가장 인기 있는 오픈소스 데이터베이스이다. 실제로

MySQL은 오라클이나 MSSQL과 같은 값비싼 덩치

들의 실질적인 경쟁자가 되었다. PHP와 마찬가지로

MySQL은 훌륭한 성능과 신뢰성, 이식성을 제공하

며 학습곡선이 완만하고 비용이 거의 들지 않는다.

MySQL은 관계형 데이터베이스 관리 시스템(DBMS)

이다(즉 MySQL은 RDBMS이다). 간단히 말해서 데이

터베이스란 DBMS에 의해 저장되고 관리되는 서로 밀

접한 관련이 있는 텍스트, 숫자 또는 이진 파일들의 집

합이다.

간단한 파일에서부터 관계형, 객체지향형과 같은 많

은 종류의 데이터베이스가 있다. 관계형 데이터베이

스는 정보를 저장하기 위해 여러 개의 테이블을 사용

하는 특징이 있다. 디자인과 프로그래밍 단계에서 특

별한 노력을 기울이지 않아도 관계형 데이터베이스

가 데이터의 무결성과 신뢰성을 대부분 보장해 준다.

거기다가 관계형 데이터베이스는 검색이 용이하고 많

은 수의 사용자를 효율적으로 처리할 수 있다.

웹 애플리케이션과 데이터베이스를 통합하여 PHP

가 생성한 데이터를 MySQL로부터 가져올 수 있다

(그림 i.5). 이렇게 하면 웹 사이트의 정적인 콘텐츠를

훨씬 유연하게 바꿀 수가 있는데, 이러한 유연성이 동

적 웹 사이트의 핵심이다.

MySQL은 PHP와 같은 오픈소스 애플리케이션인데,

이것은 사용료를 지불할 필요가 없고 심지어는 변형

해서 사용할 수도 있다는 의미이다(소스코드 자체

도 다운로드받을 수 있다). 물론 MySQL라이선스를

획득하기 위해 돈을 지불해야 하는 경우도 있다. 특

히 상업용으로 MySQL과 결합된 상품을 팔려고 할

때에는 라이선스를 구매해야 한다. 더 자세한 정보를

MySQL 라이선스 정책을 참고하라.

그림 i.4 MySQL 홈페이지

Page 16: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xvii

도입

MySQL은 MySQL 서버(mysqld, 데이터베이스를 실

행하고 관리한다), MySQL 클라이언트(mysql, 작업

을 위해 서버와 통신하는 인터페이스를 제공한다) 그

리고 유지보수를 위해 필요한 많은 수의 유틸리티로

구성되어 있다. PHP 항상 MySQL을 충실하게 지원

해 왔으며, 가장 최신 버전에서도 예외는 아니다.

MySQL은 6만 개 이상의 테이블과 50억 건 이상의

레코드를 처리할 수 있다고 알려져 있다. MySQL은

특정 운영체제에서 8백만 테라바이트 크기 이상의

테이블을 다룰 수 있으나, 일반적으로 4기가바이트

를 안정적으로 지원한다. MySQL은 NASA와 미국

인구 통계국을 비롯하여 여러 곳에서 사용되었다.

이 글을 쓸 당시의 MySQL 버전은 5.0.45였으며, 5.1

과 6.0이 한창 개발 중이었다. MySQL 버전의 차이

는 기능의 차이를 유발하므로 현재 사용하고 있는

MySQL의 버전을 아는 것은 매우 중요하다. 이 책에

서는 버전 5.0.45를 사용하지만, 4.1 이상의 버전만

있으면 이 책의 모든 내용을 실행하는 데에는 아무

런 문제가 없다(필자의 또 다른 책, MySQL: Visual

QuickStart Guide에서는 이 책에서 다루지 않은

MySQL 5의 새로운 기능을 더 자세히 다루었다).

그림 i.5 이 책의 거의 모든 동적 웹 애플리케이션이 PHP와 MySQL을 사용하여 동작하는 방법

Page 17: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xviii

도입

준비물이 책의 예제를 따라 하려면 다음과 같은 도구가 있

어야 한다.

◆ 웹 서버 애플리케이션(예를 들어 Apache, Abyss,

또는 IIS)

◆ PHP

◆ MySQL

◆ 웹 브라우저(마이크로소프트 인터넷 익스플로

러, 모질라 파이어폭스, 애플의 사파리 등등)

◆ 문서 편집기, PHP를 지원하는 WYSIWYG 애

플리케이션(Adobe사의 드림위버도 좋다) 또는

IDE(통합개발환경, Integrated Development

Environment).

◆ FTP 애플리케이션(원격 서버를 사용하는 경우)

PHP와 MySQL을 이용하여 동적인 웹 사이트를 개

발할 때에 가장 좋은 것은, 어떤 운영체제를 사용하

는 경우라도 이러한 준비를 모두 갖추는데 비용이 전

혀 들지 않는다는 것이다. Apache와 PHP, MySQL은

전부 무료이며, 대부분의 웹 브라우저도 무료로 사용

할 수 있다. 또한 무료로 사용할 수 있는 훌륭한 문서

편집기도 많다.

부록에서는 윈도우와 Mac OS X에서의 설치 과정을

자세히 다룬다. 사용할 컴퓨터가 있다면 동적 웹사이

트를 작성하기 위해서 해야 할 일은 단지 몇 개의 파

일을 다운로드받는 것뿐이다(이 경우에는 그림 i.2

와 i.5에서처럼 한 컴퓨터가 서버와 클라이언트의 역

할을 병행한다). 또는 한 달에 몇 달러 정도의 돈으로

호스팅 서비스를 받을 수도 있는데, 당장 사용 가능

한 PHP/MySQL 환경을 제공 받을 수 있다.

Page 18: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xix

도입

이 책에 대해이 책은 PHP와 MySQL로 동적인 웹 사이트를 개발

하는데 있어서 대부분의 개발자에게 꼭 필요한 내용

을 가르친다. Visual QuickPro 시리즈와 형식을 맞추

기 위해서 모든 정보들은 해당하는 이미지와 함께 단

계적으로 접근하며 논의할 것이다. 논의의 초점은 실

제로 활용 가능한 예제에 맞춰질 것이다. 현역 웹 개

발자로서 필자가 현재 사용하고 있는 정보를 수록하

였고 추상적인 주제는 가급적 배제하였다. 또 현역 저

자로서 필자는 독자들이 요구하는 특정한 주제와 테

크닉을 수록하였다.

이 책은 선형적인 구조이므로 순서대로 읽어야 할

것이다. 이 책은 PHP의 기초에 대한 3개의 장으

로 시작한다(2장에서 이미 첫 번째 동적 웹 페이지

를 개발하게 될 것이다). 그다음에는 3개의 장에서

SQL(Structured Query Language, 데이터베이스에

명령을 내리는 언어이다)과 MySQL에 대해 다룬다.

이들 장에서는 SQL의 대한 기초와 데이터베이스 설

계에 대해 배우며, 특히 MySQL 애플리케이션에 대

해 자세히 알아볼 것이다. 그 후 누구에게나 꼭 필요

한 디버깅과 에러 관리를 위한 정보를 1개의 장에서

다룬다. 이러한 내용은 PHP와 MySQL을 쉽게 연동

하여 사용하는 방법을 설명하는 장에 바로 이어 등

장할 것이다.

이후의 5개의 장에서는 독자의 지식을 완성하기 위

한 더 고급의 애플리케이션 테크닉을 가르친다. 특히

보안 관련 사항이 반복적으로 제시될 것이다. 14장

“유니버설 사이트 제작”은 이 책에 새롭게 수록된 내

용인데, 웹 사이트의 접근성을 넓힐 수 있는 방법을

보여준다. 마지막으로 각기 다른 핵심에 치중한 3개

의 예제 장을 상세한 설명을 곁들여 추가하였다.

이 책은 어떤 독자에게 적합한가?

이 책은 초보자에서 중급자까지 넓은 범위의 사람들

을 대상으로 제작되었다. 이 책은 장래의 호환성을

위해 XHTML을 사용하고 있으므로, XHTML이나

그 선조인 HTML에 대한 약간의 지식이 필요하다. 이

책은 많은 내용을 다루고 있기는 하지만 HTML이나

웹 페이지 디자인과 같은 사항은 다루지 않는다. 약간

의 CSS도 갑자기 출현하겠지만 역시 자세하게 다루

지 않는다.

이 책은 독자 여러분들이 다음과 같은 사항들 중 하

나를 얻기를 기대한다.

◆ 손이 너무 많이 가지 않으면서 배우고자 하는 적

극성과 능력을 배양

◆ 새로운 언어의 대한 친밀성(JavaScript와 관련된

스킬도 마찬가지다)

◆ PHP에 대한 전반적인 지식

이 책은 실제의 웹사이트를 개발하기 위해 필요한

PHP와 MySQL의 A부터 Z까지를 담고 있다. 그러

나 책의 초반에서는 빠른 페이스로 PHP에 관해 주

로 다룬다. 이러한 이유로 새로운 언어를 배울 때에

꼭 필요한 약간의 프로그래밍 경험과 호기심, 독립적

인 정신을 가져줄 것을 당부한다. 진도가 너무 빠르게

나간다는 생각이 들면 필자의 다른 책 PHP for the

World Wide Web: Visual QuickStart Guide로 시작

하는 것도 좋은 생각이다. 이 책은 좀 더 느긋한 페이

스를 유지하기 때문이다.

이 책은 SQL과 MySQL에 관해서는 아주 기초적인

수준에서부터 다루고 있으므로 데이터베이스에 관

련된 경험은 그다지 필요치 않다.

Page 19: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xx

도입

이번 판에서 새로워진 점

이 책의 이전 2개의 판은 매우 인기가 있었고 독자들

로부터 많은 긍정적인 피드백을 받았다(정말 감사한

다). 세 번째 판을 집필하면서, 필자는 단순히 최신 버

전의 PHP와 MySQL에 관한 내용을 업데이트하는

것 이상의 일을 하고 싶었다. 이번 판에서는 다음과

같은 새로운 특징을 접할 수 있을 것이다.

◆ 독자들로부터 많은 요청이 있었던 기법을 선보이

는 새로운 예제들

◆ 고급 MySQL과 SQL 예제들

◆ 공공 웹 사이트에 대한 악용 또는 공격을 방어하

기 위한 내용에 치중한 장

◆ 다국어와 타임존을 다루는 새로운 장

◆ 메시지보드(또는 포럼)을 작성하는 새로운 예제 장

◆ 설치와 설정에 대한 소개와 설명을 확장하거나

보강

◆ 오래되어 더 이상 유효하지 않는 내용을 제외(구

버전의 PHP에서만 동작하거나 PHP 6에서 더 이

상 동작하는 않는 내용)

이 책의 첫 번째 판과 두 번째 판을 이미 가지고 있는

독자들에게도, 이러한 새로운 특징들이 독자들의 책

상이나 책꽂이에 이 세 번째 판을 꼭 꽂아놓도록 만

들어 줄 것이다.

필자의 다른 책들과 이 책을 구분하는

방법

이 책은 PHP와 MySQL에 관해 필자가 쓴 4번째 책

이다.

◆ PHP for the World Wide Web: Visual

QuickStart Guide

◆ PHP 5 Advanced for the World Wide Web:

Visual QuickPro Guide

◆ MySQL: Visual QuickStart Guide

이러한 이력이 이 책을 집필하는 데 있어 일정 수준의

자질을 증명할 수 있으면 좋겠지만, 책방에 서 있는

독자들의 입장에서는, 어떤 책을 선택할지 난감할 수

있다. 물론 돈을 아끼지 않고 전체를 다 구입한다면

필자로서는 끊임없는 감사를 보내긴 하겠지만…

The PHP for the World Wide Web: Visua l

QuickStart Guide는 PHP에 관한 초보자용 가이드

이다. 제목이 이 책의 처음 3개의 장을 떠올리게 하지

만 새로운 예제를 사용하기 때문에 불필요하게 중복

되는 내용은 아니다. PHP 5 Advanced for the World

Wide Web: Visual QuickPro Guide는 앞선 책의 완

벽한 속편이며 이미 배운 많은 지식을 가정한 상태로

진행한다. MySQL 책은 MySQL에만 초점을 맞추고

있다(그러나 2개의 장은 PHP도 함께 사용한다).

이러한 사항을 염두에 두면서 “이 책이 어떤 독자에

게 적합한가?” 절을 읽고 필요한 사항이 적용되어 있

는지 확인하라. 만약 독자가 프로그래밍에 대한 경험

이 전무하거나 PHP를 더 천천히 배우고 싶다면 필자

의 첫 번째 책이 가장 적합할 것이다. 이미 PHP에 대

해 충분히 익숙한 상태이고 더 고급 기능에 대해 배

우고 싶다면 두 번째 책이 좋다. 또는 PHP에 대해서

는 많이 배우고 싶지 않고 MySQL에 관심이 많다면

세 번째 책을 추천한다.

그러나 PHP와 MySQL로 동적인 웹사이트 제작을

위해 필요한 내용을 골고루 배우고 싶다면 이 책이 더

할 나위 없이 적합할 것이다. 이 책은 이러한 기술에

대한 가장 최신의 버전을 다루고 있으며 다른 책에서

는 언급되지 않았던 기술을 사용하고 이와 관련된 유

일한 예제도 포함하고 있다.

어떤 책을 선택하든 최근에 나온 판인지 확인하라.

또한 독자들이 현재 사용하고 있는 버전에 맞는 책을

고르는 것도 중요하다.

Page 20: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

xxi

도입

자매 사이트필자는 특별히 이 책을 위하여 자매 사이트를 개발

했는데, www.DMCinsights.com/phpmysql3/(그림

i.6)에서 접속할 수 있다. 이 사이트에서는 이 책에서

사용된 모든 스크립트를 찾을 수 있으며 길이가 긴

SQL 명령어와 출판 과정에서 발생한 오자를 정정한

목록이 수록된 텍스트 파일도 찾을 수 있을 것이다

(책을 정확히 따라 했음에도 불구하고 명령어나 스크

립트에서 문제가 발생하면 스트레스 받지 말고 인쇄

상의 실수가 있는지 오류 정정 목록을 확인하라). 또

한 이 사이트에서는 독자들이 서로의 의문점에 대해

묻고 답할 수 있는 매우 인기 있는 포럼을 포함하여

여러 유용한 링크를 찾을 수 있을 것이다(필자가 여

러 질문에 대해 직접 답을 하기도 한다).

질문, 코멘트, 제안?

PHP와 MySQL에 대해 궁금한 사항이 생기면 이미

존재하는 메일링 리스트나 뉴스그룹, FAQ 저장소 같

은 많은 웹 사이트를 방문해 보라. 검색을 통해서도

거의 무제한의 리소스에 접근할 수 있을 것이다. 그렇

기 때문에 즉각적인 응답이 필요하다면 이러한 리소

스나 검색이 확실히 독자들이 필요로 하는 정보를 제

공해 줄 것이다(십중팔구는 누군가 이미 문제를 발견

하고 정확히 해결했을 가능성이 높다).

물론 독자들이 직접 필자에게 질문이나 코멘트 또는

제안을 해 줄 수도 있다. 이 책의 지원포럼을 사용하

면 가장 빠른 응답을 얻을 수 있을 것이다(필자는 그

러한 질문들에 대해 우선적으로 응답한다). 그래도

필자에게 직접 메일을 보내고 싶으면 포럼에 연락처

가 있다. 필자는 받은 이메일에 대해 전부 응답하기

위해 노력하고 있지만 항상 빠른 응답을 보장하기는

힘들다.

그림 i.6 이 책의 자매 사이트

Page 21: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1

“천 리 길도 한 걸음부터”라는 말이 있듯이, PHP와 MySQL을 이용한 동적인 웹 애플리케이션을 개발하는

첫 걸음은 PHP 언어 자체의 기본을 배우는 것이다.

이 책이 MySQL과 PHP를 조합해서 사용하는 것에 초점이 맞추어져 있기는 하지만, 독자들은 주로 PHP만

을 사용해서 많은 작업을 하게 될 것이다. 1장과 이어지는 몇 개의 장에서는 PHP의 문법으로 시작하여 변수

와 연산자, 언어의 기본구조(조건, 루프 등)에 대해서 알아 본다. 이러한 기본을 익혀감과 동시에, 이 책 후반

에 등장하는 좀 더 큰 애플리케이션에 통합될 유용한 코드도 개발하게 될 것이다.

1장에서는 PHP 언어의 거의 모든 기본에 대해서 다룰 것이다. PHP 코딩을 위한 문법과 웹 브라우저로 데이

터를 보내는 방법, 상수를 포함하여 문자열과 수의 사용법을 배울 것이다. 어떤 예제는 그 자체로서는 완전

하게 동작하지 않지만, 책의 후반부에 등장하는 복잡한 스크립트를 작성하는 데 필요한 기본에 대해서 충분

히 알려준다.

01PHP 입문

Page 22: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

2

기본 문법앞서 이야기했듯이 PHP는 HTML 내장형 스크립

트 언어이다. 이 말은 한 파일 안에서 PHP와 HTML

을 마구 뒤섞어 사용할 수 있다는 의미이다. PHP

로 프로그래밍을 시작하려면 간단한 웹페이지부터

시작하는 것이 좋다. 스크립트 1.1은 이 책에서 웹

페이지를 작성할 때마다 사용할 평범하고 단순한

HTML Transitional 문서이다(이 책은 HTML 또는

XHTML에 대해서 자세하게 다루지 않으므로, 자세

한 정보는 관련 문서를 참고하라).

페이지에 PHP 코드를 삽입하려면, PHP 태그 사이

에 써 넣어야 한다.

<?php

?>

PHP 인터프리터는 이 두개의 태그 <?php 와 ?> 사

이에 위치한 모든 내용을 PHP 코드로 인식한다.

반면에 이 태그 외부에 있는 모든 코드는 일반적인

HTML로서 PHP 인터프리터를 거치지 않고 웹 브라

우저로 즉시 전송된다.

PHP 태그가 사용된 파일은 반드시 특정한 확장자명

을 가져야 한다. 이 확장자명이 웹서버에게 이 파일이

특별한 방법으로 처리되어야 함을 알려주기 때문이

다. 통상적으로 대부분의 웹서버들은 표준적인 웹페

이지로 .html 또는 .htm 확장자명을 사용하고, PHP

파일은 .php 확장자명을 사용한다.

기본적인 PHP 스크립트 작성하기:

1. 문서 편집기로 새로운 문서를 생성한다(스크립

트 1.2). 보통은 어떤 애플리케이션을 사용해도

문제가 되지 않는다. 드림위버 또는 BBEdit(훌륭

한 성능으로 인기 있는 매킨토시 텍스트 편집기),

vi(그래픽 사용자 인터페이스가 없는 유닉스용

텍스트 편집기)도 그 중 하나다. 어떤 텍스트 편

집기나 IDE(통합개발환경)는 HTML과 PHP를

작성하고 디버깅하는 데 좀 더 도움을 준다(윈도

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

5 <title>Page Title</title>

6 </head>

7 <body>

8 </body>

9 </html>

스크립트 1.1 기본적인 HTML 1.0으로 구성한 전통적인

웹페이지

Page 23: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

3

우용 노트패드로 작성할 수도 있지만 문법강조나

자동완성, 자동 들여쓰기 등을 지원하지 않으므

로 추천하지 않는다). 만약 지금 사용하는 문서

편집기가 없으면 웹을 검색하거나,

이 책의 포럼(http://www.DMCInsights.com/

phorum/)에서 찾을 수 있을 것이다.

2. 기본적인 HTML 문서를 작성하자.

<!DOCTYPE html PUBLIC "-//W3C// DTD XHTML 1.0 Transitional//EN"" http://www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Basic PHP Page</title>

</head>

<body>

<p>This is standard HTML.</p>

</body>

</html>

이것이 이 책 전반에서 사용될 HTML 표준 문법

(XHTML 1.0 Transitional)이지만, 실제로 사용

하고 싶은 다른 표준으로 변경해도 무방하다(예

를 들어 HTML 4.0 Strict를 사용할 수도 있다).

다시 말하지만, 이러한 HTML 코드가 익숙하지

않다면, HTML이나 XHTML 관련 문서를 보는

것이 좋다(첫 번째 팁을 참고하라).

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

5 <title>Basic PHP Page</title>

6 </head>

7 <body>

8 <p>This is standard HTML.</p>

9 <?php

10 ?>

11 </body>

12 </html>

스크립트 1.2 자체로는 아무것도 하지 않는 첫 번째 PHP

스크립트이지만, PHP 스크립트가 어떻게 작성되는지를 보여

준다. 또한 복잡한 PHP 코드를 작성하기 이전에 테스트를 목

적으로도 사용할 수 있다.

Page 24: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

4

3. body 태그 안에 다음의 PHP 태그를 삽입한다.

<?php

?>

이 태그는 PHP 태그인 동시에 XML 스타일의 태

그이기도 하다. PHP가 다른 형태의 태그도 지원

하지만(두 번째 팁을 보라), 기본 형태의 PHP 태

그 사용을 권장한다. 필자 또한 이 책 전체를 걸

쳐 기본 태그 형태를 사용할 것이다.

4. 파일명을 ©rst.php로 저장한다.

웹서버에서 PHP 인터프리터로 연결한 확장자명

으로 저장하지 않으면 스크립트가 제대로 실행되

지 않는다는 것을 명심하라.

5. 웹서버상의 접근 가능한 위치에 파일을 저장한다.

PHP를 자신의 PC에서 직접 가동 중이라면 파일

을 복사 또는 이동시키거나, 적절한 폴더에 바로

저장한다. 정확한 디렉터리를 인식하도록 웹서버

의 설정을 변경하려면 웹서버의 설정 변경 관련

문서를 참고하라.

PHP가 호스팅 서비스 중인 서버에서 실행된다면,

FTP를 이용하여 파일을 업로드 해야 하는데, 서

비스 회사에서 관련 접속 정보를 제공해줄 것이

다.

6. 웹 브라우저로 ©rst.php를 실행한다(그림 1.1).

PHP 스크립트는 서버에 의해 파싱(parsing)되어

야 하므로, 반드시 URL을 통해서만 접근해야 한

다. 웹 브라우저에서 파일을 열 때에는 다른 애플

리케이션에서 파일을 여는 것처럼 해서는 안 된다.

자신의 PC에서 PHP를 구동중인 경우에는

http://localhost/©rst.php, http://127.0.0.1/©rst.

php, http://localhost/~<user>/©rst.php(Mac

OS X에서는 <user>부분을 실제 사용자 이름으

로 대체)등으로 접속해야 하고, 호스팅 서비스를

받고 있다면 http://도메인명/©rst.php(예: http://

www.example.com/©rst.php)로 접속해야 한다.

그림 1.1 평범한 HTML 페이지처럼 보이지

만, 사실 PHP 스크립트이며, 이 책의 다른 모

든 예제들의 기반이 된다.

Page 25: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

5

7. 그림 1.1과 같은 결과가 나오지 않는다면 디버깅

을 시작해야 한다.

디버깅을 마스터하는 것은 모든 프로그래밍 언어

를 배우는 데 있어 매우 중요하며, 고통스럽지만

절대적으로 필요한 작업이다. 복잡해 보이겠지

만, 이 첫 번째 예제로 다음 스텝을 따라가 보자.

1. 설치한 PHP가 제대로 동작하는지 확인한다

(테스트를 위한 명령은 부록 A를 참고).

2. URL에서 정확한 스크립트를 실행하는지 확

인한다. 웹 브라우저의 주소는 http://로 시작

해야 한다. file://로 시작하면 잘못된 것이다

(그림 1.2).

3. ©le not found(파일을 찾을 수 없음) 오류가

발생하면, 파일의 위치나 파일 이름이 틀린

경우이다(저장 시에 틀렸거나, 웹 브라우저에

입력한 값이 잘못되었을 것이다).

이러한 사항을 모두 확인하고도 오류가 계속 발생

하면, 질의 포럼을 이용하라(www.DMCInsights.

com/phorum/list.php?20).

Tips

▒ HTML 또는 XHTML에 대한 자세한 정보가 필

요하면, 엘리자베스 카스트로(Elizabeth Castro)

의 HTML, XHTML and CSS, Sixth Edition:

Visual QuickStart Guide, (Peachpit Press,

2006)을 참고하거나 웹을 검색해 본다.

▒ 사실 3종류의 PHP 태그가 있다. <?php ?>가 정

형이며, 축약형 <? ?>이 있고, 스크립트 스타일인

<script language="php"> </script>가 있다. 마지

막 형태는 거의 사용되지 않으며 첫 번째 스타일

을 권장한다.

▒ 필자는 PC에서 직접 PHP를 구동하고 있으므로,

http://127.0.0.1:8000/©rst.php와 같은 주소를 가

끔 보게 될 것이다. 그러나 중요한 것은 URL이

http://으로 시작하고 있다는 것이므로 나머지 주

소 때문에 혼란을 느끼지 않기를 바란다.

▒ 차차 보겠지만 하나의 HTML 파일에 여러 개의

PHP 태그 블록을 사용할 수도 있다.

그림 1.2 웹 브라우저에 PHP 코드가 바로 나타난다면 웹서버가 기능을 제대로 하지 못하는 것이다.

Page 26: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

6

웹 브라우저로 데이터 전송PHP로 동적인 웹 사이트를 만들기 위해서는 웹 브라

우저로 데이터를 보내는 방법을 알아야만 한다. 이러

한 목적으로 PHP는 많은 내장 함수를 가지고 있으

며, 가장 흔하게 사용되는 것이 echo() 또는 print()이

다. 필자 개인적으로는 echo()를 선호한다.

echo 'Hello, world!';

echo "What's new?";

echo() 대신 print()를 사용할 수도 있다.

print "Hello, world!";

print "What's new?";

위의 예에서 볼 수 있듯이 작은따옴표나 큰따옴표 모

두를 사용할 수 있지만, 둘 사이에는 분명한 차이가

있다. 1장의 끝 부분에서 이러한 차이에 대해 알아본

다. 함수명 뒤에 오는 첫 번째 따옴표는 출력될 메시

지의 시작을 가리키며, 다음에 오는 같은 쌍의 따옴

표는 출력될 메시지의 끝을 가리킨다.

모든 PHP 구문은 반드시 세미콜론(;)으로 끝나

야 하며, 함수명에 대소문자를 구분하지 않으므로

ECHO(), echo(), eCHo() 등은 모두 정상적으로 동

작한다. 물론 소문자 형태가 가장 사용하기 쉽다.

이스케이프(Escape)의 필요

웹서버로 데이터를 보낼 때 어려운 부분 중 하나

는 따옴표를 출력하는 것이다. 아래의 두 구문은

모두 오류를 발생시킨다.

echo "She said, "How are you?"";

echo 'I'm just ducky.';

이 문제에 대한 두 가지 해결책이 있다. 첫째, 큰따

옴표를 출력할 때는 작은따옴표를 사용하고 작은

따옴표를 출력할 때는 큰따옴표를 사용하라.

echo 'She said, "How are you?"';

echo "I'm just ducky.";

둘째, 문제가 발생의 소지가 있는 문자에 역슬래

시(\)를 선행시켜 이스케이프시킨다.

echo "She said, \"How are you?\"";

print 'I\'m just ducky.';

이스케이프된 따옴표는 다른 문자들과 동일하게

출력된다. 문자를 이스케이프시키기 위한 역슬래

시 사용법은 대단히 중요한 개념이다. 이와 관련

된 또 한 가지 중요한 사항을 1장의 후반부에서 자

세히 다룰 것이다.

Page 27: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

7

웹 브라우저로 데이터 전송하기:

1. 문서 편집기로 ©rst.php를 연다(스크립트 1.2).

2. PHP 태그 사이(9행과 10행 사이)에 간단한 메시

지를 추가하자(스크립트 1.3)

echo 'This was generated using

PHP!';

어떤 메시지를 입력해도 상관없고, echo() 나

print() 중 어떤 함수를 사용해도 괜찮다. 그러나

메시지의 일부로서 작은따옴표나 큰따옴표를 출

력할 때는 조심해야 한다(사이드바 “이스케이프

의 필요”를 보라).

3. 페이지를 더 잘 설명하기 위해 제목을 바꿀 수도

있다(5행).

<title>Using Echo()</title>

이렇게 하면 웹 브라우저 윈도우의 타이틀 바에

출력된다.

4. second.php로 저장하고, 웹 디렉터리에 위치시킨

후, 웹 브라우저로 테스트해본다(그림 1.3).

5. 필요하다면 스크립트를 디버깅해야 한다.

입력한 메시지 대신에 문법 오류 메시지가 나타난

다면(그림 1.4), 여닫는 인용부호가 일치하는지,

의심스러운 문자를 제대로 이스케이프(사이드바

를 보라) 했는지를 검사해 보자. 또한 모든 문장

이 세미콜론으로 종결되는지도 확인하라.

<다음 쪽에 계속>

스크립트 1.3 PHP는 print()나 echo()를 사용하여 웹 브

라우저로 데이터를 전송한다(그림 1.3)

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

5 <title>Using Echo()</title>

6 </head>

7 <body>

8 <p>This is standard HTML.</p>

9 <?php

10 echo 'This was generated using PHP!';

11 ?>

12 </body>

13 </html>

그림 1.3 환상적인 결과는 아니지만, 이 페이지

는 PHP가 동적으로 생성하였다.

그림 1.4 PHP 프로그래머는 이 문법 오류를 거

의 항상 첫 번째로 보게 된다(이스케이프 되지 않

은 따옴표가 원인이다).

Page 28: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

8

아무것도 출력되지 않는다면 아마 다음 두 가지

이유 중 하나일 것이다.

▲ HTML에 문제가 있는 경우이다. 페이지 소스

를 열고 HTML에 문제가 없는지 확인한다.

▲ 오류가 발생했어도 PHP의 display_errors 설

정이 꺼져 있다면 아무것도 보이지 않는다. 이

러한 경우에는 PHP 설정을 위한 부록 A를 참

고하여 display_errors 설정을 활성화해야 한

다.

Tips

▒ 기술적으로 echo()와 print()는 함수가 아니라 언

어 설계상의 구성요소이다. 그래서 하는 말이지

만, 편의상 이들을 계속해서 함수라고 부르더라

도 혼란스러워 하지 않기를 바란다. 또한 함수를

지칭할 때에는 변수나 다른 PHP의 요소와의 구

분을 위해 괄호를 포함하는데 이것은 필자만의

관례이다.

▒ 웹 브라우저에 HTML을 보내기 위해서는 echo()

와 print()를 사용한다(그림 1.6).

echo '<p>Hello, <b>world</b>!</p>';

▒ echo()와 print()는 여러 행에 걸친 출력에 사용

될 수 있다.

echo 'This sentence is

printed over two lines.';

이런 경우에는 리턴 문자(엔터키나 리턴키를 누

를 때 입력된다)가 메시지의 일부가 되는데, 인용

부호를 닫기 전에는 메시지가 끝나지 않는다.

결과적으로 HTML 소스 코드에 리턴 문자가 출

력되지만(그림 1.7), HTML 페이지 출력에는 아

무런 영향을 주지 않는다(그림 1.8). 자세한 사항

은 사이드바 “공백(White space)의 이해”를 참고

하라.

그림 1.5 공백 페이지가 나오는 원인 중 하나는 단순한

HTML 오류인데, title 태그가 이렇게 닫히는 경우이다(슬

래시가 빠졌다).

그림 1.6 PHP는 간단한 문자뿐만 아니라

HTML 코드도 웹 브라우저로 전송한다.

Page 29: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

9

그림 1.7 여러 PHP 행에 걸쳐서 텍스트와 HTML을 출

력하면, 마찬가지로 여러 행에 걸친 HTML 소스 코드가

생성된다. 공백은 HTML 페이지의 외관에 영향을 주지

않으며, 소스를 더 쉽게 읽을 수 있도록 해 준다.

그림 1.8 리턴문자는 HTML 페이지의 외관에

영향을 주지 않는다. 행을 변경할 수 있는 유일한

방법은 HTML 태그를 사용하는 것이다

(<br/>과 <p></p>).

공백(White space)의 이해

PHP로 웹 브라우저에 데이터를 보내는 것은 사

용자가 눈으로 보는 웹페이지를 출력하는 것이

다. 즉, 웹페이지의 HTML 소스 코드를 생성해 내

는 것이다. 이러한 사항을 염두에 두고, 스크립트,

HTML 소스, 출력된 웹페이지에서의 중요한 3가

지 공백(스페이스, 탭, 공백 행)에 대해 알아보자.

PHP는 공백을 민감하게 취급하지 않으므로 스

크립트의 가독성을 높이기 위하여 코드사이를 띄

어 쓸 수 있다. 마찬가지로 HTML도 공백을 민감

하게 취급하지 않는데, 여러 개의 공백을 입력해

도 웹페이지에서는 한 개의 공백으로만 출력된다.

또한 HTML 소스에서 나타나는 여러 행의 텍스

트가 웹페이지에서도 그대로 출력되지는 않는다

(그림 1.7과 1.8).

웹페이지에서 행을 바꾸려면 HTML 태그 <br

/>(<br>은 옛 표준이다) 또는 <p></p>(문단)을

사용해야 한다. HTML 소스에서 행을 바꾸려면

다음의 방법을 사용하라.

◆ echo() 또는 print()를 여러 행에 걸쳐 사용한다.

혹은

◆ 큰따옴표 안에 개행문자(\n)를 출력한다.

Page 30: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

10

주석 작성하기실행 가능한 PHP 코드를 만들어 내는 것은 프로그

래밍의 여러 과정 중 하나일 뿐이다(물론 이것이 가

장 중요한 부분이다). 두 번째로, 중요하지만 모든 프

로그래밍 과정을 통틀어 가장 힘겨운 작업은 바로 코

드를 문서화하는 작업이다.

HTML에서는 특별한 태그를 이용하여 주석을 추가

한다.

<!-- Comment goes here. -->

HTML 주석은 소스(그림 1.9)에서는 보이지만, 출력

된 웹페이지에는 나타나지 않는다.

PHP 주석은 웹 브라우저로 전송 자체가 되지 않기

때문에 HTML 소스에서도 볼 수 없다.

PHP는 세가지 형태의 주석을 지원하는데, 첫 번째는

#이다.

# 이것은 주석입니다.

두 번째는 슬래시 2개를 겹쳐 사용한다.

// 이것은 주석입니다.

이 두 형태의 주석은 해당 행이 끝나기 전까지의 모든

내용을 PHP 인터프리터가 무시하게 만든다(엔터를

누르면 주석 행이 끝난다). 그러므로 이 두 형태는 단

일 행을 위한 주석 형태이다. 이것들은 주로 PHP 코

드와 같은 행에 주석을 다는 용도로 쓰인다.

print 'Hello!'; // 안부를 전한다

마지막 세 번째 형태는 여러 행에 걸친 주석을 작성할

수 있게 해 준다.

/* 이 주석은 길기 때문에

두 줄에 걸쳐 작성되었다. */

그림 1.9 HTML 주석은 웹 브라우저의 소스에 나타나지만 웹페이지에

는 나타나지 않는다.

Page 31: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

11

스크립트 1.4 아래 소스에서는 PHP에서 사용할 수 있는

세 가지 형태의 주석을 보여주고 있다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

5 <title>Comments</title>

6 </head>

7 <body>

8 <?php

9

10 # Created August 27, 2007

11 # Created by Larry E. Ullman

12 # This script does nothing much.

13

14 echo '<p>This is a line of text.<br />This is another line of text.</p>';

15

16 /*

17 echo 'This line will not be executed.';

18 */

19

20 echo "<p>Now I'm done.</p>"; // End of PHP code.

21

22 ?>

23 </body>

24 </html>

스크립트에 주석 추가하기:

1. 문서 편집기를 이용하여 HTML로 시작하는

PHP 문서를 생성하자(스크립트 1.4).

<!DOCTYPE html PUBLIC "-//W3C//

DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/

xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/

xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type"

content="text/html; charset=iso-

8859-1" />

<title>Comments</title>

</head>

<body>

2. PHP 태그를 추가하고, 첫 번째 주석을 작성한다.

<?php

# Created August 27, 2007

# Created by Larry E. Ullman

# This script does nothing much.

모든 스크립트의 첫 번째 주석은 작성일, 수정일,

작성자, 작성자의 연락처 등의 목록을 포함하는

것이 좋다.

어떤 사람들은, 쉘 스타일(shell-style)의 주석(#)이

눈에 더 잘 띄기 때문에 스크립트에서는 쉘 스타

일의 주석을 사용해야 한다고 주장하기도 한다.

3. 웹 브라우저로 간단한 HTML을 전송한다.

echo '<p>This is a line of text.

<br />This is another line of

text.</p>';

<다음 쪽에 계속>

Page 32: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

12

여기서는 무엇을 입력해도 상관이 없다. 웹 브라

우저에 무엇인가 출력이 되기만 하면 된다. 여러

이유 때문에 HTML 출력은 echo() 구문을 사용

하는데, HTML 페이지에 여백을 나타내기 위한

줄바꿈(<br />)을 하려는 목적도 있다.

4. 다중 행을 위한 주석 태그로 두 번째 echo() 구문

을 주석으로 처리하자.

/*

echo 'This line will not be

executed.';

*/

어떤 PHP 코드라도 /*와 */로 둘러싸기만 하면,

해당 코드를 삭제하지 않고도 작동하지 않도록

할 수 있다. 이후에 주석 태그를 제거하기만 하면

간단하게 다시 작동하도록 할 수 있다.

5. 세 번째 echo() 구문 뒤에 마지막 주석을 추가하

자.

echo "<p>Now, I'm done.</p>"; // End of PHP code.

마지막 주석은 행의 끝 부분에 주석을 작성하는

방법을 보여준다. 필자는, 작은따옴표가 소유격

부호와 충돌할 수 있으므로, 메시지를 출력할 때

에는 항상 큰따옴표를 사용한다 (6쪽의 사이드

바 “이스케이프의 필요”를 참고하라).

6. PHP 태그를 닫고 HTML 페이지를 완료한다.

?>

</body>

</html>

7. 파일을 comments.php로 저장하고, 웹 디렉터리

에 위치시킨 후, 웹 브라우저로 테스트해본다(그

림 1.10).

그림 1.10 스크립트 1.4의 PHP 주석은 웹페이

지나 HTML 소스(그림 1.11)에 나타나지 않는다.

Page 33: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

13

8. 웹 브라우저의 HTML 소스 코드를 살펴보면

PHP 주석이 웹 페이지에 나타나지 않는다는 사

실을 눈으로 확인할 수 있다(그림 1.11).

Tips

▒ 다중 행 주석 태그(/* */)를 중첩(태그 속에 또 태

그를 사용하는)해서 사용하면 오류가 발생한다.

▒ 모든 PHP 주석은 행의 끝에서 사용할 수 있다.

echo 'Howdy'; /* 안녕? */

이렇게 쓰는 것이 가능하지만, 일반적이지는 않

다.

▒ 모든 스크립트에 대해 주석을 작성하는 것은 사

실상 거의 불가능하다. 이 책에서도 지면을 절약

하기 위하여 꼭 필요한 주석만을 작성할 것이다.

▒ 스크립트가 변경되면 주석도 최신의 정보를 유지

해야 한다. 코드의 동작을 잘못 설명하는 주석처

럼 혼란스러운 것은 없다.

그림 1.11 스크립트 1.4의 PHP 주석은 사용자 브라우저의 어디에도 나타나지 않는다.

Page 34: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

14

변수란 무엇인가?변수는 일시적으로 값을 저장하는 저장소이다. 변수

는 숫자나 문자일 수도 있고, 좀 더 복잡한 데이터 일

수도 있다. PHP에는 스칼라 형인 Boolean(TRUE or

FALSE), integer(정수), ´oating point(부동소수점),

문자 4종류와 비 스칼라 형인 배열과 객체, 데이터베

이스 연동 시에 보게 되는 리소스, 값 없음을 의미하

는 특별한 형인 NULL까지 총 8개의 변수형이 존재

한다.

PHP에서 변수를 생성할 때에는, 그 형과는 상관없

이, 특정한 문법 규칙을 준수해야 한다.

◆ 변수명(또는 식별자)은 달러표시($)로 시작해야

한다. 예) $name

◆ 변수명은 문자와 숫자, 밑줄(_)을 포함할 수 있

다. 예) $my_report1

◆ 달러표시 다음 첫 번째 문자는 반드시 문자 또는

밑줄이어야 한다(숫자는 불가).

◆ PHP의 변수명은 대소문자를 구분하지 않는다.

이것은 매우 중요한 규칙으로, $name과 $Name

은 완전히 똑같은 변수를 가리킨다.

변수를 이용한 작업을 시작하기 위하여, PHP 스크립

트 구동 시에 자동으로 설정되는 몇몇 변수를 활용해

보자. 스크립트를 살펴보기 전에 먼저 알아두어야 할

두 가지 사항이 있다. 첫째는 할당연산자라고 하는

것으로, 변수는 등호(=)를 이용하여 값을 할당한다.

둘째, 변수는 따옴표 없이도 출력할 수 있다.

print $some_var;

Page 35: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

15

스크립트 1.5 미리 정의된 변수들 중 3개를 출력한다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

5 <title>Predefined Variables</title>

6 </head>

7 <body>

8 <?php # Script 1.5 - predefined.php

9

10 // Create a shorthand version of the variable names:

11 $file = $_SERVER['SCRIPT_FILENAME'];

12 $user = $_SERVER['HTTP_USER_AGENT'];

13 $server = $_SERVER['SERVER_SOFTWARE'];

14

15 // Print the name of this script:

16 echo "<p>You are running the file:<br /><b>$file</b>.</p>\n";

17

18 // Print the user's information:

19 echo "<p>You are viewing this page using: <br /><b>$user</b></p>\n";

20

21 // Print the server's information:

22 echo "<p>This server is running:<br /><b> $server</b>.</p>\n";

23

24 ?>

25 </body>

26 </html>

또한 변수는 큰따옴표 안에서도 출력할 수 있다.

print "Hello, $name";

그러나 작은따옴표 안에서는 출력할 수 없다.

print 'Hello, $name'; // 작동하지 않는다!

변수 사용하기:

1. 문서 편집기를 이용하여 HTML로 시작하는

PHP 문서를 생성하자(스크립트 1.5).

<!DOCTYPE html PUBLIC "-//W3C//

DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/

xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/

xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Predefined Variables</ title>

</head>

<body>

2. PHP 태그와 간단한 주석을 추가하자.

<?php # Script 1.5 - predefined.php

이후부터 필자는 작성자, 작성일 등의 주석을 더는

작성하지 않을 것이다. 그러나 편리한 상호 참조(이

책과 지원 웹 사이트, ‘www.DMCInsights.com/

phpmysql3/’에서 내려 받은 코드 간의 상호 참조)

를 위하여 스크립트 번호와 파일 이름은 항상 주

석으로 작성할 것이다.

Page 36: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

16

3. 첫 번째 변수를 간단한 이름의 변수에 새로 할당

한다.

$file = $_SERVER['SCRIPT_FILENAME'];

이 스크립트에서는 PHP에 미리 정의된

$_SERVER 변수로부터 나온 3개의 변수를 사

용한다. $_SERVER 변수는 서버 관련 정보를 많

이 가지고 있다. 여기서 사용하는 첫 번째 변수

$_SERVER['SCRIPT_FILENAME']은 현재 실

행되고 있는 스크립트의 완전한 경로와 이름을

저장하고 있다(예, C:\Program Files\Apache\

htdocs\prede©ned.php).

$_SERVER['SCRIPT_FILENAME']에 저장된

값을 새로운 변수 $©le에 할당하는데, 더 짧은 이

름으로 새로 정의된 변수에 $_SERVER 변수로

부터 값을 할당하면 해당 변수를 편리하게 참조

할 수 있기 때문이다.

4. 다른 두 개의 변수도 짧은 변수를 새로 선언하여

할당한다.

$user = $_SERVER['HTTP_USER_AGENT'];

$server = $_SERVER['SERVER_ SOFTWARE'];

$_SERVER['HTTP_USER_AGENT']는 스크립

트에 접근하는 사용자의 웹 브라우저와 운영체

제를 알려준다. 이 값은 $user에 할당되었다. $_

SERVER['SERVER_SOFTWARE']는 PHP를

실행하려면 반드시 설치돼 있어야 할 서버 애플리

케이션의 종류를 알려준다.

5. 실행 중인 스크립트의 이름을 출력해 본다.

echo "<p>지금 실행 중인 파일: <br /><b>$file</b>.</p>\n";

처음 출력될 변수는 $file이다. 변수가 큰따옴표

안에서 사용되었다는 것과 생성된 HTML 소스

에 줄 바꿈 문자를 추가하는 PHP의 줄 바꿈 문

자(\n)를 사용했다는 것에 주목하라. 생성된 웹

페이지의 외관을 위해서 단락(<P></p>)이나 볼

드체(<b></b>) 같은 기본적인 HTML 태그도 추

가되었다.

6. 스크립트를 실행한 사용자의 정보를 출력한다.

echo "<p>페이지 사용자의 정보: <br /> <b>$user</b></p>\n";

스텝 4에서 언급되었던 이야기를 반복하자면,

$user는 $_SERVER['HTTP_USER_AGENT']

변수와 연관되어 있으며, 웹페이지에 접근할 때

사용한 운영체제와 웹 브라우저의 종류 및 버전

을 저장하고 있다.

7. 서버 정보를 출력한다.

echo "<p>실행 중인 서버:<br /><b>$server</b>.</p>\n";

8. HTML과 PHP 코드를 완료한다.

?> </body> </html>

9. 파일 이름을 predefined.php로 저장하고, 웹 디

렉터리에 위치시킨 후, 웹 브라우저로 테스트해

본다(그림 1.12).

Page 37: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

17

그림 1.12 predefined.php 스크립트는 스크립트 자체

에 대한 정보와 스크립트를 실행하는 데 사용된 웹 브라우

저, 서버 등에 대한 정보를 알려준다.

그림 1.13 이 스크립트는 서버의 종류와 사용자 웹 브라

우저의 정보에 따라 출력되는 내용이 바뀌기 때문에 진정

한 첫 번째 동적 스크립트라고 할 수 있다.

Tips

▒ 이러한 과정을 따라하기가 어렵다면 이 책

의 웹 포럼에 도움을 요청할 수 있다(www.

DMCInsights.com/phorum/).

▒ 가능하면 여러 종류의 웹 브라우저와 서버에서

실행해 보자(그림 1.13).

▒ 변수를 생성할 때 가장 중요한 것은 일관된 작

명 규칙이다. 이 책에서는 변수명에 항상 소문자

를 사용하고, 단어의 분리를 위해 밑줄(_)을 사

용한다. 어떤 프로그래머는 밑줄 대신에 파스칼

표기법(Pascal Casing)을 사용하기도 한다(예,

$FirstName).

▒ PHP는 변수를 민감하게 다루지 않는다. 이것은

변수를 초기화하거나 선언할 필요가 없고, 다양

한 자료형 사이를 자유롭게 오갈 수 있다는 의미

이다.

Page 38: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

18

문자열 입문가장 먼저 문자열 변수형에 대해 자세히 알아보자. 문

자열은 인용된 문자의 집합일 뿐이며, 숫자, 공백, 마침

표 등을 모두 포함한다. 다음은 모두 정상적인 문자열

이다.

◆ 'Tobias'

◆ "In watermelon sugar"

◆ '100'

◆ 'August 2, 2006'

문자열 변수를 생성하기 위해서는 유효한 변수명에

문자열을 할당한다.

$first_name = 'Tobias';

$today = 'August 2, 2006';

문자열을 생성할 때는, 출력할 때와 마찬가지로 작은

따옴표나 큰따옴표를 모두 사용할 수 있다. 또한 출

력할 때와 마찬가지로 여닫는 따옴표는 동일한 종류

이어야 하고, 문자열 중간에 따옴표를 출력하려면 반

드시 이스케이프를 시켜야 한다.

$var = "Define \"platitude\", please.";

문자열을 출력하려면 echo()나 print()를 사용한다.

echo $first_name;

문맥 안에 문자열 변수 값을 출력하려면 큰따옴표를

사용해야 한다.

echo “Hello, $first_name”;

우리는 앞에서 미리 정의된 변수를 사용하여 문자열

을 다루어본 경험이 있다. 다음 예제에서는 새로운

문자열을 생성하고 사용해 볼 것이다.

Page 39: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

19

스크립트 1.6 문자열 변수가 생성되었고, 그 값이 웹 브라

우저로 전송되었다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

5 <title>Strings</title>

6 </head>

7 <body>

8 <?php # Script 1.6 - strings.php

9

10 // Create the variables:

11 $first_name = 'Haruki';

12 $last_name = 'Murakami';

13 $book = 'Kafka on the Shore';

14

15 //Print the values:

16 echo "<p>The book <em>$book</em> was written by $first_name $last_name.</p>";

17

18 ?>

19 </body>

20 </html>

문자열 사용하기:

1. 문서 편집기를 이용하여 HTML로 시작하는

PHP 문서를 생성하자(스크립트 1.6).

<!DOCTYPE html PUBLIC "-//W3C//

DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/

xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/

xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Strings</title>

</head>

<body>

<?php # Script 1.6 - strings.php

2. PHP 태그 안에 3개의 변수를 생성하자.

$first_name = 'Haruki';

$last_name = 'Murakami';

$book = 'Kafka on the Shore';

이 예제는 한 메시지에 출력될 $first_name과

$last_name, $book 변수를 생성한다.

3. echo() 구문을 추가하자.

echo "<p>The book <em>$book</em>

was written by $first_name

$last_name.</p>"''';

<다음 쪽에 계속>

Page 40: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

20

이 스크립트가 하는 일은 생성된 변수를 참조하

여 저작자 정보를 출력하는 것이다. 좀 더 깔끔

한 출력을 위하여 HTML 태그를 사용하였다. 변

수가 정확히 출력되려면 큰따옴표를 사용해야만

한다는 것을 명심하자.

4. HTML과 PHP 코드를 완료한다.

?>

</body>

</html>

5. 파일명을 strings.php으로 저장하고, 웹 디렉터리

에 위치시킨 후, 웹 브라우저로 테스트해보자(그

림 1.14).

6. 원한다면, 변수들의 값을 수정하고 저장한 다음,

다시 테스트해 볼 수도 있다(그림 1.15).

Tips

▒ 이미 생성되어 사용되는 변수에 다른 값을 할당

하면 새로운 값이 기존의 값을 덮어쓴다. 예를 들

면 아래와 같다.

$book = 'High Fidelity';

$book = 'The Corrections';

/* 이제 $book은 'The Corrections'이다. */

▒ PHP는 할당 가능한 문자열의 크기에 대한 제한

이 없다. 이것은 이론적으로 서버 자원이 허용하

는 한 어떤 크기라도 가능하다는 뜻이지만, 그런

상황에 부딪힐 일이 실제로 발생하는 일은 없을

것이다.

그림 1.14 이 웹페이지는 3개의 변수 값을 기반으로 출

력된다.

그림 1.15 변수의 값을 수정하니까 스크립트의 출력이

변경되었다.

Page 41: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

21

스크립트 1.7 문자열 연결(Concatenation)은 성과 이름

을 조합하여 저작자의 성명을 만드는 일과 같은 문자열 조작

을 도와준다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

5 <title>Concatenation</title>

6 </head>

7 <body>

8 <?php # Script 1.7 - concat.php

9

10 // Create the variables:

11 $first_name = 'Melissa';

12 $last_name = 'Bank';

13 $author = $first_name . ' ' . $last_name;

14

15 $book = 'The Girls\' Guide to Hunting and Fishing';

16

17 //Print the values:

18 echo "<p>The book <em>$book</em> was written by $author.</p>";

19

20 ?>

21 </body>

22 </html>

문자열 연결하기연결은 문자열의 추가를 의미하는 데, 새로운 문자열

이 기존 문자열의 끝에 덧붙는다. 이것은 연결 연산자

인 마침표(.)에 의해서 수행된다.

$city= 'Seattle';

$state = 'Washington';

$address = $city . $state;

$address 변수는 이제 SeattleWashington이라는 값

을 가지게 되는데, 이것은 우리가 원하는 결과에 거의

근접했다. 좀 더 개선하려면 다음처럼 써야 한다.

$address = $city . ', ' . $state;

이제는 콤마와 공백이 추가되었다.

연결은 문자열과 숫자를 함께 사용할 수도 있다. 아

래의 2개의 문장은 똑같은 결과를 나타낼 것이다

(Seattle, Washington 98101).

$address = $city . ', ' . $state .

' 98101';

$address = $city . ', ' . $state .

' ' . 98101;

이 새로운 연산자(.)를 이용하여 strings.php를 수정

해 보자.

연결 사용하기:

1. 문서 편집기로 strings.php를 열자.

2. $first_name과 $last_name을 할당하고 다음의

행을 추가하자(스크립트 1.7)

$author = $first_name . ' ' .

$last_name;

이 결과로 이미 존재하는 두 문자열에 공백이 추

가된 새로운 $author 변수가 생성된다.

Page 42: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

22

3. $author 변수를 출력하도록 echo() 문을 수정해

보자.

echo "<p>The book <em>$book</em> was written by $author.</p>";

2개의 변수가 하나가 되었기 때문에 echo() 문도

따라서 변경되어야 한다.

4. 원한다면 HTML 페이지의 제목, 저작자의 성명,

$book 변수를 변경할 수 있다.

5. 파일 이름 concat.php로 저장하고, 웹 디렉터리

에 위치시킨 후, 웹 브라우저로 테스트해본다(그

림 1.16)

Tips

▒ PHP는 유용한 문자열 함수가 많이 있는데, 이 책

을 함께 진행하면서 차츰 보게 될 것이다. 예로,

문자열의 길이를 계산하려면 strlen() 함수를 사

용해야 한다.

$num = strlen('some string');

▒ 또한 문자열 전체를 소문자로 변경하는 strtolower(),

문자열 전체를 대문자로 변경하는 strtoupper(),

문자열의 첫 번째 문자만 대문자로 만들어 주는

uc©rst(), 모든 단어의 첫 번째 문자를 대문자로 만들

어 주는 ucwords() 등을 사용할 수 있다.

▒ 단순히 한 문자열을 다른 문자열과 연결하려면

연결 할당 연산자(.=)를 사용할 수 있다.

아래의 두 구문은 같은 일을 한다.

$title = $title . $subtitle;

$title .= $subtitle;

▒ 이 절 도입부의 예제는 아래 두 가지 방법으로 다

시 작성할 수 있다.

$address = "$city, $state";

또는

$address = $city;

$address .= ', ';

$address .= $state;

그림 1.16 재작성된 이 스크립트에서는 문자열 연결의 결

과가 잘 드러나지 않는다(그림 1.14와 1.15를 비교해 보라)

Page 43: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

23

숫자형 입문변수를 처음 소개할 때 PHP가 정수형과 부동소수점

형을 가지고 있다고 이야기했었다. 필자의 경험상 이

두 타입은 좀 더 일반적인 명칭인 숫자로 분류되어야

한다(대부분의 경우에 그렇다는 말이다). PHP에서 유

효한 숫자 타입 변수들은 다음과 같다.

◆ 8

◆ 3.14

◆ 10980843985

◆ -4.2398508

◆ 4.4e2

숫자 값은 인용할 수 없으며(인용하면 숫자가 포함된

문자열이 된다), 천 단위 콤마를 포함하지도 않는다. 또

한 뺄셈 기호(-)로 시작되지 않는 한 양수로 가정된다.

숫자는 표준 산술 연산자와 함께 사용할 수 있으며(표

1.1), 수십 가지의 함수가 존재한다. 그 중 많이 쓰이는

두 가지 함수가 round()와 number_format()이다.

표 1.1 표준 산술 연산자

산술 연산자

연산자 의미

+ 덧셈

- 뺄셈

* 곱셈

/ 나눗셈

% 나머지

++ 증가

-- 감소

round()는 가장 근사한 정수 값으로 반올림을 수행

한다.

$n = 3.14;

$n = round ($n); // 3

round()는 특정한 소수점 자릿수로 반올림을 할 수

도 있다.

$n = 3.142857;

$n = round ($n, 3); // 3.143

number_format() 함수는 천 단위 콤마를 표시하는

등의 특정한 형태로 숫자를 변환할 수 있다.

$n = 20943;

$n = number_format ($n); // 20,943

이 함수 역시 소수점 이하 자릿수를 지정할 수 있다.

$n = 20943;

$n = number_format ($n, 2); // 20,943.00

실습을 위하여, 전자상거래의 쇼핑카트에서 계산을

수행하는 스크립트를 작성해 보자.

Page 44: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

24

수 사용하기:

1. 텍스트 편집기로 새로운 PHP 문서를 작성하자

(스크립트 1.8).

<!DOCTYPE html PUBLIC "-//W3C//

DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/

xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/

xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Numbers</title>

</head>

<body>

<?php # Script 1.8 - numbers.php

2. 필요한 변수를 선언한다.

$quantity = 30;

$price = 119.95;

$taxrate = .05;

계산을 위해서는 값이 미리 할당된 3개의 변수를

사용할 것이다. 이 책의 후반에서는 동적으로 변

수의 값을 할당하는 방법도 알아본다.

3. 계산을 수행하자.

$total = $quantity * $price;

$total = $total + ($total * $taxrate);

첫 행은 가격과 구매한 물품 수를 곱한 주문 총액

을 계산한다. 두 번째 행에서는 총액에 세금(세율

에 총액을 곱하여 얻는다)을 더한다.

스크립트 1.8 numbers.php 스크립트는 전자상거래에서

쓰이는 기본적인 산술 연산을 보여준다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML

1.0 Transitional//EN" "http://www.w3.org/

TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml"

xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content=

"text/html; charset=iso-8859-1" />

5 <title>Numbers</title>

6 </head>

7 <body>

8 <?php # Script 1.8 - numbers.php

9

10 // Set the variables:

11 $quantity = 30; // Buying 30 widgets.

12 $price = 119.95;

13 $taxrate = .05; // 5% sales tax.

14

15 // Calculate the total:

16 $total = $quantity * $price;

17 $total = $total + ($total * $taxrate); //

Calculate and add the tax.

18

19 // Format the total:

20 $total = number_format ($total, 2);

21

22 // Print the results:

23 echo '<p>You are purchasing <b>' .

$quantity . '</b> widget(s) at a cost

of <b>$' . $price . '</b> each. With

tax, the total comes to <b>$' . $total .

'</b>.</p>';

24

25 ?>

26 </body>

27 </html>

Page 45: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

25

4. 계산된 총액을 형식화한다.

$total = number_format ($total, 2);

여기서 number_format() 함수는 천 단위 콤마

를 추가하고, 소수점 둘째 자리에서 반올림을 한

다. 이렇게 하면 사용자는 더 편하게 연산 결과를

읽을 수 있다.

5. 연산 결과를 출력한다.

echo '<p>You are purchasing <b>' . $quantity . '</b> widget(s) at a cost of <b>$' . $price . '</b> each. With tax, the total comes to <b>$' . $total . '</b>.</p>';

연산 결과를 화면에 출력하기 위해 HTML과 달

러 표시($), 변수를 작은따옴표와 연결 연산자를

사용하여 연결하였다.

모든 문자열을 큰따옴표로 감싸버린다면, at a

cost of $$price 때문에 오류가 발생할 것이다. 1

장의 끝에서 이러한 문제에 대한 해결책을 알아

본다.

6. PHP 코드와 HTML 페이지를 완료한다.

?>

</body>

</html>

7. 파일 이름 numbers.php로 저장하고, 웹 디렉터

리에 위치시킨 후, 웹 브라우저로 테스트해본다

(그림 1.17).

8. 테스트를 좀 더 해보려면 변수의 초깃값을 변경

하고 다시 실행해 보라(그림 1.18).

그림 1.17 스크립트 1.8을 실행한 웹페이지는 변수에 할당

된 값으로 연산을 수행한다.

그림 1.18 생성된 웹페이지의 내용을 변경하려면 변수에

할당된 값을 변경하면 된다(그림 1.17과 비교해보라).

Page 46: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

26

Tips

▒ PHP의 정수형은 대부분의 플랫폼에서 최대

2,000,000,000까지 표현할 수 있다. 그보다 더 큰

수가 사용되면, 자동으로 부동소수점형이 된다.

▒ 숫자를 계산할 때에는 우선순위를 따져야 할 경

우가 발생한다. PHP 매뉴얼에서 우선순위의 체

계를 일일이 나열하고 있지만, 괄호를 사용해서

그룹을 만들어 실행 순서를 강제로 조정하는 것

이 더 안전하고 읽기도 쉽다(스크립트 1.8의 17행

을 보라).

▒ 컴퓨터는 소수를 다루는 데 소질이 없다. 예를 들

어 2.0은 사실 1.99999로 저장된다. 대부분의 경

우에는 이것이 문제가 되지 않지만, 정수를 사용

하는 높은 정밀도를 요구하는 연산에서는 문제

가 될 수 있다. PHP 메뉴얼에 이러한 문제에 관한

정보와 정확도를 향상시키는 함수들이 소개되어

있다.

▒ 대부분의 산술 연산자에는 대응하는 할당 연산

자가 있다.

$total = $total + ($total * $taxrate);

다음처럼 변경될 수 있다.

$total += ($total * $taxrate);

▒ $price를 두 자리 수의 소수로 설정하지 않는다

면, 출력하기 전에 number_format() 함수를 적

용해야 한다.

Page 47: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

27

상수 입문하기상수도 변수처럼 값을 일시적으로 저장하는 데 사

용되지만 상수와 변수는 많은 측면에서 다르다. 먼

저 상수를 생성하기 위해서는 할당연산자(=) 대신에

de©ne() 함수를 사용해야 한다.

define('NAME', 'value');

강제적인 사항은 아니지만, 상수명은 관례로 대문자

를 사용한다. 가장 중요한 것은 상수는 변수처럼 이

름 앞에 달러 표시($)를 사용하지 않는다는 것이다

(상수는 변수가 아니기 때문이다).

상수에는 문자나 숫자 같은 스칼라 값만 할당될 수

있으며, 변수와는 다르게 한번 할당된 값은 변경될

수 없다.

화면 출력을 위해 상수를 참조할 때에는 인용부호를

사용하면 안 된다.

echo "Hello, USERNAME"; // 잘못된 참조이다.

이 코드는 상수 USERNAME의 값을 출력하는 것이

아니라 문자열 Hello USERNAME을 그대로 출력한

다. 대신 아래의 두 코드가 정확한 상수의 값을 출력

할 것이다.

echo 'Hello, ';

echo USERNAME;

또는 연결 연산자(.)를 사용한다.

echo 'Hello, ' . USERNAME;

PHP에는 1장 초반에 다룬 미리 정의된 변수처럼 미

리 정의된 상수가 몇 개 있는데, PHP_VERSION(실

행되는 PHP의 버전을 나타낸다)과 PHP_OS(서버의

운영체제)도 그 중 하나이다.

Page 48: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

28

상수 사용하기:

1. 문서 편집기로 새로운 PHP 문서를 작성한다(스

크립트 1.9).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/ DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Constants</title>

</head>

<body>

<?php # Script 1.9 - constants.php

2. 날짜가 저장된 상수를 생성한다.

define ('TODAY', '2007년 8월 28일');

이 예제는 간단하지만, 핵심을 잘 보여준다. 8장,

“MySQL과 PHP 연동”에서는 데이터베이스 접속

정보를 저장하기 위해서 상수를 사용하는 방법

에 대해 알아볼 것이다.

3. 날짜와 PHP의 버전, 운영체제 정보를 출력하자.

echo '<p>오늘은' . TODAY . ' 입니다.<br />실행 중인 PHP 버전은 <b>' . PHP_VERSION . '</b> 이고, <b>' . PHP_OS . '</b> 운영체제에서 위에서 동작하고 있습니다. </p>';

상수는 인용부호 안에서 참조될 수 없으므로 연

결 연산자(.)를 사용해야 한다.

스크립트 1.9 상수는 변수와는 구별되는 또 하나의 임시

저장소이다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

5 <title>Constants</title>

6 </head>

7 <body>

8 <?php # Script 1.9 - constants.php

9

10 // Set today's date as a constant:

11 define ('TODAY', 'August 28, 2007');

12

13 // Print a message, using predefined constants and the TODAY constant:

14 echo '<p>Today is ' . TODAY . '.<br />This server is running version <b>' . PHP_ VERSION . '</b> of PHP on the <b>' . PHP_ OS . '</b> operating system.</p>';

15

16 ?>

17 </body>

18 </html>

Page 49: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

29

4. PHP 코드와 HTML을 완료한다.

?>

</body>

</html>

5. 파일 이름 constants.php로 저장하고, 웹 디렉터

리에 위치시킨 후, 웹 브라우저로 테스트해보자

(그림 1.19).

Tips

▒ 가능하면 다른 서버에서도 이 스크립트를 실행해

보자(그림 1.20).

▒ 11장 “쿠키와 세션”에서는 SID라는 특별한 상수

에 대해 알아본다.

그림 1.19 상수의 사용을 배우면서 PHP 설치 정보에 대해

서 알게 되었다.

그림 1.20 같은 스크립트라도 다른 서버에서 실행하면 다

른 결과가 나타날 수 있다.

Page 50: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

30

작은따옴표와 큰따옴표PHP에서 작은따옴표와 큰따옴표의 차이점을 아는

것은 매우 중요하다. 지금까지의 예에서 알 수 있듯이

echo()나 print()를 사용할 때, 또는 변수에 값을 할

당할 때에 작은따옴표와 큰따옴표를 모두 사용할 수

있다. 그러나 두 인용부호 사이에는 결정적인 차이점

이 있다. 이전에 잠깐 이 차이점에 대해서 설명했지만

더 자세한 설명이 꼭 필요하다.

PHP는 작은따옴표 안에 있는 모든 내용을 문자로

취급해 버리는 반면, 큰따옴표 안에 있는 값은 파싱

을 수행한다. 다시 말해, 큰따옴표 안에 있는 변수나

특수문자를 해석하여 변수는 변수의 값으로, 특수

문자는 특수문자 코드에 해당되는 값으로 치환하는

작업을 거친 후 출력된다는 것이다. 예를 들어 아래

와 같은 변수를 사용하고 있다고 가정하면,

$var = 'test';

echo "var is equal to $var"; 라는 코드는 var is equal

to test로 출력되고, 'var is equal to $var';는 var is

equal to $var가 그대로 출력된다. 달러 표시($)를 이

스케이프시킨 echo "\$var is equal to $var";는 $var

is equal to test로 출력되고, echo '\$var is equal to

$var';는 \$var is equal to $var로 출력될 것이다.

이 예에서 알 수 있듯이 큰따옴표는 변수의 값(test)

으로 변수의 이름($var)을 대체하고, 특수문자 코드

(\$)는 그 코드가 가리키는 값($)으로 대체한다. 작은

따옴표는 정확히 입력한 문자를 그대로 출력하지만,

이스케이프된 작은따옴표(\')나 역슬래시(\\)는 각각

작은따옴표와 역슬래시로 출력된다.

두 인용부호가 또 어떻게 다른지 보여주는 예제를 위

해 numbers.php 스크립트를 수정해 보자.

표 1.2 이러한 문자들은 큰따옴표 안에서 사용될 때에만

특수한 의미를 가진다.

이스케이프 시퀀스

코드 의미

\" 큰따옴표(이중 인용부호)

\' 작은따옴표(단일 인용부호)

\\ 역슬래시

\n 줄바꿈

\r 캐리지 리턴

\t 탭

\$ 달러기호

Page 51: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

PHP 입문

31

작은따옴표와 큰따옴표 사용하기:

1. 문서 편집기로 numbers.php(스크립트 1.8)을 불

러온다.

2. 기존의 echo()문을 삭제하자(스크립트 1.10).

3. 표제를 출력하고 원래의 echo()문을 큰따옴표를

사용하여 다시 작성하라.

echo '<h3>Using double quotation marks:</h3>';

echo "<p>You are purchasing <b>$ quantity</b> widget(s) at a cost of <b>\$$price</b> each. With tax, the total comes to <b>\$$total</ b>.</p>\n";

원래의 스크립트에서는 작은따옴표와 문자열 결

합을 같이 사용했는데, 큰따옴표만을 사용해도

같은 결과를 얻을 수 있다. 큰따옴표를 사용할 때

는 변수가 문자열 사이에 있어야 한다. 달러의 금

액을 출력하려면 코드에서 볼 수 있듯이 \$$var

를 사용해야 하는데, 이스케이프된 첫 번째 달러

표시는 그대로 출력될 것이고, 두 번째 달러 표시

는 변수명의 시작이 된다.

스크립트 1.10 이것은 작은따옴표와 큰따옴표 사이의 차

이점을 보여준다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

5 <title>Quotation Marks</title>

6 </head>

7 <body>

8 <?php # Script 1.10 - quotes.php

9

10 // Set the variables:

11 $quantity = 30; // Buying 30 widgets.

12 $price = 119.95;

13 $taxrate = .05; // 5% sales tax.

14

15 // Calculate the total.

16 $total = $quantity * $price;

17 $total = $total + ($total * $taxrate); // Calculate and add the tax.

18

19 // Format the total:

20 $total = number_format ($total, 2);

21

22 // Print the results using double quotation marks:

23 echo '<h3>Using double quotation marks:</h3>';

24 echo "<p>You are purchasing <b>$quantity </b> widget(s) at a cost of <b>\$$price</b> each. With tax, the total comes to <b>\ $$total</b>.</p>\n";

25

26 // Print the results using single quotation marks:

< 스크립트 계속>

스크립트 1.10 계속

27 echo '<h3>Using single quotation marks:</h3>';

28 echo '<p>You are purchasing <b>$quantity </b> widget(s) at a cost of <b>\$$price</b> each. With tax, the total comes to <b>\$$total</b>.</p>\n';

29

30 ?>

31 </body>

32 </html>

Page 52: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

1 장

32

4. 이번에는 작은따옴표를 사용해서 echo() 문을

반복해 보자.

echo '<h3>Using single quotation marks:</h3>';

echo '<p>You are purchasing <b>$ quantity</b> widget(s) at a cost of <b>\$$price</b> each. With tax, the total comes to <b>\$$total </b>.</p>\n';

이 echo() 문은 작은따옴표와 큰따옴표 간의 차

이를 강조하기 위해서 사용되었다. 결과 페이지가

보여주듯이, 위 코드는 우리가 원하는 대로 동작

하지 않을 것이다.

5. 원한다면 페이지 제목을 변경할 수도 있다.

6. 파일 이름 quotes.php로 저장하고 웹 디렉터리에

위치시킨 후, 웹 브라우저로 테스트해보자(그림

1.21).

7. 각 인용부호 안에서 어떻게 줄바꿈 문자(\n)가

다르게 처리되는지 웹페이지의 소스를 보자.

큰따옴표 안에 줄바꿈 문자를 입력하면 HTML

소스에 새로운 행이 생긴다는 것에 주목해야 한

다. 만약 작은따옴표 안에 입력한다면 \과 n이 그

대로 출력된다.

Tips

▒ 큰따옴표 안에서는 PHP가 변수를 찾기 위해 파

싱을 수행하기 때문에 작은따옴표가 이론적으로

더 빠르다. 그러나 변수의 값을 출력하려면 큰따

옴표를 사용해야 한다.

▒ 보통 HTML은 많은 큰따옴표를 포함하기 때문

에, PHP에서는 HTML의 출력을 위해 작은따옴

표를 사용하는 것이 좋다.

echo '<table width="80%" border="0" cellspacing="2" cellpadding="3" align="center">';

큰따옴표로 HTML을 출력하려면 문자열 내의

큰따옴표를 모두 이스케이프시켜야 한다.

echo "<table width=\"80%\" border=\ "0\" cellspacing=\"2\" cellpadding =\"3\" align=\"center\">";

그림 1.21 이 결과는 언제 어떻게 인용부호를 선택해서 사

용해야 하는지를 보여준다. 이 두 인용부호 간의 차이를 아직

도 잘 모르겠다면 무조건 큰따옴표를 사용하라. 그러면 문제

가 덜 발생한다.

Page 53: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

33

이제는 PHP 스크립트 작성을 위한 기본을 갖추었다. 이 기본을 바탕으로 진정한 프로그래밍을 시작해 보자.

2장에서는 좀 더 정교한 스크립트를 작성하면서 언어의 기본 구문, 함수, 문법 등을 계속 배워 나갈 것이다.

먼저 HTML 폼(form)을 만들고, 폼에서 제출된 값을 PHP로 처리하는 방법에 대해 배운다. 다음으로 조건

절과 아직 다루지 않은 연산자(1장에서는 할당, 연결, 산술 연산자를 소개하였다), 배열(변수형의 일종), 그리

고 마지막 언어 구성 요소인 루프(loop)를 배운다.

02PHP 프로그래밍

Page 54: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

34

2 장

HTML 폼 만들기PHP로 HTML 폼을 처리하는 일은 모든 동적 웹 사

이트에 있어 가장 중요한 부분이다. 이 과정은 보통

두 단계로 나눌 수 있는데, 첫 단계는 HTML 폼 자체

를 만드는 과정이고, 다음 단계는 폼 데이터를 넘겨

받아 처리하는 PHP 스크립트를 작성하는 과정이다.

HTML 폼에 대해 자세히 다루는 것은 이 책의 범위

를 벗어난다. 여기서는 2장에서 계속 사용할 HTML

폼 예제 하나를 먼저 작성할 것이다. 만약 HTML 폼

이나 여러 타입의 HTML 요소(Elements)가 익숙하

지 않다면, HTML 관련 문서를 참조하라.

HTML 폼은 폼 태그와 값을 입력받기 위한 다양한

HTML 요소로 만들어진다. 폼 태그는 다음과 같이

사용한다.

<form action="script.php" method="post">

</form>

PHP의 관점에서 가장 중요한 폼 태그의 속성은

action인데, action은 폼 데이터가 전송될 페이지를

가리킨다. 두 번째 속성인 method도 아주 중요한

데(사이드바를 참고하라), 아마도 대부분의 경우에

post를 사용하게 될 것이다.

여러 HTML 입력 요소가 폼 태그 사이에 위치하게

된다. 다음 절에서 보게 되겠지만, 입력 요소의 종류

에 따라 PHP에서 처리하는 방법이 조금씩 달라진

다. 또한 name 속성은 PHP 코드로 값이 넘어왔을

때 가장 중요하게 처리해야 하므로 주의를 기울여야

한다.

메서드 선택하기

폼의 method 속성은 데이터를 보내는 방식을 결

정한다. HTTP(HyperText Transfer Protocol)에

서는 두 가지 전송 방식(get과 post)을 사용할 수

있다. get 방식은 URL로부터 ‘이름=값’ 쌍의 시리

즈를 연속해서 넘겨주는 방법으로 페이지에 데이

터를 넘겨준다. 예를 들어 보자.

http://www.example.com/script.php? name=Homer&gender=M&age=35

get 방식을 사용할 때 좋은 점은 페이지가 사용자

웹 브라우저의 즐겨찾기에 추가될 수 있다는 것이

다. 브라우저의 뒤로가기 버튼을 클릭하여 get 페

이지로 돌아갈 수도 있고, 자유롭게 새로고침도

할 수 있다(post는 그렇지 못하다). 그렇지만 get

방식은 전송할 수 있는 데이터의 크기에 제한이

있고, 데이터를 눈으로도 볼 수 있기 때문에 보안

에 취약하다.

일반적으로 get은 데이터베이스의 특정 레코드

나 검색의 결과 같은 정보를 요청하는 데 사용된

다. post 방식은 데이터베이스의 레코드를 업데이

트하거나 이메일 같은 정보를 전송해야 할 경우에

필요하다. 이러한 이유로 이 책에서는 특별한 경우

가 아니면 주로 post를 사용할 것이다.

Page 55: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

35

PHP 프로그래밍

HTML 폼 만들기:

1. 문서 편집기로 새로운 HTML 문서를 작성한다

(스크립트 2.1).

<!DOCTYPE html PUBLIC "-//W3C//

DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/

xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/

xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Simple HTML Form</title>

</head>

<body>

<!-- 스크립트 2.1 - form.html -->

특별히 새로운 것은 없다. 이 문서는 1장처럼 기본

적인 HTML 문법만을 사용하고 있으며 HTML

주석으로 파일의 이름과 번호를 나타낸다.

2. 폼 태그의 머리부분을 추가한다 .

<form action="handle_form.php" method="post">

action 속성으로 form 데이터를 전송할 위치를

지정하므로, 정확한 파일 이름을 입력해야 한다.

3. HTML 폼을 시작한다.

<fieldset><legend>Enter your information in the form below:</legend>

©eldset 태그와 legend 태그를 사용했는데, 필자

는 이 두 태그를 이용하여 폼의 외형을 꾸미는 것

을 좋아한다(제목과 함께 폼을 감싸는 박스가 나

타난다).

스크립트 2.1 이 HTML폼이 2장의 여러 예제에서 사용될

것이다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />

5 <title>Simple HTML Form</title>

6 </head>

7 <body>

8 <!-- Script 2.1 - form.html -->

9

10 <form action="handle_form.php" method="post">

11

12 <fieldset><legend>Enter your information in the form below:</legend>

13

14 <p><b>Name:</b> <input type="text" name="name" size="20" maxlength="40" /></p>

15

16 <p><b>Email Address:</b> <input type="text" name="email" size="40" maxlength="60" /></p>

17

18 <p><b>Gender:</b> <input type="radio" name="gender" value="M" /> Male <input type="radio" name="gender" value="F" /> Female</p>

19

20 <p><b>Age:</b>

21 <select name="age">

22 <option value="0-29">Under 30</option>

23 <option value="30-60">Between 30 and 60</option>

<다음 쪽에 스크립트 계속>

Page 56: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

36

2 장

4. 2개의 텍스트 입력 상자를 추가한다 .

<p><b>Name:</b> <input type="text" name="name" size="20" maxlength= "40" /></p>

<p><b>Email Address:</b> <input type="text" name="email" size="40" maxlength="60" /></p>

이것은 사용자의 이름과 이메일 주소를 입력받

는 텍스트 입력 상자이다(그림 2.1). input 태그

의 끝에 붙은 공백과 역슬래시는 유효한(valid)

XHTML을 위해 꼭 필요하다. 표준 HTML에서

는 maxlength="40"> 또는 maxlength="60">처

럼 끝날 것이다.

5. 2개의 라디오 버튼을 추가한다.

<p><b>Gender:</b> <input type= "radio" name="gender" value= "M" /> Male <input type= "radio" name="gender" value= "F" /> Female</p> instead.

라디오 버튼 그룹은 같은 name을 가지게 되는데,

여기서는 둘 중 하나의 값만을 선택할 수 있다. 물

론 이들은 서로 다른 값을 가지고 있다.

6. 풀다운 메뉴(pull-down Menu)를 추가한다.

<p><b>Age:</b>

<select name="age">

<option value="0-29">Under 30</ option>

<option value="30-60">Between 30 and 60</option>

<option value="60+">Over 60</ option>

</select></p>

select 태그로 풀다운 메뉴를 시작하고, option

태그로 각 선택 항목을 구성한다(그림 2.3).

스크립트 2.1 계속

24 <option value="60+">Over 60</option>

25 </select></p>

26

27 <p><b>Comments:</b> <textarea name="comments" rows="3" cols="40"></textarea></p>

28

29 </fieldset>

30

31 <div align="center"><input type= "submit" name="submit" value= "Submit My Information" /></div>

32

33 </form>

34

35 </body>

36 </html>

그림 2.1 텍스트 입력 상자 2개

그림 2.2 2개 이상의 라디오 버튼이

같은 name을 가지고 있으면, 그 중 한

개만 선택할 수 있다.

Page 57: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

37

PHP 프로그래밍

7. 코멘트를 입력할 텍스트 상자를 추가한다.

<p><b>Comments:</b> <textarea name= "comments" rows="3" cols="40"></

textarea></p>

textarea는 text 입력상자와는 다르며, 여러 행

을 입력할 수 있는 커다란 박스로 표현된다(그림

2.4). textarea에는 많은 내용을 입력할 수 있기

때문에 사용자의 코멘트를 입력받기에 적합하다.

8. 폼을 종료한다.

</fieldset>

<div align="center"><input type= "submit" name="submit" value= "Submit My Information" /></div>

</form>

첫 태그로 스텝 3에서 시작했던 ©eldset을 종료한

다. 그 뒤에 전송 버튼을 생성하고, div 태그로 중

앙 정렬하였다. 끝으로 폼 태그가 종료되었다.

9. HTML 페이지를 종료한다.

</body>

</html>

10. 파일 이름 form.html로 저장하고, 웹 디렉터리에

위치시킨 후, 웹 브라우저로 테스트해보자(그림

2.5).

Tips

▒ 이 페이지가 HTML만을 포함하기 때문에 .html

확장자를 사용하지만, .php 확장자도 아무런 문

제 없이 사용할 수 있다(PHP 태그 외부에 있는

코드는 HTML로 취급되기 때문이다).

그림 2.3 이 풀다운 메뉴는

3개의 선택항목이 있고, 그 중

한 개만 선택할 수 있다

(이 예제에서는 그렇다).

그림 2.4 textarea 폼 요소에는 많은 양의 텍스트를 입력

할 수 있다.

그림 2.5 완성된 폼이다. 이 폼은 사용자의 기본정보 입력

을 요청한다.

Page 58: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

38

2 장

HTML 폼 처리하기HTML 폼이 만들어졌고, 이제는 이 폼을 처리하기

위한 PHP 스크립트를 작성해야 한다. 스크립트로 폼

을 처리한다는 것은 PHP 페이지가 전달받은 데이터

(사용자가 폼에 입력하여 제출한 데이터)로 무언가를

한다는 의미이다. 2장에서는 전송받은 데이터를 그대

로 웹 브라우저에 출력할 것이다. 마지막 예제에서는

폼 데이터가 MySQL 데이터베이스에 저장되고, 이전

에 저장된 값과 비교되며, 그 값을 이메일로 전송하

는 등의 일을 할 것이다.

PHP의 아름다움은 HTML 폼과 상호작용하는 방법

에 달려 있다. PHP 스크립트는 폼에서 전달받은 값

을 특별한 변수에 저장한다. 예를 들어 다음과 같은

텍스트 입력 박스가 포함된 폼이 있다고 해보자.

<input type="text" name="city" />

사용자가 어떤 내용을 입력하더라도 변수

$_REQUEST['city']를 통해 입력 값에 접근할 수 있는

데, 철자와 대소문자가 정확해야 한다는 것에 유의하

라. PHP는 변수의 이름에 대소문자를 정확하게 구분

하기 때문에, $_REQUEST['city']는 정상적으로 동작

하지만 $_Request['city'] 또는 $_REQUEST['City']에

는 아무런 값도 담겨 있지 않을 것이다.

다음 예제는 이미 생성된 HTML 폼을 처리하는 PHP

스크립트이다(스크립트 2.1). 이 스크립트는 넘겨받

은 폼 데이터를 새로운 변수에 할당하고(스크립트 1.5

prede©ned.php에서와 같이 긴 변수명을 약어로 간편

하게 참조하기 위해서다), 그 변수를 웹 페이지에 출력

할 것이다.

HTML 폼 다루기:

1. 문서 편집기로 새로운 PHP 문서를 작성한다(스

크립트 2.2).

<!DOCTYPE html PUBLIC "-//W3C//

DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/

스크립트 2.2 이 스크립트는 HTML 폼으로 제출된 정보를

넘겨받아 출력한다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />

5 <title>Form Feedback</title>

6 </head>

7 <body>

8 <?php # Script 2.2 - handle_form.php

9

10 // Create a shorthand for the form data:

11 $name = $_REQUEST['name'];

12 $email = $_REQUEST['email'];

13 $comments = $_REQUEST['comments'];

14 /* Not used:

15 $_REQUEST['age']

16 $_REQUEST['gender']

17 $_REQUEST['submit']

18 */

19

20 // Print the submitted information:

21 echo "<p>Thank you, <b>$name</b>, for the following comments:<br />

22 <tt>$comments</tt></p>

23 <p>We will reply to you at <i>$email</i>.</p>\n";

24

25 ?>

26 </body>

27 </html>

Page 59: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

39

PHP 프로그래밍

xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/

xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Form Feedback</title>

</head>

<body>

2. PHP 태그를 추가하고 폼 데이터 변수를 할당할

간단한 이름의 변수를 생성한다.

<?php # Script 2.2 - handle_form.php

$name = $_REQUEST['name'];

$email = $_REQUEST['email'];

$comments = $_REQUEST['comments'];

이전에 소개한 규칙에 따라, name이라는 이름

을 가진 첫 번째 텍스트 입력 박스에 입력된 데

이터는 $_REQUEST['name']으로 접근할 수 있

다(표 2.1). email 입력 박스에 입력된 데이터는

$_REQUEST['email']을 통해 접근할 수 있으며,

코멘트도 똑같은 형식으로 접근하면 된다. 다시

강조하지만 철자와 대소문자는 HTML 폼에서의

name 속성에 지정된 값에 대응하여 정확하게 일

치해야 한다.

3. 전달받은 이름과 이메일, 코멘트를 출력해보자.

echo "<p>Thank you, <b>$name</b>, for the following comments:<br />

<tt>$comments</tt></p>

<p>We will reply to you at <i> $email</i>.</p>\n";

echo() 문에 큰따옴표와 약간의 HTML 형식화

를 더해 간단히 출력하였다.

표 2.1. HTML 폼 요소와 그에 대응하는 PHP 변수

폼 요소와 PHP 변수

요소 이름 변수명

name $_REQUEST['name']

email $_REQUEST['email']

comments $_REQUEST['comments']

age $_REQUEST['age']

gender $_REQUEST['gender']

submit $_REQUEST['submit']

Page 60: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

40

2 장

4. HTML 페이지를 완료한다.

?>

</body>

</html>

5. 파일 이름은 handle_form.php로 하고 form.

html이 위치한 디렉터리에 저장한다.

6. 테스트를 위해 웹 브라우저로 form.html을 불러

와서 폼에 채우고 전송해 본다(그림 2.6과 그림

2.7).

PHP 스크립트는 반드시 URL을 통해 실행되어

야 하므로, 이 폼 또한 URL을 통하여 실행되어야

한다. 그렇지 않으면 폼을 전송할 때 적절한 결과

값(그림 2.7) 대신 PHP 코드(그림 2.8)를 보게 될

것이다.

Tips

▒ $_REQUEST는 이른바 superglobal로 알려진

특별한 변수이다. 이 변수는 get이나 post 뿐만 아

니라 쿠키로 접근 가능한 값 등 PHP 페이지로 전

달된 모든 데이터를 저장하고 있다. superglobal

은 2장의 후반에서 좀 더 상세하게 다룰 것이다.

▒ 스크립트를 실행하는 데 문제가 있다면 1장에서

소개된 디버깅 테크닉을 적용하라. 그래도 문제

가 풀리지 않으면 7장, “오류 처리와 디버깅”에 소

개된 디버깅 테크닉을 사용해 본다. 그래도 곤란

한 상황이 계속된다면 지원 웹 사이트를 방문해

보자(www.DMCInsights.com/phorum/).

그림 2.6 handle_form.php를 테스트하려면 반드시

URL을 통해야 한다.

그림 2.7 스크립트는 이런 결과를 출력한다.

그림 2.8 폼을 전송했음에도 불구하고 PHP 코드가 출

력된다면 아마도 URL을 통하지 않고 폼에 접근했기 때문

일 것이다.

Page 61: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

41

PHP 프로그래밍

▒ 변수의 값이 출력되어야 할 자리에 공백이 나타

났다면 변수에 저장된 값이 없는 경우이다. 그 이

유는 보통 폼에 데이터 입력을 하지 않았거나 변

수의 이름(대소문자)이 틀렸기 때문이다.

▒ Unde©ned variable 에러가 발생했다면, PHP의

오류 보고 레벨이 가장 높게 설정된 상태에서 참

조하려던 변수가 값을 가지고 있지 않기 때문이

다. 이전의 팁에서 왜 변수의 값이 없는지 간단히

설명했는데, 7장에서는 PHP의 오류 보고(Error-

Reporting)를 자세히 다룬다.

▒ PHP가 여러 폼 입력 형식을 처리할 때의 차이를

비교해보려면 $_REQUEST['age'] 와

$_REQUEST['gender']을 출력해 보자(그림 2.9).

그림 2.9 성별과 나이는 폼의 HTML에서 정의된 대로

나타난다.

매직 쿼트(Magic Quotes):

이전 버전의 PHP는 매직 쿼트라 불리는 기능이 있었는데, PHP 6에서는 제외되었다. 매직 쿼트는 제출된 폼 데

이터에 포함된 큰따옴표나 작은따옴표를 자동으로 이스케이프시킨다(사실은 세 종류의 매직 쿼트가 있지만,

지금 언급하는 종류가 가장 중요하다). 문자열 I’m going out은 I\’m going out으로 자동 변환된다.

잠재적으로 문제가 될 수 있는 문자를 이스케이프시키는 것은 때때로 유용하지만 매직 쿼트 기능을 활성화하

면 폼 데이터를 출력할 때 역슬래시 문자가 생겨난다. 이 문제를 해결하기 위해서는 stripslashes() 함수를 사용

해야 한다.

$var = stripslashes($var);

이 함수는 $var에 있는 역슬래시를 모두 제거한다. 이스케이프된 문자열을 원래의 문자열로 바꾸는 것이다.

handle_form.php(스크립트 2.2)에서도 다음과 같이 stripslashes() 함수를 사용할 수 있다.

$name = stripslashes($_REQUEST['name']);

PHP 6 이상의 버전에서는 매직쿼트 기능이 제외되었으므로, 이제는 이렇게 처리할 필요가 없다.

Page 62: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

42

2 장

조건절과 연산자if, else, elseif는 PHP에서 조건절을 작성하기 위해 꼭

필요한 세 가지 구문이다. elseif는 else if로 바꿔 쓸

수도 있다.

모든 조건절은 if절로 시작한다.

if (condition) {

// 무언가를 실행한다.

}

if절은 else절을 가질 수 있다.

if (condition) {

// 무언가를 실행한다.

} else {

// 무언가를 실행한다.

}

elseif절은 추가적인 조건절을 허용한다.

if (condition1) {

// 무언가를 실행한다.

} elseif (condition2) {

// 다른 무언가를 실행한다.

} else {

// 또 다른 무언가를 실행한다.

}

조건이 참(TRUE)이면 중괄호 안의 코드가 실행되

고, 거짓(FALSE)이면 계속 진행된다. 다시 else if 절

의 조건이 참이면 중괄호 안의 코드가 실행되고, 거

짓이면 계속 진행된다. 이렇게 else를 만날 때까지 계

속 진행되며, else절이 실행되거나 else절이 없으면 조

건절이 종료된다. else는 모든 조건이 만족하지 못했

을 때 실행되는 기본 동작이므로 항상 절의 마지막

위치에 와야 한다.

PHP의 조건절은 여러 가지 이유로 참(TRUE)이 될

수 있다. 다음의 경우에는 모두 참이다.

◆ $var: $var가 0이나 빈 문자열, FALSE, NULL이

아닌 경우

◆ isset($var): $var가 NULL 이외의 어떤 값이라도

가지고 있는 경우(어떤 값에는 0, FALSE, 빈 문자

열도 포함한다).

◆ TRUE, true, True 등등

새로운 함수 isset()이 소개되었다. 이 함수는 변수의

상태를 검사하는데, NULL(NULL은 값이 할당되지

않았음을 의미한다)이 아닌 값을 가지고 있는가를

확인한다. 또 더 복잡한 표현식을 만들기 위해 괄호

와 비교/논리 연산자를 사용할 수도 있다.

표 2.2 조건절을 작성할 때는 아래 연산자를 많이 사용한다.

비교 / 논리 연산자

기호 의미 타입 예

== 같다 비교 $x == $y

!= 같지 않다 비교 $x != $y

< 더 작다 비교 $x < $y

> 더 크다 비교 $x > $y

<= 더 작거나 같다 비교 $x <= $y

>= 더 크거나 같다 비교 $x >= $y

! NOT 논리 !$x

&& AND 논리 $x && $y

|| OR 논리 $x || $y

XOR XOR 논리 $x XOR $y

Page 63: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

43

PHP 프로그래밍

조건절의 사용:

1. 문서 편집기로 handle_form.php를 연다.

2. echo() 문 직전에 $gender 변수를 생성하는 조

건절을 추가한다(스크립트 2.3).

if (isset($_REQUEST['gender'])) {

$gender = $_REQUEST['gender'];

} else {

$gender = NULL;

}

이것이 폼 입력의 유효성 검증을 위해 가장 효과적

인 방법이다(특히 radio button, check box, select

에 효과적이다). 사용자가 성별 radio button의 유

효성을 검증하려고 할 때, $_REQUEST['gender']

가 값을 가진다면 isset($_REQUEST['gender'])

은 true를 반환한다. 이때 좀 더 간편한 이름인

$gender 변수에 $_REQUEST['gender']의 값이 할

당된다. $name과 $email, $comment 변수도 같은

방법으로 새로운 변수에 값을 할당하자. 사용자

가 radio button을 선택하지 않았을 때에는 조건이

false가 되고, $gender 변수에는 NULL이 할당될

것이다. NULL을 할당할 때 인용부호를 사용하지

않았다는 것을 주목하라.

스크립트 2.3 조건절은 특정한 조건에 따라 스크립트의

동작을 변경한다. 아래 다시 작성된 handle_form.php에서

는 성별 선택 라디오 버튼의 유효성 검사를 위해 두 개의 조건

절이 사용되었다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

2 "http://www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd">

3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

4 <head>

5 <meta http-equiv="content-type" content= "text/html; charset=iso-8859-1" />

6 <title>Form Feedback</title>

7 </head>

8 <body>

9 <?php # Script 2.3 - handle_form.php #2

10

11 // Create a shorthand for the form data:

12 $name = $_REQUEST['name'];

13 $email = $_REQUEST['email'];

14 $comments = $_REQUEST['comments'];

15

16 // Create the $gender variable:

17 if (isset($_REQUEST['gender'])) {

18 $gender = $_REQUEST['gender'];

19 } else {

20 $gender = NULL;

21 }

22

23 // Print the submitted information:

24 echo "<p>Thank you, <b>$name</b>, for the following comments:<br />

25 <tt>$comments</tt></p>

26 <p>We will reply to you at <i>$email</i>. </p>\n";

<다음 쪽에 스크립트 계속>

Page 64: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

44

2 장

3. echo() 문 뒤로는 $gender의 값에 따라서 다른

메시지를 출력하는 조건절을 추가하자.

if ($gender == 'M') {

echo '<p><b>Good day, Sir!</b> </p>';

} elseif ($gender == 'F') {

echo '<p><b>Good day, Madam!</b> </p>';

} else {

echo '<p><b>You forgot to enter your gender!</b></p>';

}

이 조건절은 $gender 변수의 값을 검사해서 상태

에 따라 각기 다른 메시지를 출력한다. 1개의 등

호는 할당을 뜻하는 반면에, 2개의 등호는 동등

을 의미한다. 이런 의미를 기억하고 구별하는 일

은 중요하다. $gender == 'M'이 true나 false를 반

환하지만 $gender = 'M'은 항상 true가 되기 때문

이다. 또한 여기서 사용된 M과 F는 HTML 폼에

서 사용된 값과 완전히 일치해야 한다. 이러한 동

등비교는 대소문자를 구별하므로 m과 비교하면

무조건 false이다.

4. 파일을 저장하고, 웹 디렉터리에 위치시킨 후, 웹

브라우저로 확인해 보자(그림 2.10, 2.11 그리고

2.12)

스크립트 2.3 스크립트 계속

27

28 // Print a message based upon the gender value:

29 if ($gender == 'M') {

30 echo '<p><b>Good day, Sir!</b></p>';

31 } elseif ($gender == 'F') {

32 echo '<p><b>Good day, Madam!</b></p>';

33 } else { // No gender selected.

34 echo '<p><b>You forgot to enter your gender!</b></p>';

35 }

36

37 ?>

38 </body>

39 </html>

그림 2.10 이 조건절은 폼에서 선택한 성별에 따라 각기 다

른 메시지를 출력한다.

그림 2.11 성별이 바뀌면 같은 스크립트가 다른 인사말을

출력한다(그림 2.10과 비교해보라).

Page 65: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

45

PHP 프로그래밍

Tips

▒ PHP는 코딩 형식을 엄격하게 검사하지는 않지만

어떤 블록이 조건절의 일부분일 경우에는 줄 바

꿈을 하는 것이 좋은 프로그래밍 습관이다. 특히

블록 들여쓰기는 표준처럼 지키는 것이 좋다.

▒ 조건절 속에서 또 다른 조건절을 사용할 수 있다.

▒ 위 스크립트는 변수에 기본 값을 할당하여 사

용하는 것에 관한 완벽한 예제이다. isset($_

REQUEST['gender'])을 만족하지 못하는 경우

에는 $gender 변수가 NULL을 가지고 있다고 쉽

게 가정할 수 있다.

▒ 한 개의 구문만을 사용할 경우에는 조건절의 시

작과 끝을 알리는 중괄호를 사용할 필요가 없다.

그러나 명백하게 단일 문장만 사용하게 되는 경

우라도 항상 중괄호를 사용하는 것이 나중을 위

해 좋다.

그림 2.12 성별이 선택되지 않으면 입력 항목의 누락을 알

리는 오류 메시지가 출력된다.

Switch

PHP는 switch라는 또 다른 조건절을 가지고 있는

데, 길이가 긴 if-elseif-else 조건절을 대신하여 사

용하기에 아주 적합하다. 문법은 다음과 같다.

switch ($variable) {

case 'value1':

// 코드를 실행한다.

break;

case 'value2':

// 코드를 실행한다.

break;

default:

// 일치하는 값이 없으면 이곳의 코드를 // 실행한다.

break;

}

switch 조건절은 각각의 case에서 $variable의 값

을 검사하다가 일치하는 값을 만나면 해당 블록

의 코드를 실행한다(break에서 실행이 끝난다).

일치하는 값이 없는 상태에서 default 블록이 존

재하면 그 블록이 실행된다(default 블럭은 선택

사항이다). switch 조건절은 값의 일치 여부만을

검사할 수 있으므로 활용이 다소 제한적이다.

Page 66: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

46

2 장

폼 데이터 검증하기HTML 폼을 처리하는데 있어 가장 중요한 부분 중

하나가 폼 데이터를 검증하는 일이다. 오류 관리와

보안의 측면에서 HTML 폼을 통해서 입력된 데이터

를 무조건 신뢰해서는 안 된다. 악의적인 의도나 사용

자의 실수로 오류를 발생시키는 데이터가 얼마든지

입력될 수 있으므로, 이것을 예상하고 검사하는 것은

순전히 설계자의 몫이다.

폼 데이터를 검증할 때는 조건절과 여러 함수, 연산

자, 표현식이 사용된다. 표준적인 방법으로 isset() 함

수를 활용할 수 있는데, 이 함수는 어떤 변수가 값이

있는지 없는지를 검사한다(0 또는 false, 공백일 경우

에는 값을 가지고 있는 것이고, NULL일 경우에는 값

을 가지고 있지 않는 것이다). 이 후에 나오는 예제 스

크립트를 통해 그 사용 예를 볼 수 있다.

isset() 함수는 빈 문자열에 대하여 true를 반환한

다. 이것은 대단히 중요한 사항으로, isset() 함수가

HTML 폼의 문자 입력 여부를 검사하기에 부적합하

다는 것을 의미한다. 사용자가 문자를 입력했는지를

확인하기 위해서는 empty() 함수를 사용해야 한다.

이 함수는 변수가 empty 상태인지를 검사한다(빈 문

자열, 0, NULL, FALSE 등은 모두 empty 상태로 간

주한다).

폼 검증의 첫 번째 목표는 폼 요소에 어떤 값이 입력

또는 선택되었는가를 확인하는 것이고, 두 번째 목표

는 제출된 데이터의 타입과 형식을 검사하는 것이다

(예를 들어 $gender에는 ‘M’과 ‘F’만 입력되어야 한

다). 폼을 다루는 것은 PHP를 사용하는 주된 이유

중 하나이므로, 이어지는 장에서 폼 데이터의 검증을

다시 한번 강조하는 시간을 가질 것이다. 그렇지만 먼

저 새로운 handle_form.php를 생성하여 제출된 값

을 제대로 가지고 있는지를 확인해 보자. 이번 스크립

트는 스크립트 2.3을 간단히 수정해서 사용하기에는

무리일 정도로 수정해야 할 부분이 많을 것이다.

폼 검증하기:

1. 문서 편집기로 새로운 PHP 스크립트를 작성한다

(스크립트 2.4).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: //www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Form Feedback</title>

</head>

<body>

<?php # 스크립트 2.4 - handle_ form.php #3

2. HTML head 태그 안쪽으로 간단한 CSS 코드를

추가하자.

<style type="text/css" title="text/ css" media="all">

.error {

font-weight: bold;

color: #C00

}

</style>

CSS는 HTML 페이지의 레이아웃이나 문자의 형

식을 지정하기 위해 많이 사용된다. 이 책에서도

여러 곳에서 간단한 CSS를 사용한다. CSS에 익

숙하지 않다면 CSS 관련 문서를 참고하라.

<다음 쪽에 계속>

Page 67: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

47

PHP 프로그래밍

스크립트 2.4 폼 데이터의 유효성을 검증하는 것은 보안이나 더 복잡한 처리를 위해 필수적이다. 여기서는 조건절로 폼의 입력

요소들이 값을 가지고 있는가를 검사한다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />

5 <title>Form Feedback</title>

6 <style type="text/css" title="text/css" media="all">

7 .error {

8 font-weight: bold;

9 color: #C00

10 }

11 </style>

12 </head>

13 <body>

14 <?php # Script 2.4 - handle_form.php #3

15

16 // Validate the name:

17 if (!empty($_REQUEST['name'])) {

18 $name = $_REQUEST['name'];

19 } else {

20 $name = NULL;

21 echo '<p class="error">You forgot to enter your name!</p>';

22 }

23

24 // Validate the email:

25 if (!empty($_REQUEST['email'])) {

26 $email = $_REQUEST['email'];

27 } else {

28 $email = NULL;

29 echo '<p class="error">You forgot to enter your email address!</p>';

30 }

31

32 // Validate the comments:

33 if (!empty($_REQUEST['comments'])) {

34 $comments = $_REQUEST['comments'];

35 } else {

Page 68: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

48

2 장

스크립트 2.4 스크립트 계속

36 $comments = NULL;

37 echo '<p class="error">You forgot to enter your comments!</p>';

38 }

39

40 // Validate the gender:

41 if (isset($_REQUEST['gender'])) {

42

43 $gender = $_REQUEST['gender'];

44

45 if ($gender == 'M') {

46 echo '<p><b>Good day, Sir!</b></p>';

47 } elseif ($gender == 'F') {

48 echo '<p><b>Good day, Madam!</b></p>';

49 } else { // Unacceptable value.

50 $gender = NULL;

51 echo '<p class="error">Gender should be either "M" or "F"!</p>';

52 }

53

54 } else { // $_REQUEST['gender'] is not set.

55 $gender = NULL;

56 echo '<p class="error">You forgot to select your gender!</p>';

57 }

58

59 // If everything is OK, print the message:

60 if ($name && $email && $gender && $comments) {

61

62 echo "<p>Thank you, <b>$name</b>, for the following comments:<br />

63 <tt>$comments</tt></p>

64 <p>We will reply to you at <i>$email</i>.</p>\n";

65

66 } else { // Missing form value.

67 echo '<p class="error">Please go back and fill out the form again.</p>';

68 }

69

70 ?>

71 </body>

72 </html>

Page 69: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

49

PHP 프로그래밍

이 스크립트에서는 error라는 CSS 클래스 하나

를 정의하였다. 이 CSS 클래스를 사용하는 모든

HTML 요소는 빨간색 볼드체 형식의 문자가 출

력될 것이다(흑백의 책보다 웹 브라우저에서 더

명백하게 나타난다).

3. 이름이 입력되었는지 검사한다.

if (!empty($_REQUEST['name'])) {

$name = $_REQUEST['name'];

} else {

$name = NULL;

echo '<p class="error">You forgot to enter your name!</p>';

}

문자의 입력 여부를 확인하는 가장 간단한 방

법은 empt y() 함수를 사용하는 것이다. $_

REQUEST['name']이 값을 가지고 있다면, 이름

이 입력되었다고 간주하고 축약된 변수명에 그

값을 할당한다. 만약 $_REQUEST['name']이 비

어(empty) 있다면 $name변수에는 NULL이 할

당되고 에러 메시지가 출력되는데, 이 메시지에서

CSS 클래스를 사용한다.

4. 이메일, 주소, 코멘트도 같은 과정을 반복한다.

if (!empty($_REQUEST['email'])) {

$email = $_REQUEST['email'];

} else {

$email = NULL;

echo '<p class="error">You forgot to enter your email address!</p>';

}

if (!empty($_REQUEST['comments'])) {

$comments = $_REQUEST['comments'];

} else {

$comments = NULL;

echo '<p class="error">You forgot to enter your comments!</p>';

}

나머지 두 변수도 스텝3에서

$_REQUEST['name']을 처리했던 것과 같은 방

법으로 처리한다.

5. $gender 변수를 검사하자.

if (isset($_REQUEST['gender'])) {

$gender = $_REQUEST['gender'];

이 변수는 두 단계로 검사한다. 먼저 isset()을 사

용하여 값이 있는지 없는지를 검사한다. 이 검사

로 주 if-else 조건절이 시작되는데, 사용자의 이

름, 이메일 주소, 코멘트도 이런 방식으로 시작된

다.

6. 특정한 값으로 $gender 변수를 검사한다 .

if ($gender == 'M') {

echo '<p><b>Good day, Sir!</b> </p>';

} elseif ($gender == 'F') {

echo '<p><b>Good day, Madam!</b> </p>';

} else {

$gender = NULL;

echo '<p class="error">Gender should be either "M" or "F"! </p>';

}

if절에 적절한 성별 값인가를 검사하는 if-elseif-

else절이 내포되었다. 이것이 2단계 성별 검사의

두 번째 부분인데, 이전 스크립트의 조건절과 내

용이 같다. 성별의 값이 M이 아니고 F도 아니면

문제 상황이 발생한 것이며 에러 메시지가 출력

된다. 이러한 경우에는 잘못된 값이 입력된 것이

므로 $gender 변수에는 NULL이 할당된다.

$gender 변수가 유효한 값을 가지고 있다면 성별

에 따른 인사 메시지가 출력된다.

Page 70: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

50

2 장

7. 성별 if-else 조건절을 끝맺는다.

} else {

$gender = NULL;

echo '<p class="error">You forgot to select your gender!</p>';

}

이 else절은 $_REQUEST['gender']에 값이 없을

경우에 실행된다. 전체 조건절은 다음의 가능성

을 성공적으로 검사한다.

▲ $_REQUEST['gender']에 값이 없는 경우

▲ $_REQUEST['gender']가 M이 있는 경우

▲ $_REQUEST['gender']가 F가 있는 경우

▲ $_REQUEST['gender']가 M, F 이외의 값이

있는 경우

예제에서 작성한 HTML 폼의 설정만을 생각하

면 마지막의 $_REQUEST['gender']의 값이 M,

F이외의 값을 가질 수 없을 것이라고 생각할 수

있다. 하지만 form 태그 안의 action 값을 예제

의 handle_form.php로 지정한 임의의 HTML

폼을 만들어서 사용할 경우에는 어떠한 값도 $_

REQUEST 에 넣을 수 있다.

8. 모든 검사가 끝나면 메시지를 출력하자.

if ($name && $email && $gender && $comments) {

echo "<p>Thank you, <b>$name</b>, for the following comments: <br />

<tt>$comments</tt></p>

<p>We will reply to you at <i>$ email</i>.</p>\n";

} else { // Missing form value.

echo '<p class="error">Please go back and fill out the form again.</p>';

}

if 문에 나열된 모든 변수가 유효한 값을 가지면

이 조건절은 참이다. 조건절이 참이면 폼이 완전

하게 작성된 것이므로 감사 메시지가 출력될 것

이다. 그러나 1개의 변수라도 유효한 값이 아니면

else 절의 메시지가 출력된다(그림 2.13과 2.14).

9. PHP 섹션을 닫고 HTML 코드를 종료한다.

?>

</body>

</html>

10. 파일 이름 handle_form.php로 저장하고, 웹 디

렉터리에 위치시킨 후, 웹 브라우저로 테스트해

본다(그림 2.13와 2.14).

여러 다른 값으로 폼을 채워 테스트를 해보자(그

림 2.15).

Page 71: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

51

PHP 프로그래밍

Tips

▒ 제출된 데이터가 숫자인지 검사하려면

is_numeric( )함수를 사용하라.

▒ 13장 “펄 호환 정규표현식”에서는 정규표현식을

사용한 폼 유효성 검증에 대해 알아볼 것이다.

▒ $age 변수는 지면을 줄이기 위해 검사를 생략했

다. $age 변수를 검사하려면 $gender 변수를 검

사한 것과 같은 방법으로 하면 된다. 정해진 범위

의 값으로 나이를 검사하고 싶으면 각 선택항목

0-29, 30-60, 60+를 위하여 if-elseif-elseif-else를

사용하자.

▒ 좋은 폼은 사용자가 폼을 채워 넣을 때 어떤 항목

이 필수로 입력되어야 하는지, 입력 형식은(날짜

나 전화번호 같은)은 어떠한지를 알려준다.

그림 2.13 이제 handle_form.php

스크립트는 모든 폼 요소가 채워졌는지를

검사하고(나이 요소는 제외), 누락된 요소를

지적해 준다.

그림 2.14 단 한 개의 요소라도 누락되었다면

감사 메시지는 출력되지 않는다.

그림 2.15 모든 내용이 적절하게 입력되었다면 이

전 스크립트와 완전히 동일하게 작동한다 (비록 성별

에 따른 메시지가 결과의 최상단에 출력되는 것이 다

르긴 하지만 말이다).

Page 72: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

52

2 장

배열 입문이 책에서 다룰 마지막 변수 타입은 배열이다. 배열에

는 문자열과 숫자 타입(이들 타입은 한순간에 한 개

의 값만을 가질 수 있는 스칼라 변수이다)과는 다르

게 여러 개의 값을 저장할 수 있다. 배열은 값의 목록

이고, 각 값은 문자 또는 숫자, 심지어 다른 배열일 수

도 있다.

배열은 키와 값의 목록으로 구성되며 각 항목에는 참

조를 위한 키가 존재한다(표 2.3).

PHP는 두 종류의 배열을 지원한다. 인덱스 배열은

숫자 키를 사용하고, 연관 배열은 문자열 키를 사용

한다(표 2.4). PHP는 인덱스 배열을 지원하는 대부

분의 프로그래밍 언어에서처럼 명시적으로 키를 지

정하지 않으면 첫 번째 인덱스 번호가 0이 된다.

배열도 다른 모든 변수들과 같은 작명 규칙의 적용

을 받는다. 따라서 $var를 보고 문자열이나 숫자가 아

니라 배열이라고 바로 말할 수는 없을 것이다. 중요한

문법적인 차이는 배열의 개별 요소에 접근할 때 발생

한다.

배열에서 특정 값을 참조하기 위해서는 배열 변수의

이름을 먼저 쓰고, 이어서 대괄호 안에 참조하려는

키를 써 넣으면 된다.

echo $artists[2]; // Wilco

echo $states['MD']; // Maryland

문자열 키일 경우에는 인용부호를 사용해야 하지만

숫자 키일 경우에는 인용부호를 사용하면 안 된다.

표 2.3 $artists 배열은 숫자 키를 사용한다.

배열 예제 1: $artists

키 값

0 Death Cab for Cutie

1 Postal Service

2 Wilco

3 Damien Rice

4 White Stripes

표 2.4 $states 배열은 문자열 키를 사용한다.

배열 예제 2: $artists

키 값

MD Missouri

PA Maryland

IL Pennsylvania

MO Illinois

IA Iowa

Page 73: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

53

PHP 프로그래밍

배열은 값을 출력할 때 다른 변수들과 다른 문법을

사용하므로 다소 혼란스러울 것이다.

먼저, 배열은 여러 개의 값을 가지고 있기 때문에 다

른 변수들처럼 간단하게 출력할 수 없다 (그림 2.16).

echo "My list of states: $states";

인덱스를 사용하여 개별 요소를 출력하는 것은 비교

적 간단하다.

echo "The first artist is $artists[0].";

그러나 문자열 키를 사용할 때에는 키를 인용하기 위

한 인용부호가 문법을 복잡하게 만든다. 다음 코드는

문법 에러를 발생시킨다.

echo "IL is $states['IL'].";

이 문제의 해결책은 문자열 키를 사용하는 배열에서

는 배열의 이름과 키를 중괄호로 감싸는 것이다.

echo "IL is {$states['IL']}.";

배열이 조금 익숙해 보인다면 이미 두 개의 배열, $_

SERVER와 $_REQUEST를 사용해 보았기 때문일

것이다. 이후에는 다른 종류의 배열과 그 출력 방법을

소개하기 위해, 조금 특별한 $_POST 배열을 사용하

는 최종 버전의 handle_form.php 페이지를 작성할

것이다.

그림 2.16 배열을 출력하기 위해 배열의 이

름을 그대로 사용하면 배열 값 대신에 Array

라는 단어가 출력된다.

슈퍼글로벌(superglobal) 배열

PHP에는 슈퍼글로벌 변수라고 부르는 몇 개의 미

리 정의된 배열이 있다.

$_GET, $_POST, $_REQUEST, $_SERVER, $_

ENV, $_SESSION, $_COOKIE

$_GET 변수는 get 방식으로 스크립트에 전송된

모든 값을 저장하고, $_POST는 HTML 폼으로부

터 post 방식으로 전송된 모든 데이터를 저장하고

있다. 이 두 변수는, $_COOKIE 변수를 포함하

여, 이미 사용한 적이 있는 $_REQUEST 배열의

부분 집합이다.

1장에서 사용한 바 있는 $_SERVER는 $_ENV와

함께 PHP가 실행되고 있는 서버에 대한 정보를

저장하고 있다. $_SESSION과 $_COOKIE는 11

장 “쿠키와 세션”에서 상세히 다룰 것이다.

변수 를 정확하게 참조하 는 것은 보안과 좋

은 프로그래밍의 관점에서 매우 중요하다. $_

REQUEST변수를 사용하여 post 방식으로 전송

된 폼 데이터에 접근할 수도 있지만 좀 더 정확한

$_POST 변수를 사용하는 것이 좋다.

Page 74: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

54

2 장

배열 사용하기:

1. 문서 편집기로 새로운 PHP 스크립트를 작성한다

(스크립트 2.5).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/ DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/ xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Form Feedback</title>

<style type="text/css" title= "text/css" media="all">

.error {

font-weight: bold;

color: #C00

}

</style>

</head>

<body>

<?php # Script 2.5 - handle_form.php #4

이전의 handle_form.php 스크립트처럼 CSS 클

래스 하나를 정의한다.

2. 간단한 폼 유효성 검증을 수행하자.

if ( !empty($_POST['name']) && !empty($_POST['comments']) && !empty($_POST['email']) ) {

이전 버전에서는 $_REQUEST 변수를 참조했었

지만, $_POST 변수를 사용하는 것이 더 정확하

고 안전한 방법이다(사이드바 참고).

스크립트 2.5 PHP에서는 $_POST를 포함하여 여러 슈퍼

글로벌 변수를 활용할 수 있다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. org/TR/xhtml1/DTD/xhtml1-transitional. dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

5 <title>Form Feedback</title>

6 <style type="text/css" title="text/css" media="all">

7 .error {

8 font-weight: bold;

9 color: #C00

10 }

11 </style>

12 </head>

13 <body>

14 <?php # Script 2.5 - handle_form.php #4

15

16 // Print the submitted information:

17 if ( !empty($_POST['name']) && !empty ($_POST['comments']) && !empty($_POST ['email']) ) {

18 echo "<p>Thank you, <b>{$_POST['name']} </b>, for the following comments: <br />

19 <tt>{$_POST['comments']}</tt></p>

20 <p>We will reply to you at <i> {$_POST ['email']}</i>.</p>\n";

21 } else { // Missing form value.

22 echo '<p class="error">Please go back and fill out the form again.</p>';

23 }

24 ?>

25 </body>

26 </html>

Page 75: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

55

PHP 프로그래밍

이 검사는 세 개의 텍스트 입력이 모두 비어 있는

가를 검사한다. and(&&) 연산자를 사용하는 조

건절은 세 개의 조건이 모두 만족해야만 true를

반환할 것이다.

3. 메시지를 출력한다.

echo "<p>Thank you, <b>{$_POST ['name']}</b>, for the following comments:<br />

<tt>{$_POST['comments']}</tt></p>

<p>We will reply to you at <i>{$_ POST['email']}</i>.</p>\n";

배열의 개념을 이해하고 나면 출력과 관계된 문

법을 익혀야 한다. 문자열을 키로 사용하는 배열

의 요소를 출력할 때에는 중괄호를 사용하여 문

법 오류를 피해야 한다.

4. 스텝 2의 조건절을 완료한다.

} else {

echo '<p class="error">Please go back and fill out the form again.</p>';

}

스텝 2의 조건 중에 하나라도 true가 아니면 이

else절이 실행되고 오류 메시지가 출력된다(그림

2.17)

5. PHP 섹션과 HTML 코드를 종료한다.

?>

</body>

</html>

6. 파일 이름 form.html로 저장하고 웹 디렉터리에

위치시킨 후, 웹 브라우저로 테스트해보자(그림

2.18)

Tips

▒ PHP는 느슨한 변수 체계를 사용하기 때문에 배

열에서도 숫자 키와 문자열 키를 혼합해서 사용

할 수 있다. 배열을 사용할 때 가장 중요한 규칙은

모든 키가 유일해야 한다는 것이다.

▒ 슈퍼글로벌 변수에 접근하는 문법이 장황해서 혼

란스럽다면 축약된 이름의 새 변수에 할당해서

사용하면 된다.

$name = $_POST['name'];

이후에 이어지는 조건절과 echo() 문에서도

$name으로 간단하게 참조할 수 있다.

그림 2.17 폼 입력 요소들 중 하나라도 비어 있다면 이

러한 오류 메시지가 출력된다.

그림 2.18 $_POST 배열을 사용해도 보이는 결과에는

영향을 미치지 않는다.

Page 76: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

56

2 장

배열 만들기

이전의 예제에서는 PHP가 자동으로 생성한 배열을

사용했지만 필요에 따라 자신만의 배열을 생성해서

사용해야 한다. 여기서는 배열 생성을 위해 선호되는

두 가지 방법을 소개한다. 먼저, 한 번에 하나의 요소

를 더하여 배열을 구성할 수 있다.

$band[] = 'Jemaine';

$band[] = 'Bret';

$band[] = 'Murray';

이렇게 하면 $band[0]는 Jemaine, $band[1]에는

Bret, $band[2]에는 Murray가 저장된다(배열 인덱스

는 0으로 시작하기 때문이다).

키를 직접 지정하여 배열의 요소를 추가할 수도 있다.

그러나 배열의 인덱스를 직접 지정하여 요소를 추가

할 때에는 지정한 키로 저장된 값이 이미 존재하는

경우 새로운 값이 기존의 값을 덮어써 버린다는 것을

정확히 이해해야 한다.

$band['fan'] = 'Mel';

$band['fan'] = 'Dave'; // 새로운 값

$array[2] = 'apple';

$array[2] = 'orange'; // 새로운 값

한 번에 한 개의 배열 요소를 더하는 대신에 array()

함수를 사용하여 필요한 요소들을 한꺼번에 구성할

수도 있다.

$states = array ('IA' => 'Iowa', 'MD' => 'Maryland');

이 함수는 아래와 같이 키를 지정하지 않고도 사용

할 수 있다.

$artists = array ('Clem Snide', 'Shins', 'Eels');

또는 첫 요소의 인덱스만 지정하면 이후의 요소는 지

정한 요소로부터 자동으로 1씩 증가하면서 생성된다.

$days = array (1 => 'Sun', 'Mon', 'Tue');

echo $days[3]; // Tue

Page 77: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

57

PHP 프로그래밍

array() 함수는 변수를 배열로 초기화한다.

$tv = array();

$tv[] = 'Flight of the Conchords';

PHP에서는 배열이나 변수를 꼭 초기화할 필요가 없

지만, 코드를 명확하게 하고 오류를 피하는 데 도움

을 준다.

마지막으로, 연속된 값의 배열을 간편하게 생성하고

싶으면 range() 함수를 사용할 수 있다.

$ten = range (1, 10);

배열 값에 접근하기

우리는 이미 키를 이용하여 개별적인 배열 요소에 접

근하는 방법을 살펴보았다. 이러한 방법은 배열의 키

에 대해 정확히 알고 있거나, 오직 한 개의 배열 요소

만 접근할 필요가 있을 때 사용한다. 또한 배열의 모

든 요소에 접근할 필요가 있을 때에는 foreach 루프

를 사용할 수 있다.

foreach ($array as $value) {

// $value를 처리한다.

}

foreach 루프는 $array의 모든 요소의 수만큼 반복하

면서 각 요소의 값을 $value에 할당한다. 키와 값에

같이 접근할 수도 있다.

foreach ($array as $key => $value) {

echo "The value at $key is $value.";

}

$key와 $value에는 $k나 $v같은 임의의 변수명을 사

용할 수 있다.

배열을 이용하여 날짜 선택을 위한 풀다운 메뉴를 구

성하는 것이 얼마나 간단한지 살펴보자(그림 2.19).

그림 2.19 풀다운(pull-down) 메뉴는 배

열과 foreach 루프를 이용하여 만들 수 있다.

Page 78: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

58

2 장

배열의 생성과 접근:

1. 문서 편집기로 새로운 PHP 문서를 작성한다(스

크립트 2.6).

<!DOCTYPE html PUBLIC "-//W3C//

DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/

xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/

xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Calendar</title>

</head>

<body>

<form action="calendar.php"

method="post">

<?php # Script 2.6 - calendar.php

이 페이지가 완전한 HTML 폼을 포함하지는 않

겠지만 풀다운 메뉴를 생성하기 위해 폼 태그가

여전히 필요하다.

스크립트 2.6 배열을 사용하여 3개의 풀다운 메뉴를 동적

으로 구성하였다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

5 <title>Calendar</title>

6 </head>

7 <body>

8 <form action="calendar.php" method="post">

9 <?php # Script 2.6 - calendar.php

10

11 // This script makes three pull-down menus

12 // for an HTML form: months, days, years.

13

14 // Make the months array:

15 $months = array (1 => 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

16

17 // Make the days and years arrays:

18 $days = range (1, 31);

19 $years = range (2008, 2018);

20

21 // Make the months pull-down menu:

22 echo '<select name="month">';

23 foreach ($months as $key => $value) {

24 echo "<option value=\"$key\">$value </option>\n";

25 }

26 echo '</select>';

<다음 쪽에 스크립트 계속>

Page 79: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

59

PHP 프로그래밍

2. 월(month)이 저장된 배열을 구성한다.

$months = array (1 => 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

이 배열은 1부터 12까지의 숫자를 키로 사용할

것이다. 가장 처음의 요소가 1로 지정되었으므로

그다음의 요소는 첫 요소에서 1씩 저절로 증가하

는 값의 인덱스를 가지게 된다(0 - 11의 인덱스 범

위가 1 - 12로 변경되었다).

3. 일(day)과 연(year)을 저장하는 배열을 구성한다.

$days = range (1, 31);

$years = range (2008, 2018);

숫자 값으로 이루어진 배열은 range() 함수를 사

용하여 쉽게 구성할 수 있다.

4. 풀다운 메뉴를 생성한다.

echo '<select name="month">';

foreach ($months as $key => $value) {

echo "<option value=\"$key\"> $value</option>\n";

}

echo '</select>';

보다시피 foreach 루프는 달을 위한 풀다운 메뉴

의 전체 HTML 코드를 간단하게 생성한다. 각 루

프는 <option value="1">January</option>과 같

은 행을 만들어 낼 것이다(그림 2.20).

스크립트 2.6 스크립트 계속

27

28 // Make the days pull-down menu:

29 echo '<select name="day">';

30 foreach ($days as $value) {

31 echo "<option value=\"$value\">$value </option>\n";

32 }

33 echo '</select>';

34

35 // Make the years pull-down menu:

36 echo '<select name="year">';

37 foreach ($years as $value) {

38 echo "<option value=\"$value\">$value </option>\n";

39 }

40 echo '</select>';

41

42 ?>

43 </form>

44 </body>

45 </html>

Page 80: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

60

2 장

5. 날과 년도를 위한 풀다운 메뉴를 생성한다.

echo '<select name="day">';

foreach ($days as $value) {

echo "<option value=\"$value\"> $value</option>\n";

}

echo '</select>';

echo '<select name="year">';

foreach ($years as $value) {

echo "<option value=\"$value\"> $value</option>\n";

}

echo '</select>';

달을 선택하는 풀다운 메뉴와는 다르게, 날과 년

도를 선택하는 풀다운 메뉴는 option의 레이블

과 값이 동일하다(그림 2.20).

6. PHP 태그와 폼 태그, HTML 페이지 태그를 닫

는다.

?>

</form>

</body>

</html>

7. 파일 이름 calendar.php로 저장하고, 웹 디렉터리

에 위치시킨 후, 웹 브라우저로 테스트해본다.

그림 2.20 단지 몇 줄의 PHP 코드로 대부분의 HTML

소스 코드가 생성되었다.

Tips

▒ 배열 요소의 수를 세려면 count() 함수를 사용하라.

$num = count($array);

▒ range() 함수는 연속되는 문자 배열을 만들 수도

있다.

$alphabet = range ('a', 'z');

▒ 배열의 키는 phone number나 ©rst name처럼 여

러 단어일 수도 있다.

▒ is_array() 함수는 어떤 변수가 배열인지 아닌지

를 확인해 준다.

▒ foreach 문에서 Invalid argument supplied 같

은 에러 메시지를 보게 된다면, 배열이 아닌 값을

foreach 루프에서 사용하려고 했다는 의미이다.

Page 81: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

61

PHP 프로그래밍

다차원 배열

배열을 처음 소개하면서, 배열의 값으로 문자열이나

숫자, 심지어는 또 다른 배열의 조합도 사용할 수 있

다고 언급했었다. 다차원 배열은 배열의 조합을 통해

만들 수 있다.

다차원 배열은 생각보다 다루기 쉽다. 소수로 이루어

진 배열로 시작해 보자.

$primes = array(2, 3, 5, 7, …);

또 스페닉 수로 이루어진 배열을 만들자.

$sphenic = array(30, 42, 66, 70, …);

이 두 개의 배열은 다음처럼 하나의 다차원 배열로 결

합될 수 있다.

$numbers = array ('Primes' => $primes,

'Sphenic' => $sphenic);

이제 $numbers는 다차원 배열이 되었다. 소수 배

열 요소에 접근하려면 $numbers['Primes']을 참

조한다. 소수 배열 요소 중 5에 접근하기 위해서는

$numbers['Primes'][2]를 사용하면 된다. 이들 값을

출력하려면 중괄호로 전체 구조를 둘러싸야 한다.

echo "The first prime number is

{$numbers['Primes'][0]}.";

foreach 구문을 중첩하면 다차원 배열의 전체 구성

요소에 접근할 수 있다. 다음의 예제로 알아보자.

다차원 배열 사용하기:

1. 문서 편집기를 이용하여 새로운 PHP 문서를 작

성하자(스크립트 2.7).

<다음 쪽에 계속>

스크립트 2.7 다차원 배열은 배열의 값이 또 다른 배열이

다. 두 개의 foreach 루프, 루프 속에 중첩된 루프로 다차원

배열의 모든 요소에 접근할 수 있다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. org/TR/xhtml1/DTD/xhtml1-transitional. dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

5 <title>Multidimensional Arrays</title>

6 </head>

7 <body>

8 <p>Some North American States, Provinces, and Territories:</p>

9 <?php # Script 2.7 - multi.php

10

11 // Create one array:

12 $mexico = array(

13 'YU' => 'Yucatan',

14 'BC' => 'Baja California',

15 'OA' => 'Oaxaca'

16 );

17

18 // Create another array:

19 $us = array (

20 'MD' => 'Maryland',

21 'IL' => 'Illinois',

22 'PA' => 'Pennsylvania',

23 'IA' => 'Iowa'

24 );

25

26 // Create a third array:

27 $canada = array (

28 'QC' => 'Quebec',

<다음 쪽에 스크립트 계속>

Page 82: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

62

2 장

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: //www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/ 1999/xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Multidimensional Arrays </title>

</head>

<body>

<p>Some North American States, Provinces, and Territories:</p>

<?php # Script 2.7 - multi.php

이 스크립트는 북미 3개국(멕시코, 미국, 캐나다,

그림 2.21)의 행정구역을 출력한다.

2. 멕시코 구역의 배열을 생성하자.

$mexico = array(

'YU' => 'Yucatan',

'BC' => 'Baja California',

'OA' => 'Oaxaca'

);

이것은 멕시코 주의 우편 코드를 키로 사용한 연

관 배열이다. 각 요소의 값은 해당 주의 전체 이름

이며, 개념을 설명하기 위한 간단한 예제이므로

불완전한 목록임을 밝혀둔다. PHP 코드는 공백

이나 줄바꿈을 민감하게 다루지 않으므로 읽기

쉽게 하기 위해 여러 행을 사용하였다.

스크립트 2.7 스크립트 계속

29 'AB' => 'Alberta',

30 'NT' => 'Northwest Territories',

31 'YT' => 'Yukon',

32 'PE' => 'Prince Edward Island'

33 );

34

35 // Combine the arrays:

36 $n_america = array(

37 'Mexico' => $mexico,

38 'United States' => $us,

39 'Canada' => $canada

40 );

41

42 // Loop through the countries:

43 foreach ($n_america as $country => $list) {

44

45 // Print a heading:

46 echo "<h2>$country</h2><ul>";

47

48 // Print each state, province, or territory:

49 foreach ($list as $k => $v) {

50 echo "<li>$k - $v</li>\n";

51 }

52

53 // Close the list:

54 echo '</ul>';

55

56 } // End of main FOREACH.

57

58 ?>

59 </body>

60 </html>

Page 83: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

63

PHP 프로그래밍

3. 나머지 두 개의 배열도 생성한다.

$us = array (

'MD' => 'Maryland',

'IL' => 'Illinois',

'PA' => 'Pennsylvania',

'IA' => 'Iowa'

);

$canada = array (

'QC' => 'Quebec',

'AB' => 'Alberta',

'NT' => 'Northwest Territories',

'YT' => 'Yukon',

'PE' => 'Prince Edward Island'

);

4. 모든 배열을 하나의 배열로 결합한다.

$n_america = array(

'Mexico' => $mexico,

'United States' => $us,

'Canada' => $canada

);

이 예에서처럼 다차원 배열을 만들기 위하여 꼭

세 개의 배열을 먼저 만든 후 네 번째 배열에 할당

하는 방법을 사용할 필요는 없다. 그러나 이렇게

하는 것이 코드를 읽기에도 편하고 이해하기도

쉽다(다차원 배열을 한 번에 생성하려면 복잡한

코드가 필요하다 ).

$n_america 배열은 이제 세 개의 요소를 가지고

있다. 각 요소의 키는 국가 이름을 나타내는 문자

열이며, 요소의 값은 해당 국가의 주 또는 지방의

목록이다.

5. 첫 번째 foreach 루프를 시작하자.

foreach ($n_america as $country => $list) {

echo "<h2>$country</h2><ul>";

이 루프는 $n_america 배열의 모든 요소에 접근

한다. 이 루프는 3번 반복될 것이다. 루프의 각 반

복에서 $country 변수에는 $n_america 배열의

키 값인 Mexico, United States, Canada가 차례

대로 저장되고, $list에는 요소의 값이 차례대로

저장된다.

루프는 H2 태그로 국가의 이름을 출력하는 것으

로 시작하며, HTML 목록으로 각 요소의 값을 출

력하기 위해 UL 태그의 시작부분도 출력하였다.

그림 2.21 축약된 행정 구역의 이름으로 각 국가의 정보가

출력된 페이지

Page 84: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

64

2 장

6. 두 번째 foreach 루프를 만든다.

foreach ($list as $k => $v) {

echo "<li>$k - $v</li>\n";

}

이 루프는 서브 배열($mexico, $us, $canada)을

대상으로 실행되는데, $k에는 축약된 행정구역의

이름이, $v에는 행정 구역의 전체 이름이 저장된

다. 둘 다 HTML 목록 태그(li) 사이에 출력된다.

HTML 소스 코드의 형식화를 위해 줄바꿈 문자

도 사용되었다.

7. foreach 문을 종결한다.

echo '</ul>';

} // foreach문의 종결.

안쪽의 foreach문이 끝난 후, 바깥쪽의 foreach

문이 5단계에서 시작되었던 UL태그를 종결한다.

8. PHP와 HTML을 종결한다.

?>

</body>

</html>

9. 파일 이름 multi.php로 저장하고, 웹 디렉터리에

위치시킨 후, 웹 브라우저로 테스트해보자(그림

2.21).

10. HTML 소스 코드를 보면 PHP가 어떤 HTML

코드를 생성했는지 알 수 있다.

Tips

▒ 다차원 배열은 HTML 폼으로부터 전달되기도

한다. 예를 들어, 어떤 폼이 interest[]라는 이름을

가진 일련의 체크박스를 포함하고 있다고 하면:

<input type="checkbox" name= "interests[]" value="Music" /> Music

<input type="checkbox" name= "interests[]" value="Movies" /> Movies

<input type="checkbox" name= "interests[]" value="Books" /> Books

이 폼을 전달받는 PHP 페이지의 $_POST 변수에

는 다차원 배열로 값이 나타난다.

$_POST['interests']는 $_POST['interests'][0]에

첫 번째 체크박스의 값이, $_POST['interests'][1]에

두 번째 체크박스의 값이, $_POST['interests'][2]

에 세 번째 체크박스의 값이 저장된 배열이 될 것이

다. 체크된 체크박스만 전달된다는 것을 명심하라.

▒ HTML 폼의 SELECT 리스트가 다중 선택을 허

용할 경우에도 다차원 배열이 생겨난다.

<select name="interests[]" multiple= "multiple">

<option value="Music">Music </option>

<option value="Movies">Movies </option>

<option value="Books">Books </option>

<option value="Napping">Napping </option>

</select>

체크박스와 마찬가지로 선택된 값만 PHP 페이지

에 전달된다.

Page 85: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

65

PHP 프로그래밍

배열의 정렬

다른 변수 타입과 구별되는 배열의 이점 중 하나는 바

로 정렬 기능이다. PHP는 배열의 정렬을 위하여 몇

개의 함수를 지원하고 있으며 사용법도 간단하다.

$names = array ('Moe', 'Larry', 'Curly');

sort($names);

정렬 함수는 세 종류의 정렬을 수행한다. 첫 번째로

값에 의한 정렬이 있는데, 원래의 인덱스 키는 무시되

며 sort() 함수를 사용한다. 정렬이 끝나면 인덱스 키

는 재배열되므로, 키와 값이 관련을 맺고 있다면 이

함수를 사용해서는 안 된다.

두 번째로는 키 값을 재배열 하지 않고 값에 의한 정

렬을 수행하는 asort() 함수가 있고, 세 번째로 키에

의한 정렬을 수행하는 ksort() 함수가 있다. 이들 정

렬 함수들은 각각 rsort(), arsort(), krsort()를 이용

하여 역 방향 정렬도 수행할 수 있다.

배열을 정렬한 결과를 보기 위해, 영화의 제목과 평

점(1-10 사이의 선호도 점수)의 배열을 생성하고 여러

다른 방법으로 목록을 출력해 보자.

배열과 문자열

PHP에서는 배열과 문자열이 매우 빈번하게 사용

되기 때문에 상호 변환 함수가 제공된다.

$array = explode (separator, $string);

$string = implode (glue, $array);

이들 함수를 이해하고 사용하기 위한 핵심은 분리

자(separator)와 결합자(glue) 간의 관계에 있다.

배열을 문자열로 변환할 때에는 원래의 배열 값

사이에 삽입되어야 할 코드나 문자를 지정해야 한

다. 반대로 문자열을 배열로 변환할 때에는 분리

자를 지정해야 하는데, 분리자는 문자열을 배열의

각 요소로 분리할 때의 기준이 되는 토큰이다.

$s1 = 'Mon-Tue-Wed-Thu-Fri';

$days_array = explode ('-', $s1);

$days_array 변수는 다섯 개의 요소를 가진 배열

이며, Mon이 0번 인덱스, Tue가 1번 인덱스의 순

으로 변환되었다.

$s2 = implode (', ', $days_array);

$s2 변수는 콤마로 분리된 요일의 문자열

'Mon, Tue, Wed, ½u, Fri'이다.

Page 86: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

66

2 장

배열의 정렬:

1. 문서 편집기로 새로운 PHP 문서의 작성을 시작

한다(스크립트 2.8).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: //www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd">

<html xmlns="http://www.w3. org/1999/xhtml" xml:lang="en" lang="en">

<head>

<meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

<title>Sorting Arrays</title>

</head>

<body>

2. HTML 테이블(table)을 생성한다.

<table border="0" cellspacing="3" cellpadding="3" align="center">

<tr>

<td><h2>Rating</h2></td>

<td><h2>Title</h2></td>

</tr>

HTML 테이블을 사용하여 정렬된 리스트를 읽

기 쉽도록 출력한다.

스크립트 2.8 배열 하나가 정의되어, 두 가지 방법으로 정

렬되었다. 첫 번째는 값에 의한 정렬, 두 번째는 키에 의한 정

렬(역방향)이다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ TR/xhtml1/DTD/xhtml1-transitional.dtd">

2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

3 <head>

4 <meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

5 <title>Sorting Arrays</title>

6 </head>

7 <body>

8 <table border="0" cellspacing="3" cellpadding="3" align="center">

9 <tr>

10 <td><h2>Rating</h2></td>

11 <td><h2>Title</h2></td>

12 </tr>

13 <?php # Script 2.8 - sorting.php

14

15 // Create the array:

16 $movies = array (

17 10 => 'Casablanca',

18 9 => 'To Kill a Mockingbird',

19 2 => 'The English Patient',

20 8 => 'Stranger Than Fiction',

21 5 => 'Story of the Weeping Camel',

22 7 => 'Donnie Darko'

23 );

24

25 // Display the movies in their original order:

26 echo '<tr><td colspan="2"><b>In their original order:</b></td></tr>';

<다음 쪽에 스크립트 계속>

Page 87: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

67

PHP 프로그래밍

3. PHP 태그를 열고, 새로운 배열을 생성한다.

<?php

$movies = array (

10 => 'Casablanca',

9 => 'To Kill a Mockingbird',

2 => 'The English Patient',

8 => 'Stranger Than Fiction',

5 => 'Story of the Weeping Camel',

7 => 'Donnie Darko'

);

이 배열은 점수가 키, 영화의 제목이 값이다. 이

구조는 전체 목록의 정렬을 위하여 몇몇 가능성

을 열어 놓을 것이다. 영화의 목록과 점수를 원하

는 형태로 간단하게 바꿀 수 있다.

4. 배열을 출력한다.

echo '<tr><td colspan="2"><b>In their original order:</b></td> </tr>';

foreach ($movies as $key => $value) {

echo "<tr><td>$key</td>

<td>$value</td></tr>\n";

}

이 시점에서의 배열은 정의될 때 그대로의 순서이

다. 확인을 위해 출력해 보자. 표제가 먼저 출력된

후, foreach 루프 안에서는, 첫째 칼럼에 키가, 둘

째 칼럼에 값이 출력된다. HTML 소스 코드를 쉽

게 읽기 위해 줄바꿈 문자가 출력되었다.

스크립트 2.8 스크립트 계속

27 foreach ($movies as $key => $value) {

28 echo "<tr><td>$key</td>

29 <td>$value</td></tr>\n";

30 }

31

32 // Display the movies sorted by title:

33 asort($movies);

34 echo '<tr><td colspan="2"><b>Sorted by title:</b></td></tr>';

35 foreach ($movies as $key => $value) {

36 echo "<tr><td>$key</td>

37 <td>$value</td></tr>\n";

38 }

39

40 // Display the movies sorted by rating:

41 krsort($movies);

42 echo '<tr><td colspan="2"><b>Sorted by rating:</b></td></tr>';

43 foreach ($movies as $key => $value) {

44 echo "<tr><td>$key</td>

45 <td>$value</td></tr>\n";

46 }

47

48 ?>

49 </table>

50 </body>

51 </html>

Page 88: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

68

2 장

5. 알파벳순으로 제목을 정렬하고 다시 한번 출력해

보자.

asort($movies);

echo '<tr><td colspan="2"><b>Sorted by title:</b></td></tr>';

foreach ($movies as $key => $value) {

echo "<tr><td>$key</td>

<td>$value</td></tr>\n";

}

asort() 함수는 키-값의 관계를 유지하면서 값에

의한 정렬을 수행한다. 나머지 코드는 스텝4를 그

대로 반복하면 된다.

6. 점수를 내림차순으로 정렬하고 다시 한번 출력한

다.

echo '<tr><td colspan="2"><b>Sorted by rating:</b></td></tr>';

foreach ($movies as $key => $value) {

echo "<tr><td>$key</td>

<td>$value</td></tr>\n";

}

ksort() 함수는 키에 의한 오름 차순 정렬을 수행

한다. 높은 점수를 받은 영화가 첫 번째로 출력되

어야 하므로 krsort()를 사용해야 한다. krsort()

는 asort() 함수와 마찬가지로 키-값의 관계를 유

지한다.

Page 89: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

69

PHP 프로그래밍

7. PHP 섹션과 테이블 , HTML을 모두 종결한다.

?>

</table>

</body>

</html>

8. 파일 이름을 sorting.php로 저장하고, 웹 디렉터

리에 위치시킨 후, 웹 브라우저로 테스트해본다

(그림 2.22).

Tips

▒ 영화 평점으로 소수를 사용하려면, 점수 부분을

인용부호로 감싸야 한다. 그렇지 않으면 PHP는

소수점 이하를 무시해 버린다(숫자 키로는 정수

만 허용된다).

▒ 배열의 순서를 무작위로 만들려면 shu¾e() 함수

를 사용하라.

▒ natsort() 함수는 자연정렬(natural order)을 수

행한다(특히 문자열 안의 숫자를 정렬할 때 유용

하다 ).

▒ 다차원 배열을 정렬하려면 약간의 추가적인 수고

를 감수해야 한다. 더 상세한 내용은 usort() 함

수와 관련하여 PHP 매뉴얼을 참고하거나, PHP

5 advanced: Visual QuickPro Guide book을 참

고하라.

▒ PHP는 기본적으로 영어를 기준으로 정렬을

수행한다. 다른 언어에서 배열을 정렬하려면

setlocale() 함수로 언어 환경을 변경해야 한다.

14장 “다국어 사이트 만들기”에서 이러한 주제를

자세히 다룬다.

그림 2.22 이 페이지는 배열의 다양한 정렬 방법을 보여

준다.

Page 90: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

70

2 장

for와 while 루프2장에서 마지막으로 논의할 언어구조는 루프이다. 이

미 전체 배열 요소에 접근하기 위해 foreach루프를

사용했으며, 나머지 2개의 루프로 for와 while이 남

았다.

while 루프는 다음과 같은 형태이다.

while (조건) {

// 처리

}

while 루프는 조건이 참이면 실행을 반복하며, 조건

이 거짓이 되는 순간 루프는 정지된다(그림 2.23). 반

대로 조건이 참이 되는 순간이 없다면 루프는 전혀

실행되지 않을 것이다. while 루프는 데이터베이스

로부터 결과 값을 넘겨받을 때 자주 사용되는데, 8장

‘MySQL과 PHP의 사용’에서 자세한 내용을 다룬다.

for 루프는 문법적으로 조금 더 복잡하다.

for (초기화 수식; 조건; 종결 수식) {

// 처리

}

첫 번째 루프가 진행되면서 초기화 수식이 실행된다.

그 후 조건을 검사하고 루프의 내용의 실행된다. 실행

이 끝나면 종결 수식이 실행되고 조건이 다시 검사된

다. 이러한 절차가 조건이 거짓일 때까지 계속된다(그

림 2.24).

예를 들어 보자.

for ($i = 1; $i <= 10; $i++) {

echo $i;

}

그림 2.23 이 흐름도는 PHP가 while

루프를 처리하는 방법을 보여준다.

그림 2.24 이 흐름도는 PHP가 좀 더 복잡한 for 루

프를 처리하는 방법을 보여준다.

Page 91: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

71

PHP 프로그래밍

첫 번째 루프가 실행되고, $i 변수에는 1이 할당된다.

그 후 조건을 검사하는데, 검사 결과가 참이라면 1이

출력되고(echo $i), $i는 2로 증가한다($i++). 조건을

다시 검사하고, 또 참이라면 2가 출력되고 $i는 3으로

증가하는 등의 일이 한동안 반복된다. 결국 이 스크

립트는 1부터 10까지의 숫자를 출력될 것이다.

for와 while 루프는 서로 바꾸어서 사용할 수 있을 정

도로 유사한 기능을 한다. 그러나 정해진 횟수만큼

반복적인 실행이 필요할 때에는 for 루프를, 정확히

알 수 없는 횟수만큼 실행해야 할 때는 while 루프를

사용하는 것이 좋다.

2장의 마지막 예제에서는 이미 만들어진 달력 스크

립트에서 foreach 루프를 for 루프로 변경해 보자.

루프 사용하기:

1. 문서 편집기로 calendar.php(스크립트 2.6)를 불

러온다.

2. $days와 $years의 배열을 생성하는 부분을 삭제

한다(라인 18-19).

루프를 사용하여 추가적인 코드나 메모리의 낭비

없이 2개의 풀다운 메뉴를 똑같이 만들 수 있다.

$months 배열은 그대로 유지한다.

3. $days를 처리하는 foreach 루프를 for 루프로 변

경하여 다시 작성한다(스크립트 2.9)

for ($day = 1; $day <= 31; $day++) {

echo "<option value=\"$day\">$day </option>\n";

}

for 루프는 $day를 1로 초기화하는 것으로 시작

한다. 이 루프는 $day가 31보다 커질 때까지 계속

되고, 각 반복 동안에 $day는 1씩 증가한다. 루프

의 내용은 echo()문으로 출력된다.

스크립트 2.9 루프는 주로 배열과 함께 사용된다. 여기서

는 2개의 for 루프가 배열과 이전 스크립트에서의 foreach

루프를 대신한다.

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

2 "http://www.w3.org/TR/xhtml1/ DTD/xhtml1-transitional.dtd">

3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

4 <head>

5 <meta http-equiv="content-type" content="text/html; charset= iso-8859-1" />

6 <title>Calendar</title>

7 </head>

8 <body>

9 <form action="calendar.php" method="post">

10 <?php # Script 2.9 - calendar.php #2

11

12 // This script makes three pull-down menus

13 // for an HTML form: months, days, years.

14

15 // Make the months array:

16 $months = array (1 => 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

17

18 // Make the months pull-down menu:

19 echo '<select name="month">';

20 foreach ($months as $key => $value) {

21 echo "<option value=\"$key\">$value</ option>\n";

22 }

23 echo '</select>';

24

25 // Make the days pull-down menu:

26 echo '<select name="day">';

<다음 쪽에 스크립트 계속>

Page 92: PHP 6 & MySQL 5 : 다이내믹한 웹사이트 만들기

72

2 장

4. $years를 처리하는 foreach 루프는 for 루프로 변

경하여 다시 작성한다.

for ($year = 2008; $year <= 2018; $year++) {

echo "<option value=\"$year\">$year </option>\n";

}

이 루프의 구조는 이전의 for 루프와 구조적으

로 동일하지만, $years 변수가 최초에 1이 아니라

2008로 초기화되는 것이 조금 특이하다. $year가

2018보다 작거나 같으면 루프는 계속 실행될 것이

며 각 루프에서는 echo() 문이 실행된다.

5. 파일을 저장하고, 웹 디렉터리에 위치시킨 후, 웹

브라우저로 테스트해본다(그림 2.25).

Tips

▒ PHP는 문법이 약간 다른 do…while 루프를 지원

한다. do…while 루프는 최소한 한번은 루프의 내

용이 실행된다.

▒ 루프를 사용할 때는 무한루프에 빠지지 않도록

매개변수나 조건을 유의해서 살펴보아야 한다.

무한루프는 루프의 조건이 항상 참인 경우에 발

생하여 루프문 밖으로 빠져 나오지 못해 무한

대로 루프문 안의 코드가 실행되어 서버의 자원

이 허용하는 순간까지 계속하여 실행된다. 이는

PHP 코드의 웹페이지 출력이 이뤄질 경우에는

오류 메시지를 출력하게 된다.

스크립트 2.9 스크립트 계속

27 for ($day = 1; $day <= 31; $day++) {

28 echo "<option value=\"$day\">$day</ option>\n";

29 }

30 echo '</select>';

31

32 // Make the years pull-down menu:

33 echo '<select name="year">';

34 for ($year = 2008; $year <= 2018; $year++) {

35 echo "<option value=\"$year\">$year</ option>\n";

36 }

37 echo '</select>';

38

39 ?>

40 </form>

41 </body>

42 </html>

그림 2.25 이 달력은 이전의 형태(그림

2.19)와 완전히 똑같지만, 2개의 배열이 덜

사용되었다 (스크립트 2.9와 2.6을 비교해

보라).