316
PHP WEB PROGRAMMING 유승열

Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHPWEB PROGRAMMING

유승열

Page 2: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

<차례>

[머리말] 8

PHP란? 9

Windows에서 PHP 사용 10

¡ PC에서 PHP를 사용하는 방법 10

¡ XAMPP 프로그램 다운로드 11

¡ 프로그램 설치 11

¡ XAMPP 실행 13

¡ XAMPP 서비스들 14

¡ Apache, MySql 실행 15

¡ 컴퓨터 부팅시 Apache, MySql 자동 실행하기 15

¡ 웹사이트 확인 17

¡ MySql 확인 19

Scripting Tools 20

¡ PHP와 같은 Script 언어를 코딩하는데 사용하는 도구들 20

Web Server 환경 이해 21

¡ DocumentRoot 21

¡ DirectoryIndex 21

PHP "Hello World!” 22

¡ Hello World 출력하기 22

PHP 기본 문법(syntax) 23

¡ <?php .... ?> 23

¡ 주석 24

PHP 변수(Variables) 25

¡ 변수(Variables)란? 25

¡ 변수 값 출력 : echo 또는 print 25

¡ 변수에서 데이터 타입(Type) 26

¡ 변수의 유효 범위 : Global, Static, Local 26

¡ 변수 설정 여부 확인 및 제거 - isset(), unset(), empty() 29

PHP 상수(Constants) 32

¡ 상수(Constants)란? 32

¡ PHP 마법 상수 33

PHP Data Types 35

Page 3: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

¡ PHP에서 지원하는 Data Type들 35

¡ PHP Data Type 확인 35

PHP String(문자열) 37

¡ 문자열(String)이란? 37

¡ 문자열 관련 함수들 40

PHP Operators(연산자) 42

¡ 연산자(Operator)란? 42

¡ 연산자 Types 42

¡ 산술(계산) 연산자 42

¡ 증감 연산자 43

¡ 비교 연산자 44

¡ 대입(할당) 연산자 45

¡ 문자열 연산자 46

¡ 논리 연산자 47

¡ 조건 연산자 = 3항 연산자 48

PHP 조건문 49

¡ 조건문이란? 49

¡ if, if...else, if...elseif...else 예제 49

¡ switch 예제 50

PHP 반복문(Loop) 51

¡ 반복문이란? 51

¡ for 51

¡ while 53

¡ do...while 54

¡ foreach 54

PHP 배열(Arrays) 56

¡ 배열이란? 56

¡ indexed array 56

¡ associative array 57

¡ 다차원 배열 57

¡ 배열 크기 구하기 58

¡ 배열인지 확인하기 59

¡ 배열 정렬하기 59

Page 4: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

¡ 배열에 값이 있는지 확인하기 60

¡ 배열에 값을 추가하기 61

¡ 배열에서 마지막 값을 추출하기 62

¡ 배열에서 임의의 값을 가져오기 62

¡ 배열을 랜덤하게 섞는다 63

¡ 배열의 값을 합산 63

PHP 함수(Functions) 64

¡ 함수란? 64

¡ PHP 내장함수 65

¡ PHP 사용자 정의 함수 65

PHP Class 68

¡ class란? 68

¡ 예제로 보는 class 68

PHP Superglobal 변수들 70

¡ Superglobal 변수란? 70

¡ $GLOBALS 변수 70

¡ $_GET 변수 72

¡ $_POST 변수 73

¡ $_FILES 변수 74

¡ $_COOKIE 변수 77

¡ $_SESSION 변수 78

¡ $_REQUEST 변수 81

PHP Forms 83

¡ Form에 대한 이해 83

¡ GET 83

¡ POST 84

¡ GET Form 예제 84

¡ POST Form 예제 85

¡ Form Validation 87

¡ Client Side Form Validation 88

¡ Server Side Form Validation 92

¡ Form Data 보안 94

PHP Filters 97

Page 5: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

¡ Filter란? 97

¡ 예제로 Filter 배우기 97

PHP 파일에 다른 PHP 포함 103

¡ include, require 103

¡ include 기본 예제 103

¡ include 중복 시 에러 예제와 해결방법 106

PHP 날짜, 시간 다루기 109

¡ date() 함수를 사용하여 날짜 시간 다루기 109

¡ Time Zone 다루기 112

¡ mktime()으로 날짜 시간 다루기 113

PHP File 다루기 115

¡ 서버에 파일 읽고 쓰기 115

PHP MySQL Database 118

¡ PHP Database 118

¡ MySQLi vs PDO 118

¡ MySQL 준비 – phpMyAdmin 119

¡ MySQL에 연결하기 140

¡ MySQL 데이터 읽기 - SELECT 142

¡ MySQL 데이터 읽기 개수 제한하기 - LIMIT 144

¡ MySQL 데이터 정렬 순서 – ORDER BY 145

¡ MySQL 데이터 검색 조건 – WHERE 146

¡ MySQL 데이터 삽입하기 – INSERT INTO 148

¡ MySQL 데이터 수정하기 – UPDATE 151

¡ MySQL 데이터 삭제하기 – DELETE 156

¡ MySQL DB 보안 158

¡ MySQL DB 추가 정보 162

PHP 그래픽(GD) 163

¡ GD란? 163

¡ GD로 이미지 생성하기 163

¡ 존재하는 이미지 불러 작업하기 164

¡ 두 개의 이미지 합치기 166

¡ 이미지 크기 변경하여 저장하기 168

¡ 썸네일 함수 만들기 170

Page 6: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

¡ 그래픽 관련 함수 173

¡ 막대그래프 그리기 예제 175

PHP XML 178

¡ XML이란? 178

¡ 뉴스 rss 읽어서 출력하기(네이버 뉴스 예) 184

PHP JSON 187

¡ JSON이란? 187

¡ 배열을 JSON으로 변환 187

¡ XML을 JSON으로 변환 188

¡ DB 테이블을 JSON으로 변환 189

¡ JSON을 배열으로 변환 190

PHP AJAX 191

¡ AJAX란? 191

¡ Email 중복 여부 확인 예제 191

¡ 추천 검색어 보여주기 예제 196

[부록] PHP MVC 199

PHP MVC Part 1 200

¡ MVC란 무엇인가? 200

¡ MVC 프로그래밍 준비 201

¡ url 정책 설정(.htaccess) 202

¡ index.php 203

¡ application\config\config.php 203

¡ application\libs\application.php 204

¡ 콘트롤러 엔진 application\libs\controller.php 213

¡ 첫 번째 콘트롤러 만들기 213

¡ mvc 실행 테스트 217

¡ 추가적인 파일 생성 및 저장 218

PHP MVC Part 2 227

¡ 데이터베이스 준비 227

¡ model 파일 만들기 236

¡ board 콘트롤러 수정하기 239

¡ view 파일 수정하기 242

PHP MVC Part 3 246

Page 7: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

¡ application\views\board\index.php 수정 246

¡ application\controller\board.php 수정 248

¡ view 파일들을 수정 및 추가 253

¡ model 파일 수정 255

[부록] Laravel 활용 Todo App 만들기 260

What is Laravel? 261

Laravel 설치 262

¡ Before Laravel Install 262

¡ Laravel Install 263

¡ Laravel 환경설정 270

¡ MySql DB 준비 271

첫 페이지 수정하기 273

¡ 첫 페이지는 어떻게 표시되는가? 273

¡ 첫 페이지 내용 수정 연습 274

¡ 새로운 view 파일 생성하여 연결하기 275

에러 방지용 설정 변경 (5.4 버전 이상, MariaDB를 사용하는 환경에서) 277

¡ migration 실행 시 발생하는 에러 277

¡ 에러 해결 방법 278

¡ DB 초기화 하기 280

Todo App 만들기 283

¡ Todo App이란? 283

¡ tasks 테이블 만들기 283

¡ Auth로 인증 만들기 286

¡ Model 생성하기 286

¡ Model들 간의 관계 설정하기 287

¡ Controller 생성하기 289

¡ Routing 설정하기 292

¡ 메인 페이지 설정 296

¡ 사용자 추가하기 305

¡ 할 일 추가 완성하기 306

¡ 할 일 삭제 처리하기 309

¡ 수정 처리하기 311

¡ 추가 설명 : {{ csrf_field() }} 315

Page 8: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

[머리말]PHP는 서버 측면에서 웹 페이지를 생성하고 서버의 자원을 처리하는 프로그래밍

언어이다. HTML, CSS, JavaScript가 클라이언트 측면에서 사용자의 브라우저에서

작동하는 반면 PHP는 서버에서 작동하며 처리결과를 사용자에게 전송하거나 서버

내에서 작업을 수행한다.

웹은 기본적으로 웹 서버 환경에도 작동하며 사용자에게 페이지를 전송하므로 서

버의 자원들 예를 들면 데이터베이스나 디스크, 파일들을 다루는 작업이 필하다.

PHP는 이러한 작업을 처리해주는 서버측 언어중 하나이며 현 상태에서는 가장 점

유율이 높은 언어이다.

PHP는 Java나 C와 같은 언어에 비해 프로그래밍 언어로서의 완결성이 떨어진다고

가치를 낮게 보는 경향도 있지만 PHP는 수많은 Open Source들과 함께 여전히 높

은 점유율을 자랑하고 있다. 또한 웹의 인기가 높아지는 시점에 PHP의 공헌은 지

대한 것이어서 포털사이트를 비롯해서 초창기 웹의 수많은 페이지들이 PHP로 제

작되었다.

본 교재에서는 PHP의 기본적인 개념과 사용법을 설명한다. 또한 웹 개발에서 가

장 중요한 요소 중 하나인 데이터베이스를 위해 PHP와 가장 많이 사용되는

MySQL을 설명한다.

후반부서는 최근에 가장 많이 사용되는 프로그래밍 아키텍쳐인 MVC 제작과

Open Soirce MVC Framework 중 가장 많이 사용되는 Laravel을 활용해 간단한 어

플리케이션을 제작하는 방법을 설명한다.

초보자를 위한 교재인만큼 지나치게 복잡한 내용은 제외하였지만 PHP를 처음 배

우려는 초보자가 알아야 할 내용들은 대부분 담았다.

많은 분들에게 도움이 되길 바란다.

2018년 2월 유승열

Page 9: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 9

PHP란?

¡ PHP = "PHP: Hypertext Preprocessor”

¡ 가장 많이 사용되는 웹용 서버 사이드 스크립트 언어 중

하나

Ÿ 서버 사이드: 서버에서 실행되는 언어 – PHP, JAVA, C, C#.NET...

Ÿ 클라이언트 사이드: 브라우저에서 실행되는 언어 – HTML, CSS, JavaScript

¡ 많은 Open Source 들이 PHP로 개발되었다.

¡ Wordpress, xpressengine, zoomla, drupan, phpBB 등

¡ PHP는 많은 데이터베이스를 지원한다.

Ÿ Oracle, Sybase, Solid, PostgreSQL, Generic ODBC 등

Ÿ http://phplens.com/adodb/supported.databases.html

¡ PHP는 무료

¡ PHP는 다양한 플랫폼을 지원 F Windows, Linux, Unix 등

¡ PHP는 Apache, IIS등 대부분의 웹서버 S/W와 호환됨

¡ PHP 공식사이트 – http://php.net/

¡ PHP 최신버전 – 7.2.0 (2017.12월 현재)

Page 10: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 10

Windows에서 PHP 사용

¡ PC에서 PHP를 사용하는 방법

Ÿ php.net에서 다운로드하여 Windows용 PHP 설치

F http://php.net/downloads.php 접속 후 버전 선택하여 Windows Downloads에서 다운로드

및 설치가능

Ÿ XAMPP: Apache, MySql, PHP를 한 번에 설치

F https://www.apachefriends.org 접속하여 최신 XAMPP Windows용 설치

Ÿ WAMPP: Windows용 Apache, MySql, PHP 한 번에 설치

F http://www.wampserver.com/en/ 접속하여 최신 버전의 WAMPP 설치

Page 11: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 11

¡ XAMPP 프로그램 다운로드

이 교재에서는 위 세가지 방법 중 XAMPP를 사용

Ÿ https://www.apachefriends.org 접속

Ÿ XAMPP for Windows 클릭하여 다운로드(7.2.0)

F XAMPP 버전은 포함된 PHP 버전과 동일

¡ 프로그램 설치

Ÿ 다운로드 폴더에서 xampp-win32-7.2.0-0-VC15-installer.exe 더블클릭

F 64bit 컴퓨터에서 아래와 같은 경고 만나면 무시하고 [OK] 클릭하여 진행

Page 12: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 12

Ÿ Next 버튼 누르며 계속 진행하여 설치 완료

Page 13: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 13

Ÿ 설치 종료 화면에서 Do you want to start the control Panel now? 체크하고

Finish 누르면 XAMPP Control Panel 실행

F 최초로 XAMPP Control Panel 실행 시 그림과 같이 언어 환경 설정을 하는데 왼쪽 깃발 아

래 체크하고 Save 버튼 누르면 영어로 셋팅되고 다음부터는 묻지 않음.

¡ XAMPP 실행

Ÿ 최초 설치 후에는 자동으로 XAMPP Control Panel이 실행됨

Ÿ 나중에 실행할 때는 C:\xampp 폴더를 탐색기로 열어서 xampp_control.exe를

더블 클릭해 직접 실행해 줘야 함.

Page 14: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 14

¡ XAMPP 서비스들

Ÿ Apache : Web Server 소프트웨어

Ÿ MySql : MySql 데이터베이스

F 이 버전에 실제 설치된 것은 MariaDB이나 MySql과 같음

Page 15: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 15

Ÿ FileZilla : FTP 서버(이 서버 컴퓨터에 파일을 업로드 할 수 있게 해줌)

Ÿ Mercury : 메일 서버(로컬 컴퓨터에서 메일 전송할 수 있게 해줌)

Ÿ Tomcat : 서버에서 Java를 사용할 수 있도록 해주는 S/W(JavaScript 아님)

¡ Apache, MySql 실행

Ÿ 이 학습자료에서는 웹서버를 실행하여 웹서비스를 테스트하고 PHP와 MySql을

사용할 것이므로 Apache와 MySql 옆의 Start 버튼을 클릭

F Apache와 MySql을 Start 해서 버튼이 Stop으로 바뀌어 있다.

F PHP는 Apache와 연결되어 있어 Apache를 실행하면 자동으로 실행됨.

¡ 컴퓨터 부팅시 Apache, MySql 자동 실행하기

Ÿ 매 번 xampp_controll.exe를 실행해서 XAMPP Controll Panel을 열지 않고도

컴퓨터를 켜면 바로 Apache와 MySql을 실행하는 방법

Page 16: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 16

Ÿ Windows 탐색기에서 c:\xampp 폴더를 연다.

Ÿ xampp_control.exe 파일 위에서 마우스 오른쪽 버튼을 누른다.

Ÿ 아래와 같이 XAMPP Control Panel 각 서비스 앞에 빨간색 X 버튼이 표시된다.

Ÿ Apache와 MySql 앞의 X 버튼을 클릭하면 아래와 같이 경고창이 표시된다. Yes

Page 17: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 17

를 클릭하면 이제 X 버튼이 녹색 체크 버튼으로 바뀌면서 Windows 서비스에

등록된다. 그리고 Apache와 MySql을 Start 해주자.

Ÿ 이제 Apache와 MySql은 컴퓨터를 껐다 켜도 자동으로 실행된다.

¡ 웹사이트 확인

Ÿ http://localhost/ 또는 http://127.0.0.1 주소로 웹사이트 확인

Ÿ 또는 아래와 같이 XAMPP Control Panel의 Admin 버튼 눌러 브라우저 열기

(Window 기본 브라우저에 dashboard 페이지가 열림)

F 이는 c:\xampp\htdocs 폴더의 index.php에 dashboard로 리다이렉션(페이지 이동)되도록

설정되어 있어서 그런 것임.

Page 18: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 18

Ÿ dashboard 없애기

실제 PHP를 배우는데 위 dashboard는 필요 없으므로 c:\xampp\htdocs에 들어

가서 모든 파일을 지우면 됨.

위와 같이 c:\xampp\htdocs 내의 모든 파일을 제거하고 다시 http://localhost/

또는 http://127.0.0.1 주소로 웹사이트를 확인하거나 또는 XAMPP Control Panel

의 Admin 버튼 눌러 브라우저 열어 보면 다음과 같이 빈 폴더(디렉토리)의 내용을

보여주는 화면만 표시된다.

Page 19: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 19

¡ MySql 확인

Ÿ MySql은 phpmyadmin이라는 php로 제작된 관리 프로그램을 통해 확인할 수

있다.

Ÿ 주소 창에서 http://localhost/phpmyadmin 또는 http://127.0.0.1/phpmyadmin

을 열거나 아래 그림과 같이 XAMPP Control Panel의 MySql 의 Admin 버튼을

클릭해 phpmyadmin을 연다.

Ÿ 아래와 같이 phpmyadmin이 열린 것을 확인한다.

F MySql에 대한 상세한 사항은 MySql에 대해 공부할 때 다시 설명한다.

Page 20: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 20

Scripting Tools

¡ PHP와 같은 Script 언어를 코딩하는데 사용하는 도구들

Ÿ IDE – PHP 또는 웹 통합개발환경(Integrated Development Environment)

① PHPStorm

① Netbeans

② Aptana Studio

③ Eclipse

Ÿ Code Editors

④ Sublime Text

⑤ Visual Studio Code

⑥ Atom

⑦ Notepad++

⑧ Coda

⑨ Brackets

⑩ SlickEdit

⑪ jEdit

⑫ Programmer’s Notepad

⑬ Komodo Edit

⑭ RJ TextEd

⑮ Editplus

⑯ UltraEdit

Ÿ WEB IDE – 웹기반 PHP 또는 웹 통합개발환경(Cloud 기반)

① Codeanywhere

② c9.io

③ codenvy.io

④ shiftedit

Page 21: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 21

Web Server 환경 이해

¡ DocumentRoot

Ÿ DocumentRoot란 웹 서버의 웹 문서가 저장되는 위치를 말함

Ÿ 이 설정은 Apache의 환경 설정 파일에 있음

Ÿ C:\xampp\apache\conf\httpd.conf 파일을 메모장에서 열면 다음 줄이 있음

DocumentRoot�"C:/xampp/htdocs"

Ÿ 만일 웹 문서 저장 위치를 바꾸고 싶으면 위 줄에서 따옴표("") 안의 폴더(디렉

토리)를 바꾸고 저장한 후 Apache를 Stop 후 다시 Start 해주면 됨.

¡ DirectoryIndex

Ÿ DirectoryIndex란 웹 주소 요청에서 파일명 대신 디렉토리가 요청되었을 때 자

동으로 실행해야 할 파일을 말한다.

Ÿ 예를 들어 http://localhost/about.php 와 같이 접근하지 않고 http://localhost/

또는 http://localhost/about 과 같이 요청했다면 이는 htdocs 폴더의 디렉토리

또는 htdocs 폴더 아래의 about 폴더에 파일명 지정 없이 접근한 것이다. 이

경우 Apache는 자동으로 보여줄 파일에 대한 설정을 가지고 있는데 바로

DirectoryIndex이다.

Ÿ DirectoryIndex는 httpd.conf 파일 안에 다음과 같이 설정되어 있다.

DirectoryIndex�index.php�index.pl�index.cgi�index.asp�index.shtml�index.html...

Ÿ 위의 설정을 보면 디렉토리에 접근했을 때 처음으로 index.php를 찾고 없으면

다음으로 index.pl, index.cgi... 순으로 파일을 찾아서 열게 된다. 만일 이 목록에

있는 파일이 하나도 없으면 설정에 따라 파일 목록을 그대로 보여주거나 디렉

토리 읽기가 차단된 경우 이를 읽을 수 없다는 에러를 표시한다.

Page 22: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 22

PHP "Hello World!”

¡ Hello World 출력하기

Ÿ c:\xampp\htdocs\index.php 작성 후 http://localhost 열기

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="UTF-8">

�<title>Hello�World</title>

</head>

<body>

�<?php�echo�"<h1>Hello�World!</h1>";�?>

</body>

</html>

또는

<?php

echo�"<!DOCTYPE�html>\n";

echo�"<html�lang='en'>\n";

echo�"<head>\n";

echo�"<meta�charset='UTF-8'>\n";

echo�"<title>Hello�World</title>\n";

echo�"</head>\n";

echo�"<body>\n";

echo�"<h1>Hello�World!</h1>\n";

echo�"</body>\n";

echo�"</html>\n";

?>

Page 23: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 23

PHP 기본 문법(syntax)

¡ <?php .... ?>

Ÿ PHP 코드는 <?php 와 ?> 사이에 들어간다.

<html>

<body>

<?php�echo�"Hello�World!";�?>

</body>

</html>

Ÿ PHP 코드로만 끝날 경우에는 닫는 태그 ?>는 생략해도 된다.

<?php�

������$name�=�"홍길동”;

������echo�$name;

?>

Ÿ HTML 코드 사이에 PHP 코드를 삽입할 수 있다.

<?php�$name�=�""홍길동”;�?>

<html>

<body>

<h1><?php�echo�$name;�?>�님�안녕하세요!</h1>

</body>

</html>

Ÿ PHP 코드에서 HTML을 출력할 수 있다.

<?php�

���echo�"<html>”;�

���echo�"<body>”;�

���echo�"<h1>Hello�World</h1>”;�

���echo�"</body>”;�

���echo�"</html>”;�

?>

Page 24: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 24

¡ 주석

Ÿ 한 줄 주석 : // 다음의 한 줄 구문은 실행되지 않고 주석이 됨

<?php�

���//PHP�한�줄�주석

���//echo�"Hello�World”;�

?>

Ÿ 여러 줄 주석 : /* ... */ 안의 구문은 실행되지 않고 주석이 됨

<?php�

���/*�PHP�여러�줄�주석�*/

���/*�

���echo�"홍길동님<br>”;�

���echo�"안녕하세요!”;�

���*/

?>

Page 25: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 25

PHP 변수(Variables)

¡ 변수(Variables)란?

Ÿ 변수(Variables)는 어떤 정보를 저장하는 저장소 역할을 한다.

Ÿ PHP에서 변수는 항상 $ 기호로 시작한다.

Ÿ $다음에 오는 변수의 첫 글자는 알파벳 문자 또는 _로만 시작할 수 있다.

Ÿ PHP에서 변수 이름에는 알파벳, 숫자, _ 만 사용할 수 있다.

<?php�

���$name�=�"홍길동”;�//적절함

���$_sum�=�30;�//적절함

���$123�=�"123”;�//오류�발생

���$a123�=�"123”;�//적절함

���$b@a�=�"123”;�//오류�발생

���$b-a�=�"123”;�//오류�발생

?>

Ÿ 변수 이름에서 대문자와 소문자는 전혀 다른 이름임

<?php�

���//�아래의�변수는�모두�다른�변수임

���$name�=�"홍길동”;

���$Name�=�"김영철”;

���$NaMe�=�"박철수”;

���$NAME�=�"최고다”;

?>

¡ 변수 값 출력 : echo 또는 print

Ÿ PHP에서 변수의 값을 출력하고자 할 때 echo 또는 print를 사용한다.

F 이 두 명령어는 거의 유사하게 사용된다.

<?php�

���$name�=�"홍길동”;

���$age�=�30;

���echo�$name;�//홍길동

Page 26: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 26

���echo�$name�.�"의�나이는�”�.�$age�.�"입니다.”;�//홍길동의�나이는�30입니다.

���$a�=�100;

���$b�=�50;

���echo�$a�+�$b;�//150

���print�$a�*�$b;�//5000

?>

¡ 변수에서 데이터 타입(Type)

Ÿ PHP는 변수를 선언할 때 데이터 타입을 지정하지 않고 대입된 값에 따라 자동

으로 변환한다.

<?php�

���$a�=�100;�//정수형��

���$b�=�"Hello”;//문자형

?>

F C언어나 Java의 경우 다음과 같다.

���

���int�a�=�100;�//정수형��

���char�b�=�"Hello”;//문자형

¡ 변수의 유효 범위 : Global, Static, Local

Ÿ 변수의 유효 범위란?

변수의 유효 범위란 변수에 접근할 수 있는 영역의 범위를 말한다. 예를 들어 코드 내 어디서나

접근 가능한 함수 밖의 변수를 전역(Global) 변수라 하고 함수 등의 내부에서만 사용가능한 변수

는 지역(Local) 변수라 한다. 지역변수 중에서도 값을 기억해두는 변수는 Static 변수라 한다.

예를 들어 다음과 같은 코드를 실행시켜보자.

<?php�

���$x�=�2;�//전역변수

���echo�$x;�//전역변수�출력

���function�mytest(){

������$y�=�5;

������echo�$x�*�$y;

���}

���mytest();

Page 27: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 27

���echo�$y;

?>

Ÿ 위 코드를 실행시키면 아래와 같은 에러 메시지를 표시한다.

먼저 첫 번째 에러부터 보자. "Undefined variable: x”는 변수 x를 찾을 수 없다는 메시지이다.

이미 $x = 2;와 같이 하여 전역변수를 정의했는데도 에러메시지를 표시하는 것이다.

이는 함수 안에서 전역변수에 그냥 접근할 수 없도록 하는 PHP의 특징 때문이다.

JavaScript의 경우에는 그냥 바로 전역변수에 접근하지만 PHP는 함수 안에서 전역변수에 접근하

기 위해서는 global 이라는 키워드를 사용해야 한다.

위 코드가 에러를 발생시키지 않게 하려면 다음과 같이 고쳐야 한다.

<?php�

���$x�=�2;�//전역변수

���function�mytest(){

������global�$x;�//전역변수�$x를�사용할�수�있다.

������$y�=�5;

������echo�"x*y="�.�($x�*�$y)�.�"<br>";

���}

���mytest();

���echo�"변수�x의�값은�"�.�$x�.�"<br>";

���echo�"변수�y의�값은�"�.�$y;�//지역변수인�$y에�접근이�되지�않아�여전히�에러�표시됨

?>

위의 코드로 함수 mytest 안에서 전역변수 $x에 접근하는 것은 가능케 하였다.

그러나 여전히 함수 안의 $y는 접근이 되지 않아서 에러가 발생한다.

Page 28: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 28

함수 안의 지역변수는 함수 호출에 의해 실행이 되고나면 사라지기 때문이다.

다음과 같은 코드는 지역변수의 값을 함수가 반환해주어 이를 새로운 전역변수로

만들어주는 예제이다. 그렇다고 해서 지역변수가 전역변수로 바뀌는 것은 아니며

다만 함수의 반환 값을 새로운 변수로 정의할 뿐이다.

아래 예제에서 함수 안의 $y와 함수를 호출한 값을 할당한 루트 영역의 $y는 전혀

다른 변수인 셈이다. 함수에 대해서는 함수 편에서 자세히 설명하기로 한다.

<?php�

���$x�=�2;�//전역변수

���function�mytest(){

������$y�=�5;

������return�$y;

���}

���$y�=�mytest();

���echo�"변수�x의�값은�"�.�$x�.�"<br>";�//변수�x의�값은�2

���echo�"변수�y의�값은�"�.�$y;�//변수�y의�값은�5

?>

Ÿ 함수 안에서 전역변수에 접근하는 또 다른 방법 - $GLOBALS[‘변수명’]

<?php�

�$x�=�2;�//전역변수

�function�mytest(){

��echo�"x="�.�$GLOBALS['x'];

�}

�mytest();�//x=2

?>

Ÿ Static

예를 들어 함수 안의 변수는 Local 변수이므로 함수가 실행되고 나면 메모리에서 사라진다.

아래 예를 보자.

<?php�

function�plus_count()�{

�$count�=�0;

�$count++;

�echo�$count�.�"<br>";

}

plus_count();�//1

Page 29: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 29

plus_count();�//1

plus_count();�//1

plus_count();�//1

plus_count();�//1

?>

함수 plus_count() 안의 $count는 지역변수이므로 함수 안에서 실행되고 소멸된다.

함수를 호출할 때마다 $count = 0 으로 초기회되므로 100번을 실행해도 $count

는 1이된다. 그러나 때로는 함수 안의 값이 소멸되지 않고 유지되어야 할 때가 있

다. 이 때 사용하는 키워드가 STATIC이다. 다음과 같이 수정하고 실행해보자.

<?php�

function�plus_count()�{

�STATIC�$count�=�0;

�$count++;

�echo�$count�.�"<br>";

}

plus_count();�//1

plus_count();�//2

plus_count();�//3

plus_count();�//4

plus_count();�//5

?>

함수 안의 $count 변수 앞에 STATIC만 붙였는데 $count가 소멸되지 않고 유지되

어 함수를 호출할 때마다 값이 1씩 증가되어 출력된다.

¡ 변수 설정 여부 확인 및 제거 - isset(), unset(), empty()

Ÿ isset() : 변수가 설정되어 있는지 확인

아래의 예제는 설정되지 않은 변수에 접근하려고 할 때 에러가 발생하는 예제이다.

<?php�

�echo�$x;

?>

위와 같은 에러가 발생하지 않게 하려면 변수가 설정되어 있는지 검사해야 한다. 이 때 사용하는

Page 30: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 30

함수가 isset()이고 다음과 같이 사용하면 에러를 방지할 수 있다.

<?php�

�if(�isset($x)�)�{

��echo�$x;

�}�else�{

��echo�"변수�x가�설정되지�않았습니다.";

�}

?>

Ÿ unset() : 설정된 변수를 제거

아래의 예제는 설정된 변수를 제거하고 결과를 확인하는 예제이다. 첫 줄에 $x=2

와 같이 변수가 설정되었지만 다음 줄에 unset($x)로 $x를 제거하였기 때문에 변

수가 설정되지 않았다고 판단하게 된다.

<?php�

�$x�=�2;

�unset($x);

�if(�isset($x)�)�{

��echo�$x;

�}�else�{

��echo�"변수�x가�설정되지�않았습니다.";

�}

?>

변수를 제거하기 위해서 unset($x)을 사용하는 대신에 null 값을 $x에 대입해도 된

다. 아래는 그 예제이다.

<?php�

�$x�=�2;

�$x�=�null;

�if(�isset($x)�)�{

��echo�$x;

�}�else�{

��echo�"변수�x가�설정되지�않았습니다.";

Page 31: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 31

�}

?>

Ÿ empty() : 변수가 비어 있는지 확인

변수가 비어 있다는 것은 설정되지 않았다는 것은 아니고 다음의 값 중 하나를 가질 때에 해당

① "" (빈 문자열)

② 0 (정수 0)

③ "0" (문자열 0)

④ NULL

⑤ FALSE

⑥ array() (빈 배열)

⑦ var $var; (클래스 안에서 값없이 선언된 변수)

F 참조: http://php.net/manual/kr/function.empty.php

<?php�

�$x�=�"";

�$y�=�null;

�$x�=�0;

�echo�empty($x)�?�"empty"�:�$x;�//"empty”

�echo�empty($y)�?�"empty"�:�$y;�//"empty”

�echo�empty($z)�?�"empty"�:�$z;�//"empty”

?>\

Page 32: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 32

PHP 상수(Constants)

¡ 상수(Constants)란?

Ÿ 상수는 변수와 같이 값을 저장하는 저장소 역할을 한다.

Ÿ 상수와 변수의 가장 큰 차이는 상수는 한 번 정의하면 스크립트에서 나중에 값

을 변경할 수 없다. 반면 변수는 나중에 값을 변경할 수 있다.

Ÿ 상수 이름은 $ 부호를 사용하지 않는다.

Ÿ 상수는 변수와 다르게 스크립트 내에서 전역(Global)의 유효범위을 갖는다.

F 즉, 함수 또는 클래스 안에서 별도의 global 키워드 없이도 접근 가능하다.

Ÿ 상수이름은 대개 대문자로 정의한다.

Ÿ 상수의 선언은 define 함수를 사용한다.

define(name,�value,�case-insensitive)

F name : 상수이름(대문자)

F value : 상수 값(문자열 또는 숫자 등의 PHP 값)

F case_insensitive : 대소문자 무시(기본 값은 false), 이 값이 true이면 상수 이름 대소문자 무

시하고 사용 가능

Ÿ 상수를 사용하는 경우는 대개 어플리케이션의 환경설정(config)을 위한 값을

저장할 때 주로 사용한다. 다음은 상수 사용 예제이다.

<?php�

define("HOME",�"http://localhost/");�//�상수�선언

echo�HOME�.�"<br>";�//http://localhost/

echo�home�.�"<br>";�//에러�-�정의되지�않은�상수이름�

define("APPNAME",�"My�App",�true);�//상수�선언,이름의�대소문자�구분�않도록�설정

echo�APPNAME�.�"<br>";�//My�App

echo�appname�.�"<br>";�//My�App

define("HOME",�"http://mynewlocalhost/");�//에러

//Constant�HOME�already�defined,�한�번�정의된�상수는�재정의�불가.�

Page 33: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 33

function�get_my_home()�{

�echo�HOME;�//함수�안에서�상수에�접근�가능

}

get_my_home();�//http://localhost/

?>

¡ PHP 마법 상수

Ÿ PHP는 많은 미리 정의된 상수들(predefined constants)을 제공한다.

Ÿ 그 중에서도 php.net이 magical 상수라고 소개하는 9개의 상수들을 소개한다.

상수이름 설명

__LINE__ 이 상수가 사용된 라인 넘버

__FILE__현재 파일의 전체 경로와 파일명을 반환. 만일 이 상수가 include된 파

일 내부에 사용되었다면 include된 그 파일의 이름을 반환한다.

__DIR__

현재 파일의 디렉토리(폴더) 반환. 만일 이 상수가 include된 파일 내부

에서 사용되었다면 include된 파일의 디렉토리가 반환된다. 이 상수는

dirname(__FILE__)과 같다.

__FUNCTION__ 함수 이름을 반환

__CLASS__ 클래스 이름을 반환.

__TRAIT__ trait 이름을 반환

__METHOD__ 메서드 네임을 반환

__NAMESPACE__ 현재 네임스페이스의 이름을 반환

ClassName::class 클래스 네임을 반환

출처: http://php.net/manual/en/language.constants.predefined.php

Page 34: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 34

Ÿ 마법 상수 예제

<?php�

echo�__LINE__�.�"<br>";�//2

echo�__FILE__�.�"<br>";�//D:\xampp\htdocs\php\index.php

echo�__DIR__�.�"<br>";�//D:\xampp\htdocs\php

function�foo()�{

�echo�__FUNCTION__�.�"<br>";

}

foo();�//foo

class�Myclass�{

�function�info1()�{

��echo�__CLASS__�.�"<br>";

�}

�function�info2()�{

��echo�__METHOD__�.�"<br>";

�}�

}

$obj�=�new�Myclass();

$obj->info1();�//Myclass

$obj->info2();�//Myclass::info2

?>

Page 35: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 35

PHP Data Types

¡ PHP에서 지원하는 Data Type들

Ÿ PHP는 다음과 같은 데이터 형식들을 지원한다.

① String - 문자열

② Integer - 정수형

③ Float - 소수점이 있는 수, double이라고도 함

④ Boolean - TRUE 또는 FALSE

⑤ Array - 배열

⑥ Object - 객체

⑦ NULL – 값이 없는 변수(빈 값과는 다름)

⑧ Resource – 특수한 형태의 데이터

¡ PHP Data Type 확인

앞에서 설명한 것처럼 PHP는 변수를 선언할 때 데이터 타입을 선언하지 않는다.

즉, 어떤 데이터가 변수에 대입되었는지에 따라 데이터 타입이 변경된다. 다음 예

제는 var_dump() 함수로 데이터 타입과 값을 출력해서 확인하는 예제이다.

<?php�

$a�=�1;�

var_dump($a);�//int(1)

$b�=�3.14;�

var_dump($b);�//float(3.14)

$c�=�TRUE;

var_dump($c);�//bool(true)�

$d�=�"Hello�World!";

var_dump($d);�//string(12)�"Hello�World!"�

$e�=�array(1,2,3,"a");

var_dump($e);�//array(4)�{�[0]=>�int(1)�[1]=>�int(2)�[2]=>�int(3)�[3]=>�string(1)�"a"�}

$f�=�NULL;�

var_dump($f);�//NULL

class�Greetings�{

�function�say(�$name�)�{

Page 36: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 36

��return�"Hello�$name";

�}

}

$g�=�new�Greetings();

echo�$g->say("kim");�//Hello�kim

var_dump($g);�//object(Greetings)#1�(0)�{�}

?>

Page 37: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 37

PHP String(문자열)

¡ 문자열(String)이란?

Ÿ 문자열이란 문자들이 나열된 것을 말한다.

Ÿ 문자열은 하나의 문자 이상으로 이루어져 있다.

F 예) "Hello World!”

Ÿ 문자열은 따옴표( ” 또는 ’ )로 둘러 싸서 표현한다.

Ÿ 문자열 사용 예제

<?php�

$a�=�"Hello";�//큰�따옴표로�문자열�감싸기

$b�=�'�World!';�//작은�따옴표로�문자열�감싸기

echo�$a�.�$b;�//문자열�합치기

/**

�*�따옴표로�둘러싼�문자열�안에서�따옴표�사용

�*�큰�따옴표로�둘러쌓인�문자열�안에서�큰�따옴표를�사용하면�문자열을�닫는�것으로�간주함

�*�큰�따옴표를�큰�따옴표�안에�사용하려면�escape�문자인�\뒤에�"를�사용하면�됨

�*�반대의�작은�따옴표도�escape�문자�뒤에�'를�사용해야�포함시킬�수�있음

�*�단�큰�따옴표�안에서�작은�따옴표를�사용하거나�작은�따옴표�안에서�큰�따옴표를�사용할�수�있음�

�*/

$c�=�'<p>"큰�따옴표"를�포함합니다.</p>';

echo�$c;

$d�=�"<p>'작은�따옴표'를�포함합니다.</p>";

echo�$d;

$e�=�"<p>escape�문자�\\를�사용해서�\"\"�안에�\"큰�따옴표\"를�포함합니다.</p>";

echo�$e;

$f�=�'<p>escape�문자�\\를�사용해서�\'\'�안에�\'작은�따옴표\'를�포함합니다.</p>';

echo�$f;

/**

�*�"<p>$name님..."과�같이�하면�변수�이름이�'$name님'�이�되어�에러발생

�*�따라서�"$name�님"과�같이�변수�뒤에�공백을�두거나

�*�{$name}님과�같이�{�}로�변수를�둘러싸면�변수와�나머지�문자열과�분리되어�에러�방지

�*�문자열�안에서는�연산자도�사용가능하나�큰�따옴표에서만�사용가능하며

�*�작은�따옴표�안에서�변수를�사용하면�문자열이�그대로�출력됨.�

�*/

$name�=�"홍길동";

echo�"<p>$name님�문자열�안에�변수�넣기�입니다.</p>";�//에러

echo�"<p>$name�님�문자열�안에�변수�넣기�입니다.</p>";

Page 38: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 38

echo�"<p>{$name}님�문자열�안에�{�}�기호�넣어서�변수�넣기�입니다.</p>";

$g�=�5;

$e�=�2;

echo�"<p>큰�따옴표에서�문자열�안에�수식�넣기�$g-$e</p>";

//작은�따옴표�안에서는�변수를�사용할�수�없음.

echo�'<p>작은�따옴표에서�문자열�안에�수식�넣기�$g-$e</p>';�//변수명이�그대로�표시됨.

//아래와�같이�작은�따옴표를�사용할�때는�문자열�합치기로�수식을�표현할�수�있으나�()로�묶어야�에러가�

나지�않음.�

echo�'<p>작은�따옴표를�사용하고�문자열�합치기로�수식�넣기'�.�$g-$e�.�'</p>';

echo�'<p>작은�따옴표를�사용하고�문자열�합치기로�수식�넣기'�.�($g-$e)�.�'</p>';

//문자열을�사용하는�또다른�방법�heredoc(히어닥)

$hdoc��=�<<<EOT

<p>

Hello

World!

$name

</p>

EOT;

echo�$hdoc;

//문자열을�사용하는�또다른�방법�nowdoc(나우닥)

//변수명이�그대로�출력됨

$hdoc��=�<<<'EOT'

<p>

Hello

World!

$name

</p>

EOT;

echo�$hdoc;

?>

$str1 . $str2 . $str3 대 "{$str1}{$str2}{$str3}”

두 개가 넘는 변수들을(세 개 이상) 하나의 문자열로 합칠 때 PHP는 str1 . $str2 . $str3와 같은 방법보다

{$str1}{$str2}{$str3}” 와 같이 문자열을 합치는 것이 좀더 처리 속도 면에서 빠르다고 한다. 왜냐면 매 번 문

자열 합치기 연산자 .를 만날 때마다 다시 합치는 과정을 수행하기 때문이다.

Nowdoc

Nowdoc은 <<<뒤의 EOT를 작은 따옴표로 감싸서 <<<‘EOT’와 같이 표현하며 그 안의 변수각 파싱하지 않고

변수명 그대로 표현한다. PHP 버전 5.3.0부터 지원된다.

Page 39: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 39

Ÿ 문자열의 숫자 변환

JavaScript에서는 1 + "1”은 "11”와 같이 덧셈에 대해서 문자열 합치기로 적용하지

만 PHP는 숫자로 자동 변환하여 연산한다. 단 모든 문자열 안의 숫자가 자동변환

되는 것은 아니다. 아래 예제는 문자열 안의 숫자가 어떻게 숫자형으로 변환되는

지 보여주며 어떤 경우에 변환이 안되는지 문제를 해결하기 위해서는 어떻게 해야

하는지 보여준다.

<?php�

echo�1�+�"1";�//2

echo�2�*�"2";�//4

echo�1�+�"1.2";�//2.2

echo�1�+�"3.4%";�//에러

//A�non�well�formed�numeric�value�encountered...

//문자열�안에�숫자와�.�또는�e나�E가�아닌�문자열이�있으면�에러�

//에러�발행하지�않도록�하려면�문자열->숫자�변환�함수�사용

echo�1�+�floatval("3.4%");�//4.4

echo�1�+�intval("3.4%");�//4

echo�1�+�"3.e4";�//30001

?>

Page 40: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 40

¡ 문자열 관련 함수들

Ÿ strlen - 문자열 길이 카운트

<?php�

echo�strlen("Hello�World!")�."<br>";�//12

echo�strlen("안녕하세요")�."<br>";�//15

//한글과�같은�Multibyte�문자는�strlen으로�세면�정확하지�않다.�대신�mb_strlen()을�활용해야�한다.�

echo�mb_strlen("안녕하세요")�."<br>";�//5

?>

Ÿ str_word_count() - 단어수 세기

<?php�

echo�str_word_count("Hello�World!")�."<br>";�//2

echo�str_word_count("대한민국�서울특별시�종로구")�."<br>";�//0�한글�단어는�셀�수�없음.

?>

Ÿ strrev() - 문자들을 반대(역순)으로 표시

<?php�

echo�strrev("Hello�World!")�."<br>";�//!dlroW�olleH

echo�strrev("안녕하세요?")�."<br>";�//?��츄옕핅눕�,�정확히�표현되지�못함

?>

F http://kvz.io/blog/2012/10/09/reverse-a-multibyte-string-in-php/ 참조

Ÿ strpos() - 문자열의 위치 얻어내기

<?php�

//�strpos("대상�문장려”,�"찾을�문자열”)�

echo�strpos("Hello�World!",�"World")�.�"<br>";�

//�6,��World는�앞�첫번재�0부터�시작해서�0번째�자리에�있음.�

echo�strpos("Hello�World!",�"Hi")�.�"<br>";�//찾울�수�없어�출력�없음

echo�strpos("홍길동님�안녕하세요!",�"안녕")�.�"<br>";�//13,�찾지만�정확하지�않음.�

echo�mb_strpos("홍길동님�안녕하세요!",�"안녕")�.�"<br>";�//5�

//strpos를�활용하여�문자열�존재�여부�확인�

if(�!�strpos("Hello�World!",�"Hi")�)�{

�echo�"문자열�Hi를�찾을�수�없음";

}

?>

Page 41: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 41

Ÿ str_replace() - 문자열 바꾸기(치환)

<?php�

//str_replace("찾을�문자열",�"교체(치환)할�문자열",�"대상문자열")

echo�str_replace("World",�"PHP",�"Hello�World!")�.�"<br>";�//�Hello�PHP!

echo�str_replace("활용",�"개발",�"인터넷�활용�실습")�.�"<br>";�//�인터넷�개발�실습

?>

Ÿ substr() - 문자열의 일부분 추출하기(게시판 제목 등 추출 시 활용)

F string substr ( string $string , int $start [, int $length ] )

F substr("문자열”, 시작위치, 개수)

<?php�

$str�=�"abcdefghijklmnopqrstuvwxyz";

echo�substr($str,�0)�.�"<br>";�//abcdefghijklmnopqrstuvwxyz,�0번째부터�모든�문자열�추출

echo�substr($str,�10)�.�"<br>";�//klmnopqrstuvwxyz,�10번째부터�모든�문자�추출

echo�substr($str,�0,�5)�.�"<br>";�//abcde,�0번째부터�다섯�글자�추출

echo�substr($str,�8,�4)�.�"<br>";�//ijkl,�8번째부터�네�글자�추출

echo�substr($str,�-1)�.�"<br>";�//z,�뒤�첫�번재�문자부터�한�글자�추출

echo�substr($str,�-2)�.�"<br>";�//yz,�뒤�첫�번재�문자부터�두�글자�추출

echo�substr($str,�-3,�-1)�.�"<br>";�//xy,�뒤�세�번재�문자부터�뒤�두번째�문자�추출

$str_ko�=�"가나라라마바사아자차카타파하";

echo�substr($str_ko,�0,�1)�.�"<br>";�//�,�한글은�정확히�추출되지�않음.�

echo�mb_substr($str_ko,�0,�1)�.�"<br>";�//가,�mb_substr로�한글�추출�가능

?>

Ÿ trim(), ltrim(), rtrim() - 문자열 앞 뒤의 공백 제거

F trim(" 문자열 ”) → "문자열”, ltrim(" 문자열 ”) → "문자열 ” ,rtrim(" 문자열 ”) → " 문자열”

<?php�

$str�=�"�Hello�";

echo�"Hi"�.�trim($str)�.�"World!<br>";�//HiHelloWorld!

echo�"Hi"�.�ltrim($str)�.�"World!<br>";�//HiHello�World!

echo�"Hi"�.�rtrim($str)�.�"World!<br>";�//Hi�HelloWorld!

?>

Ÿ strtolower(), strtoupper() - 영문자 소문자, 대문자 일괄 변환

<?php�

$str�=�"Hello�World!";

echo�strtolower($str)�.�"<br>";�//hello�world!

echo�strtoupper($str)�.�"<br>";�//HELLO�WORLD!

?>

문자열 관련 레퍼런스 참조: http://php.net/manual/kr/ref.strings.php

Page 42: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 42

PHP Operators(연산자)

¡ 연산자(Operator)란?

Ÿ 연산자란 변수과 값들의 연산을 수행하기 위해 사용된다.

Ÿ 연산자는 하나 이상의 값을 받아 다른 값을 산출한다.

Ÿ 연산자의 종류

① 1항 연산자 : $n++, $n--, ! $a 와 같이 하나의 값에만 작용하는 연산자

② 2항 연산자 : $a = 1 과 같은 형식을 대부분의 연산자가 이에 해당

③ 3항 연산자 : $result = $total >= 100 ? true : false 형식

¡ 연산자 Types

Ÿ 산술(계산) 연산자 - Arithmetic Operators

Ÿ 증감 연산자 – Increment / Decrement Operators

Ÿ 비교 연산자 - Comparison Operators

Ÿ 대입 연산자 - Assignment Operators

Ÿ 문자열 연산자 – String Operators

Ÿ 논리(또는 관계) 연산자 - Logical (or Relational) Operators

Ÿ 조건 연산자 - Conditional Operators

Ÿ 배열 연산자 – Array Operators

¡ 산술(계산) 연산자

Page 43: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 43

예제 이름 결과

-$a 부정 $a의 반대.

$a + $b 덧셈 $a와 $b의 합.

$a - $b 뺄셈 $a와 $b의 차.

$a * $b 곱셈 $a와 $b의 곱.

$a / $b 나눗셈 $a와 $b의 몫.

$a % $b 나머지 $a를 $b로 나눈 나머지.

$a ** $b 나눗셈 $a의 $b제곱

출처 : http://php.net/manual/kr/language.operators.arithmetic.php

<?php�

$a�=�20;

$b�=�6;

echo�-$a�.�"<br>";�//-20

echo�$a�+�$b�.�"<br>";�//26

echo�$a�-�$b�.�"<br>";�//14

echo�$a�*�$b�.�"<br>";�//120

echo�$a�/�$b�.�"<br>";�//3.3333333333333

echo�$a�%�$b�.�"<br>";�//2

echo�2�**�2�.�"<br>";�//4

?>

¡ 증감 연산자

예제 이름 효과

++$a 사전 증가 Pre-increment $a를 1 증가하고, $a를 반환.

$a++ 사후 증가 Post-increment $a를 반환하고, $a를 1 증가.

--$a 사전 감소 Pre-decrement $a를 1 감소하고, $a를 반환.

$a-- 시후 감소 Post-decrement $a를 반환하고, $a를 1 감소.

출처: http://php.net/manual/kr/language.operators.increment.php

F 증감 연산자는 사전, 사후 관계가 존재한다. 위 표에서 보면 부호의 위치에 따라 증가/감소

하고 반환하는지, 반환하고 증가/감소하는지가 다르다.

Page 44: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 44

Ÿ 증감연산자 예제

<?php�

$a�=�1;

echo�$a++�.�"<br>";�//1,�사후�증가이므로�출력�후�1�증가

echo�$a�.�"<br>";�//2,�앞의�$a++에서�1증가되었으므로�2

$b=1;

echo�++$b�.�"<br>";�//2,�먼저�1�증가시키고�출력하므로�2

echo�$b�.�"<br>";�//앞에서�이미�1�증가되었으므로�2

$c�=�1;

echo�$c--�.�"<br>";�//1,�사후�감소이므로�1�출력�후�1�감소

echo�$c�.�"<br>";�//2,�앞의�$c--에서�1감소되었으므로�0

$d=1;

echo�--$d�.�"<br>";�//2,�먼저�1�감소시키고�출력하므로�0

echo�$d�.�"<br>";�//앞에서�이미�1�감소되었으므로�0

?>

¡ 비교 연산자

Ÿ 비교연산자는 두 값을 비교할 수 있는 연산자이다.

Ÿ 비교 연산자는 두 값의 비교 결과가 참이면 TRUE를 거짓이면 FALSE를 반환

Ÿ 비교 연산자는 대부분의 조건문, 반복문에서 사용된다.

Ÿ 비교연산자의 종류

예제 설명 결과

$a == $b 값이 같음 $a와 $b가 같으면 TRUE.

$a === $b 값과 형식이 같음$a와 $b가 같고, 같은 자료형이면 TRUE. (PHP 4에서 추가)

$a != $b 값이 같지 않음 $a가 $b와 같지 않으면 TRUE.

$a <>$b 값이 같지 않음 $a가 $b와 같지 않으면 TRUE.

$a !== $b 값과 형식이 같지 않음$a가 $b와 같지 않거나, 같은 자료형이 아니면 TRUE. (PHP 4에서 추가)

$a <$b 왼쪽이 오른쪽보다 작음 $a가 $b보다 작으면 TRUE.

$a >$b 왼쪽이 오른쪽보다 큼 $a가 $b보다 크면 TRUE.

$a <= $b 왼쪽이 오른쪽보다 작거나 같음 $a가 $b보다 작거나 같으면 TRUE.

$a >= $b 왼쪽이 오른쪽보다 크거나 같음 $a가 $b보다 크거나 같으면 TRUE.

Page 45: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 45

Ÿ 비교연산자 예제

<?php�

$a�=�1;

$b�=�"1";

echo�$a�==�$b�?�"TRUE<br>"�:�"FALSE<br>";�//TRUE

echo�$a�===�$b�?�"TRUE<br>"�:�"FALSE<br>";�//FALSE

echo�$a�>�$b�?�"TRUE<br>"�:�"FALSE<br>";�//FALSE

echo�$a�>=�$b�?�"TRUE<br>"�:�"FALSE<br>";�//TRUE

echo�$a�<�$b�?�"TRUE<br>"�:�"FALSE<br>";�//FALSE

echo�$a�<=�$b�?�"TRUE<br>"�:�"FALSE<br>";�//TRUE

echo�$a�!=�$b�?�"TRUE<br>"�:�"FALSE<br>";�//FALSE

echo�$a�!==�$b�?�"TRUE<br>"�:�"FALSE<br>";�//TRUE

echo�$a�<>�$b�?�"TRUE<br>"�:�"FALSE<br>";�//FALSE

?>

¡ 대입(할당) 연산자

Ÿ 대입 연산자는 = 를 사용해서 왼쪽에 오른쪽의 값을 대입(할당)하는 것으로 변

수 또는 상수 등의 데이터를 할당하는데 가장 일반적으로 사용되는 연산자이

다.

예제 동일식 설명

x = y x = y 왼쪽의 x에 오른쪽의 y 값을 할당한다

x += y x = x + y 왼쪽의 원래 있던 x 값에 y 값을 더하여 x에 할당한다

x -= y x = x - y 왼쪽의 원래 있던 x 값에 y 값을 빼서 x에 할당한다

x *= y x = x * y 왼쪽의 원래 있던 x 값에 y 값을 곱해서 x에 할당한다

x /= y x = x / y 왼쪽의 원래 있던 x 값에 y 값을 나누어서 x에 할당한다

x %= y x = x % y 왼쪽의 원래 있던 x 값에 y 값을 나눈 나머지를 x에 할당한다

Page 46: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 46

Ÿ 대입 연산자 예제

<?php�

$y�=�10;

$x�=�$y;�//�$x�=�10

$x�+=�$y;�//�$x�=�10�+�10�=�20

echo�$x�.�"<br>";

$x�-=�$y;�//�$x�=�20�-�10�=�10;

echo�$x�.�"<br>";�//10

$x�*=�$y;�//�$x�=�10�*�10�=�100

echo�$x�.�"<br>";�//100

$x�/=�$y;�//�$x�=�100�/�10�=�10

echo�$x�.�"<br>";�//10

$x�%=�$y;�//�$x�=�100�%�10�=�0

echo�$x�.�"<br>";�//0

?>

¡ 문자열 연산자

Ÿ PHP는 문자열을 합칠 때 . 부호를 사용한다.

Ÿ .= 부호를 사용하여 문자열을 계속 합쳐나갈 수 있다.

예제 설명 비고

$a . $b $a의 문자열과 $b의 문자열 합침

$a .= $b $a의 문자열에 $b의 문자열을 합쳐 $a에 다시할당

<?php�

$str1�=�"Hello";

$str2�=�"World!";

echo�$str1�.�"�"�.�$str2;�//Hello�World!

echo�"<br>";

$str1�.=�$str2;

echo�$str1;�//HelloWorld!

$name�=�"홍길동";

$str1�.=�$name;

echo�"<br>";

echo�$str1;�//HelloWorld!홍길동

?>

Page 47: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 47

예제 이름 결과

$a and $b And $a와 $b가 모두 TRUE이면 TRUE.

$a or $b Or $a나 $b가 TRUE이면 TRUE.

$a xor $b Xor $a와 $b중 하나만 TRUE일 때만 TRUE.

! $a Not $a가 TRUE가 아니면 TRUE.

$a && $b And $a와 $b가 모두 TRUE이면 TRUE.

$a || $b Or $a나 $b가 TRUE이면 TRUE.

출처: http://php.net/manual/kr/language.operators.logical.php

¡ 논리 연산자

Ÿ 논리 연산자는 조건구문을 결합하는데 사용한다.

Ÿ 예를 들어 조건 1과 조건 2를 모두 만족해야 하는지 하나만 만족하면 되는지

등을 가리는데 사용하는 것이 논리연산자이다.

<?php�

//두�조건을�모두�만족해야�참이되는�&&�또는�and

$user_name�=�"user";

$user_pw�=�"pwd123";

if(�$user_name�==�"user"�&&�$user_pw�==�"pwd123"�)�{

�echo�"로그인�성공";�//로그인�성공

}

if(�$user_name�==�"user"�and�$user_pw�==�"pwd123"�)�{

�echo�"<br>로그인�성공";�//로그인�성공

}

//두�조건�중�하나만�만족하면�참이되는�||�또는�or

$user_name�=�"user";

$user_pw�=�"000000";

if(�$user_name�!=�"user"�||�$user_pw�!=�"pwd123"�)�{

�echo�"<br>로그인�실패";�//로그인�실패

}

if(�$user_name�!=�"user"�or�$user_pw�!=�"pwd123"�)�{

�echo�"<br>로그인�실패";�//로그인�실패

}

//두�조건�중�하나만�TRUE일�때만�TRUE

$user�=�TRUE;

$memeber�=�FALSE;

if(�$user�xor�$memeber�)�{

Page 48: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 48

�echo�"<br>회원임";�//둘�중�하나만�참

}

$memeber�=�TRUE;

if(�$user�xor�$memeber�)�{

�echo�"<br>회원임";�//출력�안됨,�둘�다�TRUE이면�FALSE임

}

?>

¡ 조건 연산자 = 3항 연산자

Ÿ 조건 연산자는 3항 연산자라고도 하며 ? : 부호를 사용하여 조건에 따라 다른

값을 대입하는 연산자이다.

<?php�

$a�=�10;�

$b�=�5;

//$a가�$b보다�크면�$c=$a,

//$a가�$b보다�작거나�같으면�$c=$b;

$c�=�($a�>�$b�)�?�$a�:�$b;

echo�$c;�//10

echo�"<br>";

//$a가�$b보다�작으면�$c=$a,

//$a가�$b보다�크거나�같으면�$c=$b;

$d�=�($a�<�$b�)�?�$a�:�$b;

echo�$d;�//5

?>

Page 49: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 49

PHP 조건문

¡ 조건문이란?

Ÿ 조건문이란 어떤 조건에 부합하는지 아닌지에 따라 다른 명령을 수행하기 위

한 일종의 의사결정을 위한 코드구조이다.

Ÿ PHP에서 조건문은 if, if...else, if...elseif...else, switch 가 있다.

Ÿ 조건문은 조건 뒤에 중괄호{ }로 실행할 구문을 묶는다. 단, 조건 뒤에 나오는

구문이 한 줄이면 { }를 생략할 수 있다.

¡ if, if...else, if...elseif...else 예제

<?php�

date_default_timezone_set('Asia/Seoul');�//타임존을�서울시에�맞춤

$hour�=�date("G");�//0이�붙지�않는�24시간�단위�현재�시간

//조건�문�뒤에�하나의�문장만�나올�경우�{}�생략�가능

if(�$hour�>=�20�)�{

�echo�"야간입니다.";�//만일�시간이�20시�이상이면�"야간입니다."�출력

}

if(��$hour�>=�9�&&�$hour�<�18�)�{

�echo�"근무중입니다.";�//만일�시간이�9시�이후,�18시�전이면�"근무중입니다."�출력

}�else�{

�echo�"근무중이�아닙니다.";�//만일�시간이�9이전이거나�18시�이후이면�"근무중이�아닙니다."�출력

}

if(��$hour�<�6�)�{

�echo�"새벽입니다.";�//만일�시간이�6시�전이면�"새벽입니다."�출력

}�elseif($hour�>=6�&&�$hour�<�9)�{

�echo�"아침입니다.";�//만일�시간이�6시�이후이고,�9시�전이면�"아침입니다."�출력

}�elseif($hour�>=9�&&�$hour�<�12)�{

�echo�"오전입니다.";�//만일�시간이�6시�이후이고,�12시�전이면�"오전입니다."�출력

}�elseif($hour�>=12�&&�$hour�<�13)�{

�echo�"점심시간입니다.";�//만일�시간이�12시�이후이고,�13시�전이면�"점심시간입니다."�출력

}�elseif($hour�>=13�&&�$hour�<�18)�{

�echo�"오후입니다.";�//만일�시간이�13시�이후이고,�18시�전이면�"오후입니다."�출력

}�elseif($hour�>=�18�&&�$hour�<�20)�{

�echo�"퇴근하세요.";�//만일�시간이�18시�이후이고,�20시�전이면�"퇴근하세요."�출력

Page 50: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 50

}�else�{

�echo�"자유시간입니다.";�//만일�위�시간�조건에�없으면�"자유시간입니다."�출력

}

¡ switch 예제

$w=date("w");�//요일의�숫자�표현,�0(일요일)에서�6(토요일)

switch�($w)�{

�case�0:

��echo�"일요일";

��break;

�case�1:

��echo�"월요일";

��break;

�case�2:

��echo�"화요일";

��break;

�case�3:

��echo�"수요일";

��break;

�case�4:

��echo�"목요일";

��break;

�case�5:

��echo�"금요일";

��break;

�case�6:

��echo�"토요일";

��break;

�default:

��echo�"알�수�없는�요일";

}

?>

Page 51: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 51

PHP 반복문(Loop)

¡ 반복문이란?

Ÿ 반복문이란 특정 조건 아래서 지정된 횟수 또는 조건이 만족할 때까지 동일한

코드를 반복실행하도록 하는 구문이다.

Ÿ PHP에는 for, while, do...while, foreach 등의 반복문이 있다.

① for – 조건에 정해진 시작 숫자로부터 시작해서 특정 숫자까지 반복

② while – 먼저 조건을 검색해서 조건을 만족하는 동안 반복

③ do....while – 먼저 실행하고 나서 조건을 만족하는지 나중에 검사하며 반복

④ foreach - 배열을 배열의 수만큼 반복하면서 하나씩 추출하여 처리

¡ for

Ÿ 문법

for�(expr1;�expr2;�expr3)�{

����statement

}

for�(expr1;�expr2;�expr3):

����statement

endfor;

F expr1 – 첫 번째 표현식(예; $i=0, $i를 0부터 시작하여 반복을 시작한다)

F expr2 – 두 번째 표션식(예; $i<=100, $i가 100보다 작거나 같을 때까지, 즉 100까지 반복

한다)

F expr3 – 증감값을 표현(예; $i++, $i를 1씩 증가시킨다)

F statement – 실행할 코드. for() 안에서 실행할 구문이 한 줄이면 { } 생략 가능

Page 52: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 52

Ÿ 예제

<?php

$sum�=�0;

for(�$i=1;�$i<=100;�$i++�)�{

�$sum�+=�$i;

}

echo�$sum;�//�5050

echo�"<br>";

for(�$j=1;�$j<=10;�$j++�)�{

�if(�$j�%�2�==�0�)�continue;�//짝수�이면�건너뛰기

�echo�$j;

}

//13579

echo�"<br>";

for(�$k=1;�$k<=10;�$k++�)�{

�if(�$k�>�5�)�break;��//5보다�크면�중단하기

�echo�$k;

}

//12345

echo�"<br>";

$fruits�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

for(�$i�=�0;�$i�<�sizeof($fruits);�$i++�)�{

�echo�$fruits[$i]�.�"�";

}

//Apple�Banana�Melon�Grape�Cherry

echo�"<br>";

//{�}대신에�:...endfor를�사용해서�구문을�감살�수�있다.�

$numbers�=�array(10,22,5,23,33,1,82,54);

$max�=�0;

for(�$i�=�0;�$i�<�sizeof($numbers);�$i++�):

�if(�$numbers[$i]�>�$max�)�$max�=�$numbers[$i];

endfor;

echo�"가장�큰�수는�"�.�$max;�//가장�큰�수는�82

?>

Page 53: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 53

¡ while

Ÿ 문법

while�(expr)

����statement

}

while�(expr):

����statement

����...

endwhile;

F expr – while문은 먼저 조건을 검색하고 조건이 만족할 때까지 반복함

Ÿ 예제

<?php

$sum�=�0;

$i�=�1;

while(�$i�<=�100�)�{

�$sum�+=�$i;

�$i++;

}

echo�$sum;�//�5050

echo�"<br>";

$fruits�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

//배열을�하나씩�반복�

while�(�list�($key,�$val)�=�each�($fruits)�)�{

�echo�$val�.�"�";�

}

//Apple�Banana�Melon�Grape�Cherry

echo�"<br>";

$sum1�=�0;

$sum2�=�0;

$i�=�1;

while(�$i�<=�100�):

�if(�$i�%�2�==�1�)�{

��$sum1�+=�$i;�//홀수만�더함

�}�else�{

��$sum2�+=�$i;�//짝수만�더함

Page 54: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 54

�}

�$i++;

endwhile;

echo�$sum1;�//�2500

echo�"<br>";

echo�$sum2;�//�2550

?>

¡ do...while

Ÿ 문법

do�{

����statement

}�while�(expr);

F expr – do...while문은 while문과 거의 유사하지만 먼저 실행하고 나중에 조건을 확인하는

순서상의 구조가 다름

Ÿ 예제

<?php

$sum�=�0;

$i�=�1;

do�{

�$sum�+=�$i;

�$i++;

}while(�$i�<=�100�);

echo�$sum;�//�5050

?>

¡ foreach

Ÿ foreach는 배열의 각 요소들에 반복의 구조로 접근하는 것이다

foreach�(array_expression�as�$value)�{

����statement

}

foreach�(array_expression�as�$key�=>�$value)�{

����statement

}

Page 55: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 55

F array_expression as $value : 배열의 각 요소들에 저장된 값을 $value로 반복적으로 추출

F array_expression as $key => $value : 배열의 각 요소들에 저장된 값을 $key와 $value 변

수로 반복적으로 추출해 냄. $key가 없는 경우에는 배열 번호가 $key가 된다.

Ÿ 예제

<?php

$fruits�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

foreach�($fruits�as�$value)�{

�echo�"{$value}�";

}

//Apple�Banana�Melon�Grape�Cherry

echo�"<br>";

foreach�($fruits�as�$key�=>�$value)�{

�echo�"{$key}�=>�{$value}�";

}

//0�=>�Apple�1�=>�Banana�2�=>�Melon�3�=>�Grape�4�=>�Cherry

$friends�=�array();

$friends['name']�=�"홍길동";

$friends['age']�=�21;

$friends['phone']�=�"010-1111-1111";

echo�"<br>";

foreach�($friends�as�$key�=>�$value)�{

�echo�"{$key}�=>�{$value}�";

}

//name�=>�홍길동�age�=>�21�phone�=>�010-1111-1111

echo�"<br>";

foreach�($fruits�as�$value):

�echo�"{$value}�";

endforeach;

//Apple�Banana�Melon�Grape�Cherry

?>

Page 56: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 56

PHP 배열(Arrays)

¡ 배열이란?

Ÿ 배열이란 쉽게 말해서 하나의 변수에 여러 개의 값을 가지는 것을 가리킨다.

Ÿ 일반 변수는 $a = 1과 같이 하나의 값을 가지지만 배열은 $a[0]=1, $a[1]=2...또

는 $a[‘mime’]="image/jpeg”, $a[‘width’]=60, $a[‘height’]=240 과 같이 변수의

이름은 하나이지만 여러 값을 가진다.

Ÿ 배열의 종류

① 숫자 정렬 배열(indexed array 또는 numeric array)

② 결합 정렬 배열(associative array)

③ 다차원 배열

¡ indexed array

숫자로 배열을 정렬하는 방식이다. 값들은 연속된 번호로 저장되고 그 번호로 값

에 접근할 수 있다. 숫자로 정렬한다고 해서 값으로 숫자만 가진다는 것은 아니다.

여기서 말하는 숫자란 값을 저장하고 있는 배열의 주소를 말한다.

Ÿ 예제

<?php

$a�=�array(1,�2,�3);

$b[0]=1;

$b[1]=2;

$b[2]=3;

$c�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

//print_r()은�배열을�사람이�읽기�쉬운�방식으로�출력해주는�함수이다.�

print_r($a);�//Array�(�[0]�=>�1�[1]�=>�2�[2]�=>�3�)

print_r($b);�//Array�(�[0]�=>�1�[1]�=>�2�[2]�=>�3�)

print_r($c);�//Array�(�[0]�=>�Apple�[1]�=>�Banana�[2]�=>�Melon�[3]�=>�Grape�[4]�=>�Cherry�)

?>

Page 57: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 57

¡ associative array

이 정렬은 배열의 값을 저장할 때 번호 대신 key 이름을 사용한다. 예를 들어 다음

과 같은 방법이 그것이다.

$a[‘mime’]="image/jpeg”, $a[‘width’]=60, $a[‘height’]=240

key 이름을 사용한 배열은 $a[0]과 같이 접근할 수 없다.

Ÿ 예제

<?php

$a['mime']='image/jpeg';

$a['width']=360;

$a['height']=240;

echo�"width�=�{$a['width']},�height�=�{$a['height']}";�

//width�=�360,�height�=�240

echo�"<br>";

print_r($a);�

//Array�(�[0]�=>�1�[1]�=>�2�[2]�=>�3�)

echo�"<br>";

$b�=�array("name"=>"홍길동",�"age"=>30,�"phone"=>"123-456-7890");

echo�"name�=�{$b['name']},�age�=�{$b['age']},�phone={$b['phone']}";�

//name�=�홍길동,�age�=�30,�phone=123-456-7890

echo�"<br>";

print_r($b);�

//Array�(�[name]�=>�홍길동�[age]�=>�30�[phone]�=>�123-456-7890�)

?>

¡ 다차원 배열

다차원 배열이란 배열 안에 또 배열이 포함되어 있는 것이라 할 수 있다. 배열의

각 항목은 하나의 값을 가질 수도 있고 또 하나의 배열이 될 수도 있다.

간단한 예로 친구 목록을 배열로 만들어보자. 위에서 이름과 나이와 전화번호를

배열로 처리해봤는데 한 명의 친구가 아니라 여러 명의 친구를 배열로 저장하려면

어떻게 해야 할까? 다음 예제를 보자. 이런 경우는 주로 데이터베이스에서 추출한

자료를 배열로 변환하여 처리하는데 사용되는 방법과 같다.

Page 58: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 58

Ÿ 예제

<?php

$friends�=�array(

��array("name"=>"KIM",�"age"=>30,�"phone"=>"010-1111-1111"),

��array("name"=>"LEE",�"age"=>27,�"phone"=>"010-2222-2222"),

��array("name"=>"PARK",�"age"=>19,�"phone"=>"010-3333-3333")

�);

print_r($friends[0]);�//Array�(�[name]�=>�KIM�[age]�=>�30�[phone]�=>�010-1111-1111�)�

echo�"<br>";

print_r($friends[1]);�//Array�(�[name]�=>�LEE�[age]�=>�27�[phone]�=>�010-2222-2222�)�

echo�"<br>";

print_r($friends[2]);�//Array�(�[name]�=>�PARK�[age]�=>�19�[phone]�=>�010-3333-3333�)

echo�"<br>";

for(�$i=0;�$i<sizeof($friends);�$i++�)�{

�foreach�($friends[$i]�as�$key�=>�$value)�{

��echo�"{$key}={$value}�";

�}

�echo�"<br>";

}

//name=KIM�age=30�phone=010-1111-1111�

//name=LEE�age=27�phone=010-2222-2222�

//name=PARK�age=19�phone=010-3333-3333

?>

¡ 배열 크기 구하기

Ÿ sizeof()

<?php

$a�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

$b�=�array(4,1,2,8,7,3,6,5);

$friends�=�array(

��array("name"=>"KIM",�"age"=>30,�"phone"=>"010-1111-1111"),

��array("name"=>"LEE",�"age"=>27,�"phone"=>"010-2222-2222"),

��array("name"=>"PARK",�"age"=>19,�"phone"=>"010-3333-3333")

�);

echo�sizeof($a)�.�"�"�.�sizeof($b)�.�"�"�.�sizeof($friends);�//5�8�3

?>

Page 59: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 59

¡ 배열인지 확인하기Ÿ is_array()

<?php

$a�=�array(1,2,3);

$b�=�4;

if(�is_array($a)�)�print_r($a);�//Array�(�[0]�=>�1�[1]�=>�2�[2]�=>�3�)�

echo�"<br>";

if(�!�is_array($b)�)�echo�$b;�//4

echo�"<br>";

echo�is_array($a)�?�'$a=배열'�:�'$a=배열아님';�//$a=배열

echo�"<br>";

echo�is_array($b)�?�'$b=배열'�:�'$b=배열아님';�//$b=배열아님

?>

¡ 배열 정렬하기

PHP는 배열 값 또는 키 이름에 따라 정렬하는 함수들을 제공하는데 다음과 같다.

Ÿ sort() - indexed array를 값의 오름차순으로 정렬한다.

Ÿ rsort() - indexed array를 값의 내림차순으로 정렬한다.

Ÿ asort() - associative array를 값의 오름차순으로 정렬한다.

Ÿ ksort() - associative array를 키 이름의 오름차순으로 정렬한다.

Ÿ arsort() - associative array를 값의 내림차순으로 정렬한다.

Ÿ krsort() - associative array를 키 이름의 내림차순으로 정렬한다.

Ÿ 예제

<?php

$a�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

$b�=�array(4,1,2,8,7,3,6,5);

sort($a);

print_r($a);�

//Array�(�[0]�=>�Apple�[1]�=>�Banana�[2]�=>�Cherry�[3]�=>�Grape�[4]�=>�Melon�)

echo�"<br>";

sort($b);

print_r($b);�

Page 60: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 60

//Array�(�[0]�=>�1�[1]�=>�2�[2]�=>�3�[3]�=>�4�[4]�=>�5�[5]�=>�6�[6]�=>�7�[7]�=>�8�)

echo�"<br>";

rsort($a);

print_r($a);�

//Array�(�[0]�=>�Melon�[1]�=>�Grape�[2]�=>�Cherry�[3]�=>�Banana�[4]�=>�Apple�)�

echo�"<br>";

rsort($b);

print_r($b);�

//Array�(�[0]�=>�8�[1]�=>�7�[2]�=>�6�[3]�=>�5�[4]�=>�4�[5]�=>�3�[6]�=>�2�[7]�=>�1�)�

echo�"<br>";

$c�=�array("jan"=>10,�"feb"=>30,�"apr"=>5,�"may"=>9,�"jun"=>21);

asort($c);

print_r($c);�

//Array�(�[apr]�=>�5�[may]�=>�9�[jan]�=>�10�[jun]�=>�21�[feb]�=>�30�)�

echo�"<br>";

ksort($c);

print_r($c);�

//Array�(�[apr]�=>�5�[feb]�=>�30�[jan]�=>�10�[jun]�=>�21�[may]�=>�9�)�

echo�"<br>";

arsort($c);

print_r($c);�

//Array�(�[feb]�=>�30�[jun]�=>�21�[jan]�=>�10�[may]�=>�9�[apr]�=>�5�)

echo�"<br>";

krsort($c);

print_r($c);�

//Array�(�[may]�=>�9�[jun]�=>�21�[jan]�=>�10�[feb]�=>�30�[apr]�=>�5�)

?>

¡ 배열에 값이 있는지 확인하기

Ÿ in_array()

Ÿ bool in_array ( mixed $needle , array $haystack [, bool $strict ] )

F mixed $needle : 찾을 값(문자열, 숫자 또는 배열일 수 있음)

F array $haystack : 배열

F bool $strict : 선택적, TRUE이면 자료형까지 일치하는 값을 찾는다

F 이 함수를 실행했을 때 반환되는 값은 TRUE(값이 존재) 또는 FALSE(값이 없음)

Page 61: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 61

Ÿ 예제

<?php

$a�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

if(�in_array("Banana",�$a)�)�{

�echo�"Banana는�배열에�존재합니다.<br>";

}�else�{

�echo�"Banana는�배열에�없습니다.<br>";

}

//Banana는�배열에�존재합니다.

if(�in_array("Mango",�$a)�)�{

�echo�"Mango는�배열에�존재합니다.<br>";

}�else�{

�echo�"Mango는�배열에�없습니다.<br>";

}

//Mango는�배열에�없습니다.

?>

¡ 배열에 값을 추가하기

Ÿ array_push()

Ÿ int array_push ( array &$array , mixed $var [, mixed $... ] )

F array &$array : 배열

F mixed $var : 추가할 값. 쉼표(,)로 구분하여 여러 개의 값을 추가할 수 있다.

F 이 함수 대신에 $a[] = "새로운값” 과 같은 방법으로도 값을 추가할 수 있다.

Ÿ 예제

<?php

$a�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

array_push($a,�"Mango",�"Coconut");

$a[]�=�"Walnet";

print_r($a);

//Array�(�[0]�=>�Apple�[1]�=>�Banana�[2]�=>�Melon�[3]�=>�Grape�[4]�=>�Cherry�[5]�=>�Mango�[6]�=>�Coconut�[7]�=>�Walnet�)�

echo�"<br>";

$b�=�array("name"=>"KIM",�"age"=>30,�"phone"=>"010-1111-1111");

$b['addr']�=�"서울특별시�종로구";

array_push($b,�"[email protected]");�//key가�없으므로�0번�index에�저장된다.�

print_r($b);

//Array�(�[name]�=>�KIM�[age]�=>�30�[phone]�=>�010-1111-1111�[addr]�=>�서울특별시�종로구�[0]�=>�[email protected]�)�

?>

Page 62: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 62

¡ 배열에서 마지막 값을 추출하기

Ÿ array_pop()

Ÿ mixed array_pop ( array &$array )

F array &$array : 배열

F 마지막 값을 추출한다. 추출한 값은 다른 변수에 저장할 수 있으며, 배열에서는 추출한 값

이 제거된다. 만일 배열이 아니거나 마지막 값이 없으면 에러가 발생한다.

Ÿ 예제

<?php

$a�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

$b�=�array_pop($a);�//배열�$a에서�마지막�값을�추출해서�변수�$b에�대입

print_r($a);

//Array�(�[0]�=>�Apple�[1]�=>�Banana�[2]�=>�Melon�[3]�=>�Grape�)�

echo�"<br>"�.�$b;�//Cherry

?>

¡ 배열에서 임의의 값을 가져오기

Ÿ array_rand()

Ÿ mixed array_rand ( array $input [, int $num_req ] )

F array $input : 배열

F int $num_req : 가져올 원소의 수(지정하지 않으면 기본 값은 1이 됨)

F 0부터 배열의 마지막 index 번호 사이의 임의의 번호를 반환한다.

Ÿ 예제

<?php

$a�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

$b�=�array_rand($a);�//배열�$a에서�마지막�값을�추출해서�변수�$b에�대입

echo�$b;�//$b는�0~4�사이의�임의의�숫자.�

echo�$a[$b];�//$a[0]...$a[4]까지의�임의의�index에�있는�배열�값을�출력

?>

Page 63: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 63

¡ 배열을 랜덤하게 섞는다

Ÿ array_shuffle()

Ÿ bool shuffle ( array &$array )

F array $input : 배열

F 배열에 요소들의 순서를 임의로 뒤섞어 재배열한다.

Ÿ 예제

<?php

$a�=�array("Apple",�"Banana",�"Melon",�"Grape",�"Cherry");

print_r($a);�//섞기�전의�배열�출력

//Array�(�[0]�=>�Apple�[1]�=>�Banana�[2]�=>�Melon�[3]�=>�Grape�[4]�=>�Cherry�)

shuffle($a);

echo�"<br>";

print_r($a);

//예,�Array�(�[0]�=>�Banana�[1]�=>�Cherry�[2]�=>�Apple�[3]�=>�Grape�[4]�=>�Melon�)

//$a는�shuffle()에�의해�랜던하게�섞이므로�실행할�때마다�다른�배열을�가지게�됨.

?>

¡ 배열의 값을 합산Ÿ array_sum()

Ÿ number array_sum ( array $array )

F array $input : 배열

F 배열에 포함된 숫자들의 합을 구해 숫자로 반환한다.

Ÿ 예제

<?php

$a�=�array(1,2,3,4,5,6,7,8,9);

$sum�=�array_sum($a);�

echo�$sum;�//45

?>

배열 함수 목록:

http://php.net/manual/kr/book.array.php

https://www.w3schools.com/php/php_arrays.asp

Page 64: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 64

PHP 함수(Functions)

¡ 함수란?

Ÿ 함수란 재사용 가능한 구문들의 블록(block)이다.

Ÿ 함수는 페이지가 실행될 때 자동으로 실행되지는 않고 그 함수를 호출할 때만

실행된다.

Ÿ 함수는 호출되었을 때 블록 안의 구문들을 직접 실행하기도 하고 return 명령

을 통해서 결과를 반환할 수도 있다.

Ÿ 함수 기본 문법

function�functionName([argument1],�[argument2],[....])�{

//실행�코드;

}

F 함수 이름은 _ 또는 하나의 알파벳 문자로 시작할 수 있다. 함수 이름에는 _나 알파벳 그리

고 숫자를 사용할 수 있으나 숫자로 시작할 수는 없다.

F argument는 인수라고 부르며 함수가 전달 받는 값을 받는 변수이다. 인수는 선택적이며 코

드 구성에 따라 받을 수도 받지 않을 수도 있다.

F 인수는 예를 들어 function functionName( $val1, $val2 ) { ... } 와 같이 구성된 함수를 호

출하려면 반드기 functionName("홍길동”, 100); 와 같이 호출해야 한다.

F 만일, 인수에 function functionName( $val1="”, $val2=50 ) { ... } 와 같이 기본값을 주었다

면 함수를 호출할 때 functionName(); 와 같이 반드시 값을 전달하지 않아도 된다.

Ÿ PHP에서 사용 가능한 함수의 종류는 다음과 같다.

① PHP 내장함수 – PHP가 제공하는 함수로 1,000개 이상의 유용한 기능이 있다.

② 사용자 정의 함수 – 개발자가 작성하는 함수이다. 내장함수 또는 PHP 명령어 등과

이름이 겹치지만 않으면 얼마든지 함수를 만들어 사용할 수 있다.

③ Method – 메서드는 Class 안에 포함된 함수를 말한다.

Page 65: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 65

¡ PHP 내장함수

Ÿ PHP에 관해서 배우는 것들의 대부분이 함수에 관한 것이다. 내장함수 전체 레

퍼런스(reference)는 다음의 목록에서 확인할 수 있다.

F http://php.net/manual/kr/funcref.php

¡ PHP 사용자 정의 함수

Ÿ 예제 1 – phpfunction1.php 기본함수

<?php�

function�greetings()�{

�echo�"Hello�PHP!";

}

greetings();

?>

Ÿ 예제 2 – phpfunction2.php 인수로 값을 전달 받기

<?php�

function�greetings($msg)�{

�echo�$msg;

}

greetings("안녕하세요!");

?>

Page 66: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 66

Ÿ 예제 3 – phpfunction3.php 인수에 값을 전달하지 않았을 때

<?php�

function�greetings($msg)�{

�echo�$msg;

}

greetings();�//함수�greetings는�$msg라는�인수를�받아야�하는데�이를�전달하지�않으면�에러�발생

?>

Ÿ 예제 4 – phpfunction4.php 기본값이 있는 인수 사용

<?php�

function�greetings($msg="Hello")�{

�echo�$msg;

}

greetings();�//함수�greetings의�$msg는�"Hello”를�기본�인수로�가지므로�호출�시�생략�가능

?>

Page 67: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 67

Ÿ 예제 5 – phpfunction5.php 값의 반환 및 활용

<?php�

function�getSum($x=0,�$y=0)�{

�return�$x�+�$y;

}

$sum�=�getSum(100,34);

echo�$sum;�//134

?>

Page 68: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 68

PHP Class

¡ class란?

Ÿ 클래스는 객체지향형 프로그래밍을 위한 기본적인 데이터 형으로 변수, 상수,

함수(클래스 안에서 함수는 메서드-method라 함)를 포함하는 하나의 프로그램

객체를 말한다.

Ÿ 예를 들어 자동차는 엔진, 브레이크, 에어컨 등등의 다양한 기능들과 색, 크기

등등의 속성들의 집합이라고 할 때 자동차를 객체로 기능들을 메서드라 하고

색, 크기 등을 속성(properties)이라고 한다.

¡ 예제로 보는 class

Ÿ 다음의 간단한 예제로 class를 이해하고 자세한 내용은 객체지향 프로그래밍

(OOP; Object Oriented Programming)을 설명할 기회가 있을 때 살펴기로 하

자.

<?php�

class�MyClass�{

�public�$name,�$msg;�//클래스�내부의�속성(properties)

�//클래스�생성자(클래스에�접근할�때�실행되는�메서드)

�function�__construct($name,�$msg)�{

��$this->name�=�$name;

��$this->msg�=�$msg;

�}

�public�function�greetings()�{

��echo�"{$this->name}님�{$this->msg}";

�}

}

$say�=�new�MyClass("홍길동",�"안녕하세요!");�//MyClass로부터�새로은�인스턴스�$say�객체�생성

$say->greetings();�//$say�객체의�greetings�메서드�실행

?>

Page 69: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 69

Page 70: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 70

PHP Superglobal 변수들

¡ Superglobal 변수란?

Ÿ Superglobal 변수란 어디에서나(함수 내에서나 밖에서나 또는 어떤 위치에서

도) 접근 가능한 변수를 말한다.

Ÿ PHP Superglobal들

① $GLOBALS

② $_SERVER

③ $_GET

④ $_POST

⑤ $_FILES

⑥ $_COOKIE

⑦ $_SESSION

⑧ $_REQUEST

⑨ $_ENV

¡ $GLOBALS 변수

Ÿ 함수 내부 등에서 전역(Global) 변수에 접속할 때 사용

Ÿ 사용법 - $GLOBALS[‘변수명’]

Ÿ 함수 내에서 전역변수에 접근하기 위해 global $var 와 같이 global 키워드를

사용하는 대신 사용할 수 있음

<?php�

�$x�=�2;�//전역변수

�function�mytest(){

��echo�"x="�.�$GLOBALS['x'];

�}

�mytest();�//x=2

?>

Page 71: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 71

F 변수 설명의 전역변수 부분과 같은 예제임

¡ $_SERVER 변수

Ÿ $_SERVER 변수는 PHP의 Global 변수(Superglobal로도 불림)의 하나로 서버 및

실행환경에 관련된 정보를 얻을 수 있는 변수이다.

Ÿ $_SERVER 변수는 $_SERVER[‘속성이름’] 형식으로 접근가능하다.

Ÿ 예제를 통해서 주요 $_SERVER 변수의 사용법을 알아보자.

<?php

//현재�실행되고�있는�PHP�파일의�이름을�추출

//웹서버의�Document�Root로부터�상대적�주소에�파일명�반환

//예)�http://mywebtest.com/test/test.php�=>�/test/test.php�반환

echo�$_SERVER['PHP_SELF']�.�"<br>";�//출력:�/php/server.php

//서버의�IP�주소�반환

//http://localhost라면�::1�반환

//http://127.0.0.1라면�127.0.0.1

//기타�다른�써버는�서버의�실제�IP�주소�반환�

echo�$_SERVER['SERVER_ADDR']�.�"<br>";�

//서버이름(Apache�등의�설정�필요),�설정이�없으면�서버�주소�반환�

echo�$_SERVER['SERVER_NAME']�.�"<br>";�

//출력:�127.0.0.1�또는�localhost

//서버�소프트웨어�정보,�웹서버�정보,�PHP�버전�등을�반환

echo�$_SERVER['SERVER_SOFTWARE']�.�"<br>";�

//출력:�Apache/2.4.29�(Win32)�OpenSSL/1.1.0g�PHP/7.2.0

//해당�페이지(파일)에�접근한�Mothod를�반환

//http://localhost�또는�http://127.0.0.1�를�브라우저에�열면

//GET�Method가�반환된다

echo�$_SERVER['REQUEST_METHOD']�.�"<br>";�//GET

//서버의�Document�Root(웹문서가�저장되는�최상위�경로)�정보를�얻어옴

//이�경로는�웹�주소의�경로가�아니라�로컬경로이다.

//Windows에서는�C:/xampp/htdocs와�같으며,

//Linux에서는�/home/myweb/public_html�등과�같이�표시된다.�

echo�$_SERVER['DOCUMENT_ROOT']�.�"<br>";�//C:/xampp/htdocs

//페이지에�접속한�클라이언트의�OS�및�브라우저의�정보를�반환

echo�$_SERVER['HTTP_USER_AGENT']�.�"<br>";

//출력�예

//Mozilla/5.0� (Windows� NT� 10.0;� Win64;� x64)� AppleWebKit/537.36� (KHTML,� like� Gecko)�

Chrome/63.0.3239.84�Safari/537.36

Page 72: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 72

//페이지에�접속한�클라이언트의�IP�주소를�반환

echo�$_SERVER['REMOTE_ADDR']�.�"<br>";

//출력�예,�127.0.0.1

//현재�실행되고�있는�PHP�파일의�이름을�추출($_SERVER['PHP_SELF']와�유사)

echo�$_SERVER['SCRIPT_NAME']�.�"<br>";

//출력�예,�/php/server.php

//현재�실행되고�있는�페이지에�대한�접근�주소

//$_SERVER['PHP_SELF'],�$_SERVER['SCRIPT_NAME']과�다른�점은�

//Parameter�정보를�포함하여�전체�주소를�반환한다는�것

//예를�들어�http://127.0.0.1/php/server.php?page=1와�같이�접근했다면�

//반환되는�값은�/php/server.php?page=1�이�됨

echo�$_SERVER['REQUEST_URI']�.�"<br>";

//출력�예,�/php/server.php?page=1

?>

¡ $_GET 변수

Ÿ $_GET 변수는 URL Parameter를 통해서 전달된 변수를 저장하는 변수이다.

F 예) http://localhost/index.php?page=1&search=web

Ÿ 위 예와 같이 URL의 끝에 ?를 붙이고 name=value 형식으로 전달하며 하나의

값이 아닌 두 개 이상의 name=value가 전달되게 하려면 & 기호로 구분하여

계속 추가할 수 있다.

Ÿ 위의 경우 $_GET 변수에는 page와 search를 key로 하는 두 개의 값이 저장되

며 PHP에서 접근하려면 $_GET[‘page’], $_GET[‘search’]와 같이 한다.

Ÿ $_GET 변수는 URL 뒤에 붙어서 전달되는 값들이므로 보안이 필요한 경우 즉,

아이디와 패스워드 또는 개인정보 등의 정보를 전달할 때는 GET Method를 사

용하지 않는 것이 좋다. 다음은 예제이다.

<?php�

if(�isset($_GET['page'])�)�{

�echo�"page�=�"�.�$_GET['page']�.�"<br>";�//page�=�1

}

if(�isset($_GET['search'])�)�{

�echo�"search�=�"�.�$_GET['search']�.�"<br>";�//search�=�web

}

print_r($_GET);�//Array�(�[page]�=>�1�[search]�=>�web�)

?>

Page 73: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 73

F isset() 함수는 변수가 정의되어 있는지를 검사한다. 만일 정의되지 않은 변수에 접근하면 에

러가 발생하기 때문에 항상 검사하는 것이 좋다.

¡ $_POST 변수

Ÿ $_POST 변수는 URL Parameter가 아닌 내부 전송 방식을 통해서 전달된 변수

를 저장하는 변수이다.

Ÿ $_POST는 주소 끝에 값을 붙이지 않기 때문에 GET 보다는 상대적으로 안전하

지만 그 자체로 보안이 해결되는 것은 아니다.

F 보안을 위해서는 SSL, token, injection 방어 등 다양한 조치를 해야 한다.

Ÿ $_POST 값을 보내려면 HTML form에서 POST method를 사용해야 한다.

Ÿ 전송된 값은 $_POST[‘userid’], $_POST[‘userpw’]와 같이 접근한다.

Ÿ 예제 – form.html

<!DOCTYPE�html>

<html�lang="en">

<head>

<meta�charset="UTF-8">

<title>$_POST</title>

�<link�rel="stylesheet"�

href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

</head>

<body>

<div�class="container">

��<form�action="login.php"�method="POST">

���<div�class="form-group">

����<label�for="userid">아이디</label>

����<input�type="text"�name="userid"�id="userid"�class="form-control">

���</div>

���<div�class="form-group">

����<label�for="userpw">패스워드</label>

����<input�type="password"�name="userpw"�id="userpw"�class="form-control">

���</div>

���<button�type="submit"�class="btn�btn-primary">로그인</button>

��</form>

�</div>

</body>

</html>

Page 74: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 74

Ÿ 예제 – login.php

<?php�

if(�isset($_POST['userid'])�)�{

�echo�"userid�=�"�.�$_POST['userid']�.�"<br>";�//userid�=�myweb

}

if(�isset($_POST['userpw'])�)�{

�echo�"userpw�=�"�.�$_POST['userpw']�.�"<br>";�//userpw�=�123456

}

print_r($_POST);�//Array�(�[userid]�=>�myweb�[userpw]�=>�123456�

?>

¡ $_FILES 변수

Ÿ $_FILES 변수는 POST Method 폼에서 서버로 업로드된 파일을 서버에서 접근

하기 위한 변수이다.

Ÿ PHP는 폼을 통해서 서버에 파일을 전송하면 PHP Upload Temporary

Directory(임시 폴더)에 파일을 Temporary Name으로 저장하고 PHP에서 이 파

일을 다시 지정된 경로로 이동시켜 주는 방식으로 업로드를 처리한다. PHP

Temporary Directory에 저장된 임시 파일은 일정 시간이 지나면 자동으로 삭

제되므로 업로드 즉시 원하는 곳으로 이동해야 한다.

F PHP Upload Temporary Directory는 php.ini에 upload_tmp_dir 항목으로 설정되어 있다.

F XAMPP에서는 XAMPP가 저장된 폴더 바로 아래에 tmp 폴더에 저장된다.

F 임시로 저장된 파일은 xxxxx.tmp와 같이 확장자가 tmp인 파일 랜던 이름의 파일로 저장된

다.

Ÿ PHP에서 파일을 업로드 할 경로(디렉토리 또는 폴더)는 nobody(웹으로 접근한

사용자)에게 쓰기 권한을 부여해야 한다. Windows Desktop용 O/S의 경우에는

이러한 설정을 하지 않아도 되지만 Windows Server 제품군이나 Linux, Unix 등

Page 75: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 75

의 O/S에서는 반드시 nobody에 대한 읽기 쓰기 권한을 부여해주어야 한다.

F Windows Server에서는 폴더에서 마우스 오른쪽 버튼을 눌러 속성→보안탭에서 사용자를

추가하고 권한을 설정할 수 있으며 Linux나 Unix 계열의 컴퓨터는 쉘에서 chmod 777

webdir 과 같은 방식으로 쓰기 권한을 줄 수 있다.

Ÿ $_FILES는 업로드된 파일에 접근하기 위해 다음과 같은 속성을 가진다.

① $_FILES['userfile']['name'] - 업로드된 파일의 오리지널 이름

② $_FILES['userfile']['type'] - 업로드된 파일의 mime 형식(예,image/gif)

③ $_FILES['userfile']['size'] - 업로드된 파일의 byte 단위 사이트

④ $_FILES['userfile']['tmp_name'] - 업로드된 파일이 임시로 저장된 이름

⑤ $_FILES['userfile']['error'] - 업로드 시 발생된 에러 코드

Ÿ 파일을 업로드 하려면 HTML에서 type이 file인 input을 사용해야 한다.

Ÿ 또한 업로드를 위한 form은 반드시 enctype="multipart/form-data" 속성을 가

져야 한다. 이 속성이 빠져 있으면 업로드는 작동하지 않는다.

F <form action="upload.php" method="POST" enctype="multipart/form-data">

Ÿ 예제 – upform.html

<!DOCTYPE�html>

<html�lang="en">

<head>

<meta�charset="UTF-8">

<title>$_FILES</title>

�<link�rel="stylesheet"�

href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

</head>

<body>

�<div�class="container"�style="margin-top:�20px;">

��<form�action="upload.php"�method="POST"�enctype="multipart/form-data"�

class="form-inline">

���<div�class="form-group">

����<label�for="upfile">패스워드</label>

����<input�type="file"�name="upfile"�id="upfile"�class="form-control">

���</div>

���<button�type="submit"�class="btn�btn-primary">파일전송</button>

��</form>

�</div></body>

</html>

Page 76: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 76

F upform.html에서 파일을 선택하고 전송하면 다음의 upload.php에 파일을 POST 방식으로

전송한다.

F upload가 성공하려면 반드시 업로드 경로가 생성되어 있어야 한다.

Ÿ 예제 – upload.php

F upform.html, upload.php가 저장된 위치에 uploads 폴더(디렉토리)를 생성한다.

F 앞의 upfrom.html에서 sample.jpg를 선택하고 전송하면 다음의 코드가 실행되고 화면출력

과 함께 실제로 파일이 전송된다.

<?php�

$updir�=�"./uploads/";

if(�is_uploaded_file($_FILES['upfile']['tmp_name'])�)�{

$upfile�=�basename($_FILES['upfile']['name']);

$target�=�$updir�.�$upfile;

if�(move_uploaded_file($_FILES['upfile']['tmp_name'],�$target))�{

����echo�$upfile�.�"이�업로드�되었습니다.<br>";

}�else�{

����print�"업로드에�실패했습니다.<br>";

}

print_r($_FILES);

}

?>

Page 77: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 77

¡ $_COOKIE 변수

Ÿ Cookie란 사용자의 컴퓨터에 저장되어 있는 값을 서버에서 사용하는 정보를

말한다. 주로 간단한 정보를 저장하게 되는데 예를 들어 팝업창을 오늘 하루

열지 않게 한다던지, 사용자의 아이디를 기억시킨다든지 하는데 사용된다.

Ÿ Cookie는 PHP의 setcookie함수를 통해 생성되며 $_COOKIE는 이렇게 생성된

쿠키에 접근하기 위한 변수이다.

Ÿ 쿠키는 지정한 시간이 지나면 사용자 컴퓨터에서 삭제된다.

F bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path =

"" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

F setcookie()함수는 html 코드가 시작되기 이전에 실행되어야 한다.

Ÿ 예제

<?php�

$cookiename�=�"userid";

$cookeivalue�=�"[email protected]";

setcookie($cookiename,�$cookeivalue,�time()+3600);//1시간�뒤에�사라지는�쿠키�생성

?>

<!DOCTYPE�html>

<html�lang="en">

<head>

Page 78: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 78

<meta�charset="UTF-8">

<title>Cookie</title>

</head>

<body>

<?php�

if(�isset($_COOKIE['userid'])�)�{

�//이�파일을�처음�열었을�때는�cookei가�저장되지�않은�것으로�보인다.�

�//한�번�실행하고�새로고침을�한�번�더�하면�그�때�쿠키가�저장된�것이�확인된다.

�echo�"저장된�Cookie�userid의�값은�"�.�$_COOKIE['userid']�.�"입니다.";

}

?>

</body>

</html>

Ÿ 브라우저에서 쿠키값 확인

F 크롬의 경우 F12를 눌러 개발자 도구를 연 다음 Application 메뉴에서 Cookies 항목을 열어

도메인 주소를 열면 다음과 같이 쿠키가 저장되었고 종료일이 표시되는 것을 확인할 수 있

다.

¡ $_SESSION 변수

Ÿ 서버에 저장된 SESSION 값들에 접근하는 변수

Ÿ SESSION이란 서버에서 여러 페이지들 사이에 값을 유지하도록 저장하는 방법

Ÿ 쿠키와는 다르게 세션은 사용자의 컴퓨터에 값을 저장하지 않고 서버에 저장

Ÿ 세션은 주로 로그인 상태를 유지하거나 할 때 사용된다.

Page 79: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 79

Ÿ 세션은 한 사람의 사용자에 대해 일대일로 서버에 매치된다. 여기서 한 사람이

라는 것은 엄밀히 말하면 하나의 다른 브라우저라고도 할 수 있다. 예를 들어

하나의 컴퓨터에서 Chrome으로 페이지를 열었을 때와 IE로 열었을 때 서로 다

른 사용자로 간주된다는 것이다. 그래서 크롬에서 로그인 되었다 할지라도 IE

에서 열면 로그인되지 않은 상태가 되는 것이다.

Ÿ 세션은 기본적으로 일정 시간이 지나면 사라지고 또 브라우저를 닫으면 사라

진다.

Ÿ 다음은 세션 관련 주요 함수이다.

① session_start() - 세션을 시작(반드시 다른 요소들이 출력되기 전에 실행되어야 함)

② session_unset() - 모든 세션 변수들을 제거한다(세션은 남아 있고 데이터만 제거).

③ session_destroy() - 세션을 완전히 파괴한다.

Ÿ $_SESSION을 사용하려면 반드시 문서의 처음에 session_start()가 실행되어 있

어야 하며 세션을 제거하거나 파괴할 때도 반드시 session_start()가 실행되어

있어야 한다.

Ÿ session_start()가 실행되기 전에 공백문자, 빈줄이라도 앞에 출력이 있어서는

안된다.

Ÿ 예제 – index.php

<?php

session_start();

$userid�=�"";

$is_login�=�false;

if(�isset($_SESSION['userid'])�)�{

��$userid�=�$_SESSION['userid'];

��if($userid)�{

����$is_login�=�true;

��}

}

?>

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="UTF-8">

�<title>$_SESSION</title>

�<link� rel="stylesheet"�

Page 80: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 80

href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

</head>

<body>

�<div�class="container"�style="margin-top:�20px;">

��<?php�if(�$is_login�):�?>

��<p><?php�echo�$userid;?>님�반갑습니다.</p>

��<p><a�href="logout.php"�class="btn�btn-default">로그아웃</a></p>����

��<?php�else:�?>

��<form�action="login.php"�method="POST"�class="form-inline">

���<div�class="form-group">

����<label�for="userid">아이디</label>

����<input�type="text"�name="userid"�id="userid"�class="form-control">

���</div>

���<div�class="form-group">

����<label�for="userid">패스워드</label>

����<input�type="password"�name="userpw"�id="userpw"�class="form-control">

���</div>

���<button�type="submit"�class="btn�btn-primary">로그인</button>

��</form>

��<?php�endif;�?>

�</div>

</body>

</html>

Ÿ 예제 – login.php

F 위 화면에서 [email protected]를 아이디에 넣고 패스워드 123456을 입력한 후 [로그인] 버튼을

누르면 다음 코드가 실행된다.

F 다음 코드에서는 값이 일치하는지 확인한 후 일치하면 세션 ‘userid’에 아이디를 저장하고

다시 index.php로 페이지를 redirect해준다.

<?php�

session_start();

$userid�=�"";

$userpw�=�"";

if(�isset($_POST['userid'])�)�{

�$userid�=�$_POST['userid'];

}

if(�isset($_POST['userpw'])�)�{

Page 81: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 81

�$userpw�=�$_POST['userpw'];

}

if(�$userid�==�"[email protected]"�&&�$userpw�=�"123456"�)�{

�$_SESSION['userid']�=�$userid;

}

header("Location:�/");

die();

?>

F 로그인이 되고 다시 메인 페이지에 오면 로그인 되었는지 조건에 따라 로그인되었다는 메

시지와 로그아웃 버튼이 보인다.

Ÿ 예제 – logout.php

<?php�

session_start();

session_destroy();

header("Location:�/");

die();

?>

F 위 코드가 실행되면 세션을 완전히 파괴해서 세션에 userid는 더 이상 존재하지 않게 된다.

그리고 나서 index.php로 돌아가면 로그아웃 상태로 인식된다.

¡ $_REQUEST 변수

Ÿ $_REQUEST 변수는 $_GET과 $_POST로 전송된 데이터와 $_COOKIE 데이터를

다룰 수 있다.

Ÿ 전문가들은 여러 가지 이유로 $_REQUEST를 사용하지 않는 것이 좋다고 권고

한다. 대신에 $_GET, $_POST, $_COOKIE를 사용할 것을 권장하고 있다.

Page 82: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 82

Ÿ 예제

<?php

�if(�isset($_REQUEST["userid"])�&&�isset($_REQUEST["userpw"])�)�{

�echo�"userid�=�".�$_REQUEST['userid'].�"<br>";

�echo�"userpw�=�".�$_REQUEST['userpw'].�"<br>";

�}

?>

<!DOCTYPE�html>

<html�lang="en">

<head>

<meta�charset="UTF-8">

<title>$_POST</title>

�<link� rel="stylesheet"�

href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

</head>

<body>

�<div�class="container"�style="margin-top:�20px;">

��<form�action="<?php�$_PHP_SELF�?>"�method="POST"�class="form-inline">

���<div�class="form-group">

����<label�for="userid">아이디</label>

����<input�type="text"�name="userid"�id="userid"�class="form-control">

���</div>

���<div�class="form-group">

����<label�for="userid">패스워드</label>

����<input�type="password"�name="userpw"�id="userpw"�class="form-control">

���</div>

���<button�type="submit"�class="btn�btn-primary">로그인</button>

��</form>

�</div>

</body>

</html>

Page 83: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 83

PHP Forms

¡ Form에 대한 이해

Ÿ 앞에서 $_GET, $_POST, $_FILES 등을 다루면서 이미 Form에 대해 다루어보았

다. Form은 HTML의 요소이지만 데이터를 서버에 보낸다는 면에서 Server Side

언어가 반드시 필요하다.

Ÿ Form은 form 태그와 input 및 textarea 태그들, 그리고 전송버튼으로 이루어진

데이터 전송을 위해 작성되는 요소이다.

Ÿ 데이터 전송 방식(Method)은 크게 GET과 POST로 구분된다. 이 두 방식의 차이

는 앞에서 $_GET, $_POST를 설명하면서 간단히 다룬 적이 있지만 여기서 좀더

자세히 알아보면 다음과 같다.

¡ GET

Ÿ <form action="server.php” method="GET”>과 같이 사용하거나 주소 끝에 ?를

붙이고name/value 쌍으로, 또 여러 값인 경우 &를 붙여서 전송한다.

Ÿ URL의 최대 길이는 3,000글자(character)이므로 GET 방식으로 전송할 수 있는

데이터의 양에는 한계가 있다.

Ÿ URL로 데이터가 전송되므로 보안이 필요한 민감한 정보는 GET으로 전송하면

안된다.

Ÿ 사용자가 즐겨찾기 등에 주소를 등록해두거나 할 때는 GET 방식의 주소를 갖

는게 유용하다.

Ÿ 주로 GET은 검색과 같은 비보안 데이터 처리에 사용하는 것이 좋다.

Page 84: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 84

¡ POST

Ÿ <form action="server.php” method="POST”>와 같이 form을 구성한다. 데이

터는 URL로 전송되지 않는다.

Ÿ 전송되는 데이터의 사이즈에는 제한이 없다.

Ÿ POST 방식의 데이터 전송은 항상 Submit되어야 하므로 즐겨찾기 등에 사용할

수가 없다. 따라서 보안정보가 있지 않는한 POST보다는 GET이 유용하다.

HTTP Methods : POST, GET, PUT, DELETE

HTTP Method에는 POST, GET 외에도 PUT/PATCH, DELETE 등이 있다. 이 Method들은 일반적인 웹브

라우저의 Form에서 임의로 설정하여 사용할 수는 없지만 MVC Framework 등의 Open Source 들에 의

해 RESTful API를 구현하할 때 사용된다.

¡ GET Form 예제

Ÿ form.html

<!DOCTYPE�html>

<html�lang="en">

<head>

��<meta�charset="UTF-8">

��<title>$_POST</title>

�<link�rel="stylesheet"�

href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

</head>

<body>

��<div�class="container"�style="margin-top:�20px;">

����<div�class="jumbotron">

������<h1>PHP�Forms</h1>

����</div>

����<form�action="search.php"�method="GET"�class="form-inline">

�����<div�class="form-group">

������<label�for="search">검색어</label>

������<input�type="text"�name="search"�id="search"�class="form-control">

�����</div>

�����<button�type="submit"�class="btn�btn-primary">찾기</button>

����</form>

Page 85: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 85

�</div>

</body>

</html>

Ÿ search.php

<?php�

$search�=�"";

if(�isset($_GET['search'])�)�{

$search�=�$_GET['search'];

}

echo�"검색어는�<strong>"�.�$search�.�"</strong>입니다.";

?>

F 주소 끝에 값이 전송되어 넘겨지는 것을 확인할 수 있다.

¡ POST Form 예제

Ÿ form.html

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="UTF-8">

�<title>Forms</title>

�<link�rel="stylesheet"�

Page 86: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 86

href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

</head>

<body>

��<div�class="container">

����<div>

�����<h2>Blog�글쓰기</h2>

����</div>

����<form�action="write.php"�method="POST"�enctype="multipart/form-data">

�����<div�class="form-group">

������<label�for="title">제목</label>

������<input�type="text"�name="title"�id="title"�class="form-control"�required>

�����</div>

�����<div�class="form-group">

������<label�for="writer">글쓴이</label>

������<input�type="text"�name="writer"�id="writer"�class="form-control"�required>

�����</div>���

�����<div�class="form-group">

������<label�for="content">본문</label>

������<textarea�name="content"�id="content"�rows="5"�class="form-control"�required></textarea>

�����</div>��

�����<div�class="form-group">

������<label�for="upfile">첨부파일</label>

������<input�type="file"�name="upfile"�id="upfile"�class="form-control">

�����</div>

�����<button�type="submit"�class="btn�btn-primary">글등록</button>

����</form>

�</div>

</body>

</html>

Ÿ write.php

<?php�

$title�=�"";

$writer�=�"";

$content�=�"";

$content�=�"";

if(�isset($_POST['title'])�)�{�$title�=�$_POST['title'];�}

if(�isset($_POST['writer'])�)�{�$writer�=�$_POST['writer'];�}

if(�isset($_POST['content'])�)�{�$content�=�$_POST['content'];�}

//업로드�할�파일이�있으면�처리하고�$file�변수에�파일명을�할당한다.�

if(�is_uploaded_file($_FILES['upfile']['tmp_name'])�)�{

�$updir�=�"./uploads/";

�$upfile�=�basename($_FILES['upfile']['name']);

�$target�=�$updir�.�$upfile;

�if�(move_uploaded_file($_FILES['upfile']['tmp_name'],�$target))�{�$file�=�$upfile;�}

}

Page 87: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 87

//필수�항목인�$title,�$writer,�$content�값이�모두�비어�있지�않으면�실행

if(�$title�&&�$writer�&&�$content�)�{

�echo�"title�=�{$title}<br>";

�echo�"writer�=�{$writer}<br>";

�echo�"content�=�{$content}<br>";

�echo�"file�=�{$file}<br>";

}

print_r($_POST);

?>

¡ Form Validation

Ÿ form validation이란 Form을 통해서 전송되는 데이터의 유효성을 검증하고 넓

게는 데이터로부터의 공격가능성을 차단하는 작업을 말한다.

Ÿ form validation은 크게 클라이언트(사용자 브라우저) 사이트에서의 작업과 서

버 사이드 작업으로 구분할 수 있다.

Ÿ 클라이언트에서는 HTML과 JavaScript 등으로 Form 입력에 대한 조건을 지정

하거나 제한할 수 있고 서버에서는 PHP와 같은 서버사이드 언어에서 전송되어

온 데이터를 검증할 수 있다.

Page 88: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 88

Ÿ 그러나 클라이언트 측면에서의 데이터는 개발자도구만으로도 쉽게 변조가 가

능하므로 반드시 서버 사이드에서의 validation이 이루어져야 한다.

¡ Client Side Form Validation

Ÿ 클라이언트에서는 HTML, JavaSCript로 Form Validation이 가능하다.

Ÿ HTML5에서는 input의 type에 따라 데이터의 형식을 제한할 수 있으며

required를 사용해 필수 입력 항목임을 지정할 수 있다.

Ÿ input type에 따른 데이터 형식 제한 – 모든 브라우저에서 지원하지 않기 때문

에 기본적인 항목에 대한 예만 설명하며 JavaScript 등으로 보안해야 한다.

① email - <input type="email” ...> 데이터는 반드시 @와 .을 포함해야 한다.

② url – 올바른 URL 형식을 가져야 한다.

③ number – 숫자만 입력 받는다.

F 보다 자세한 사항은 다음 링크에서 확인해보자.

F https://www.w3schools.com/tags/att_input_type.asp

Ÿ required – HTML5부터 이 속성이 있으면 필수 입력항목으로 설정되어 내용이

비어 있는채로 전송할 수 없다.

Ÿ input type과 required를 활용한 validation 예제

<!DOCTYPE�html>

<html�lang="en">

<head>

<meta�charset="UTF-8">

<title>Forms</title>

�<link�rel="stylesheet"�

href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

</head>

<body>

��<div�class="container">

����<div>

�����<h2>Blog�글쓰기</h2>

����</div>

����<form�action="write.php"�method="POST"�enctype="multipart/form-data">

�����<div�class="form-group">

������<label�for="title">제목</label>

������<input�type="text"�name="title"�id="title"�class="form-control"�required>

�����</div>

Page 89: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 89

�����<div�class="form-group">

������<label�for="writer">글쓴이</label>

������<input�type="text"�name="writer"�id="writer"�class="form-control"�required>

�����</div>�

�����<div�class="form-group">

������<label�for="emial">Email</label>

������<input�type="email"�name="emial"�id="emial"�class="form-control"�required>

�����</div>��������

�����<div�class="form-group">

������<label�for="content">본문</label>

������<textarea�name="content"�id="content"�rows="5"�class="form-control"�required></textarea>

�����</div>��

�����<div�class="form-group">

������<label�for="upfile">첨부파일</label>

������<input�type="file"�name="upfile"�id="upfile"�class="form-control">

�����</div>

�����<button�type="submit"�class="btn�btn-primary">글등록</button>

����</form>

�</div>

</body>

</html>

F 필수 입력(required) 속성을 가진 항목을 비워두고 전송하면 전송이 안되면서 에러를 표시

한다.

F email 형식에 맞지 않으면 에러를 표시한다.

Ÿ JavaScript를 활용한 form validation

F HTML5를 지원하지 않는 브라우저 또는 브라우저 버전마다 특정 속성을 지원하지 않기 때

문에 input type 또는 required만으로 form validation을 완벽하게 수행할 수 없다. 따라서

다음과 같이 JavaScript를 활용한 validation도 알아두어야 한다.

F 특히 보아야 할 것은 form 태그 안에 있는 onsubmit="return formCheck();" 속성이다. 이

속성은 전송(submit)이 이루어 질 때 해야 할 일을 정해주는데 formCheck() 함수로부터 반

Page 90: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 90

환 받은 값을 form에게 반환한다. 이 때 false가 반환되면 폼은 전송되지 않는다. 때로는

form의 전송 자체를 막고자 할 때는 onsubmit="return false;"라고 해도 된다. formCheck()

함수에서는 데이터를 하나하나 검사 해서 만일 하나라도 유효하지 않은 값이 나타나면 바

로 return false를 실행하여 false를 반환하므로 폼 전송을 막는다.

<!DOCTYPE�html>

<html�lang="ko">

<head>

<meta�charset="UTF-8">

<title>Forms</title>

</head>

<body>

��<div>

����<form�action="join.php"�method="POST"�onsubmit="return�formCheck();">

�����<p>

������<label�for="username">이름</label>

������<input�type="username"�name="username"�id="username"�size="10">

������<label�for="useremail">메일</label>

������<input�type="text"�name="useremail"�id="useremail"�size="20">

������<label�for="userage">나이</label>

������<input�type="text"�name="userage"�id="userage"�size="3">

������<button�type="submit">회원가입</button>

�����</p>

����</form>

�</div>

�<script�type="text/javascript">

��function�formCheck()�{

���var�username�=�document.getElementById("username").value;

���var�useremail�=�document.getElementById("useremail").value;

���var�userage�=�document.getElementById("userage").value;

���//username�항목이�비어�있는지�검사�

���if(�username�==�""�)�{

����alert("이름은�필수�항목입니다.");

����document.getElementById("username").focus();

����return�false;

���}

���//useremail�항목이�비어�있는지�검사�

���if(�useremail�==�""�)�{

����alert("Email은�필수�항목입니다.");

����document.getElementById("useremail").focus();

����return�false;

���}

���//validateEmail()�함수에�값을�보내서�유효한지�검사하고�

���//false이면�경고를�보여주고�false를�반환하여�폼이�전송되지�않게�한다.

���if(�!�validateEmail(useremail)�)�{

����alert("Email�형식이�유효하지�않습니다.");

Page 91: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 91

����document.getElementById("useremail").focus();

����return�false;

���}

���//userage�항목이�비어�있는지�검사�

���if(�userage�==�""�)�{

����alert("나이는�필수�항목입니다.");

����document.getElementById("userage").focus();

����return�false;

���}

���//isNaN은�Not�a�Number인지를�확인하는�함수�

���if(�isNaN(userage)�)�{

����alert("나이는�숫자이어야�합니다.");

����document.getElementById("userage").focus();

����return�false;�

���}

��}

��//정규표현식을�사용해서�유효한�Email�주소인지�확인하는�함수�

��//https://stackoverflow.com/questions/46155/how-to-validate-email-address-in-javascript

��function�validateEmail(email)�{

���var�re�=�

/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0

-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

���return�re.test(email);�//email에�유효하면�true,�맞지�않으면�false가�반환됨�

��}��

�</script>

</body>

</html>

Page 92: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 92

¡ Server Side Form Validation

Ÿ 앞서 설명했듯이 클라이언트 사이드에서의 폼 유효성 검증만으로는 완벽한 데

이터를 보장할 수 없다.

Ÿ 따라서 반드시 서버 사이드에서도 데이터 유효성 검증을 해야 하는데 이미 앞

의 $_GET, $_POST 등에서 값이 있는지 없는지 검사하는 예제를 다루었기 때문

에 여기서는 보안과 관련된 문제를 포함해서 알아보자.

Ÿ joinform.html

<!DOCTYPE�html>

<html�lang="ko">

<head>

�<meta�charset="UTF-8">

�<title>Forms</title>

</head>

<body>

��<div>

����<form�action="join.php"�method="POST">

�����<p>

������<label�for="username">이름</label>

������<input�type="username"�name="username"�id="username"�size="10">

������<label�for="useremail">메일</label>

������<input�type="text"�name="useremail"�id="useremail"�size="20">

������<label�for="userage">나이</label>

������<input�type="text"�name="userage"�id="userage"�size="3">

������<button�type="submit">회원가입</button>

�����</p>

����</form>

�</div>

</body>

</html>

F 테스트를 위해서 클라이언트에서 어떤 validation도 실행하지 않도록 작성하였음

Page 93: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 93

Ÿ join.php

<?php�

$username�=�"";

$useremail�=�"";

$userage�=�0;

if(�isset($_POST['username'])�)�{

�$username�=�$_POST['username'];

}

if(�isset($_POST['useremail'])�)�{

�$useremail�=�$_POST['useremail'];

}

if(�isset($_POST['userage'])�)�{

//입력받은�userage는�숫자일지라도�문자열�형식이므로�(int)를�사용해�정수로�변환

//나이에�abc와�같이�문자를�쓰면�0이�되므로�참이�아님�

�$userage�=�(int)$_POST['userage'];

}

if(�!�$username�)�{

echo�"사용자�이름은�필수�항목입니다.<br>";

}

if(�!�$useremail�)�{

echo�"사용자�Email은�필수�항목입니다.<br>";

}

//filter_var�함수를�사용해서�email�유효성을�검증한다.�

if�(�!�filter_var($useremail,�FILTER_VALIDATE_EMAIL)�)�{

��echo�"Email�형식이�올바르지�않습니다.<br>";

}

if(�!�$userage�)�{

echo�"사용자�나이는�필수�항목입니다.<br>";

}

//필수�항목인�$title,�$writer,�$content�값이�모두�비어�있지�않으면�실행

if(�$username�&&�$useremail�&&�$userage�)�{

echo�"<h2>모든�데이터�유효</h2>";

echo�"username�=�{$username}<br>";

echo�"useremail�=�{$useremail}<br>";

echo�"userage�=�{$userage}";

}

?>

Page 94: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 94

F form에 아무 값도 입력하지 않고 전송을 누르면 아래와 같이 표시된다.

F form에 다음과 같이 이름은 비우고 메일과 나이에 유효하지 않은 값을 넣으면 다음과 같이

표시된다.

F 아래와 같이 모든 데이터를 유효하게 입력하면 데이터가 유효하다고 표시됨.

¡ Form Data 보안

Ÿ Form데이터는 서버에 의도하지 않은 데이터를 전송해서 해킹 등에 악용하는

주요 창구이다.

Page 95: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 95

Ÿ 예를 들어 XSS(Cross Site Scripting)같은 공격은 Form에 JavaScript 코드를 몇

줄 전송하는 것만으로도 가능하다.

Ÿ 여기서는 몇가지 간단한 방법으로 이와 같은 공격을 방어하는 방법을 알아보

자.

Ÿ XSS 공격 사례

F 앞의 joinform.html에서 이름 대신 다음과 같이 써보자. 그리고 join.php에 전송을 그대로

해보자. Chrome 최신 버전은 이러한 데이터 전송을 브라우저가 차단하므로 IE 11에서 테스

트해볼 것이다.

<script>alert('당신은�해킹�당했어요');</script>

Ÿ XSS 공격 차단

F 위와 같은 공격을 차단하려면 어떻게 해야 할까? 입력된 데이터에서 html 코드 또는

JavaScript 코드로 인식될 수 있는 코드들을 일반 문자로 변환하거나 제거해주어야 한다.

Page 96: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 96

F 위 join.php 코드에서 $username = $_POST['username']; 부분을 다음과 같이 고쳐보자.

$username�=�htmlspecialchars($_POST['username']);

F htmlspecialchars() 함수에 의해 <script>alert('당신은 해킹 당했어요');</script>가 그대로 실

행되는 것이 아니라 화면에 출력을 위한 문자로 바뀌게 된다.

F 위 화면의 소스보기를 열어서 보면 다음과 같이 script에서 < 문자가 &lt; 로, >가 &gtl;로

바뀐 것을 볼 수 있다. 이렇게 하면 <>는 태그가 아니라 화면에 출력될 뿐이다.

<h2>모든�데이터�유효</h2>

username�=�&lt;script&gt;alert('당신은�해킹�당했어요');&lt;/script&gt;<br>

useremail�=�[email protected]<br>

userage�=�22

Page 97: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 97

PHP Filters

¡ Filter란?

Ÿ 앞에서 Form 데이터 유효성 검증에 대해 설명하면서 filter_var() 함수를 사용한

검증 예제가 포함된 적이 있었다.

Ÿ PHP는 Filter를 제공하여 다양한 방법으로 데이터의 유효성을 검증하고 데이터

를 정리할 수 있도록 해준다.

Ÿ Filter 종류

① Validate filter – 비교 대상의 값이 지정한 필터의 조건에 맞는지 검사 TRUE 또는 FALSE

② Sanitize filter – 포함되어서는 안되는 값들을 제거해주는 filter

Ÿ Filter 사용법

mixed�filter_var�(�mixed�$variable�[,�int�$filter�=�FILTER_DEFAULT�[,�mixed�$options�]]�)

F $variable – 검사하려는 값

F $filter – 적용하려는 필터 ID(숫자) 또는 필터 이름(예, FILTER_VALIDATE_INT)

F $options – 추가 속성. 예) FILTER_VALIDATE_INT의 경우 범위를 지정하거나 할 때 사용

¡ 예제로 Filter 배우기

Ÿ filter_email.php

<?php�

/**

�*�filter_email.php

�*�값이�Email�주소에�유효한지�검사

�*/

$a�=�"aaaa";

$b�=�"aaaa@";

$c�=�"aaaa@bbb";

$d�=�"aaaa@bbb.";

$e�=�"[email protected]";

$f�=�"aaaa@)(*&^%$#@!.@#!";

if(�filter_var($a,�FILTER_VALIDATE_EMAIL)�)�{

Page 98: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 98

�echo�"{$a}는�올바른�Email�주소입니다.<br>";

}�else�{

�echo�"{$a}는�올바른�Email�주소가�아닙니다.<br>";

}

if(�filter_var($b,�FILTER_VALIDATE_EMAIL)�)�{

�echo�"{$b}는�올바른�Email�주소입니다.<br>";

}�else�{

�echo�"{$b}는�올바른�Email�주소가�아닙니다.<br>";

}

if(�filter_var($d,�FILTER_VALIDATE_EMAIL)�)�{

�echo�"{$d}는�올바른�Email�주소입니다.<br>";

}�else�{

�echo�"{$d}는�올바른�Email�주소가�아닙니다.<br>";

}

if(�filter_var($e,�FILTER_VALIDATE_EMAIL)�)�{

�echo�"{$e}는�올바른�Email�주소입니다.<br>";

}�else�{

�echo�"{$e}는�올바른�Email�주소가�아닙니다.<br>";

}

if(�filter_var($f,�FILTER_VALIDATE_EMAIL)�)�{

�echo�"{$f}는�올바른�Email�주소입니다.<br>";

}�else�{

�echo�"{$f}는�올바른�Email�주소가�아닙니다.<br>";

}

?>

Ÿ filter_int.php

<?php�

/**

�*�filter_int.php

�*�값이�정수인지�검사

�*/

$a�=�1;

$b�=�-1;

$c�=�"a1";

$d�=�"a-1";

$e�=�"100";�//형�번환이�일어나�정수로�취급됨

$f�=�"-100";�//형�변환으로�일어나�정수로�취급됨

Page 99: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 99

if(�filter_var($a,�FILTER_VALIDATE_INT)�)�{

�echo�"{$a}는�정수입니다.<br>";

}�else�{

�echo�"{$a}는�정수가�아닙니다.<br>";

}

if(�filter_var($b,�FILTER_VALIDATE_INT)�)�{

�echo�"{$b}는�정수입니다.<br>";

}�else�{

�echo�"{$b}는�정수가�아닙니다.<br>";

}

if(�filter_var($c,�FILTER_VALIDATE_INT)�)�{

�echo�"{$c}는�정수입니다.<br>";

}�else�{

�echo�"{$c}는�정수가�아닙니다.<br>";

}

if(�filter_var($d,�FILTER_VALIDATE_INT)�)�{

�echo�"{$d}는�정수입니다.<br>";

}�else�{

�echo�"{$d}는�정수가�아닙니다.<br>";

}

if(�filter_var($e,�FILTER_VALIDATE_INT)�)�{

�echo�"{$e}는�정수입니다.<br>";

}�else�{

�echo�"{$e}는�정수가�아닙니다.<br>";

}

if(�filter_var($f,�FILTER_VALIDATE_INT)�)�{

�echo�"{$f}는�정수입니다.<br>";

}�else�{

�echo�"{$f}는�정수가�아닙니다.<br>";

}

?>

Page 100: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 100

Ÿ filter_ip.php

<?php�

/**

�*�filter_ip.php

�*�값이�올바른�IP인지�검사

�*/

$a�=�"127.0.0.1";

$b�=�"123456789";

$c�=�"555.555.555.555";

if(�filter_var($a,�FILTER_VALIDATE_IP)�)�{

�echo�"{$a}는�올바른�IP입니다.<br>";

}�else�{

�echo�"{$a}는�올바른�IP가�아닙니다.<br>";

}

if(�filter_var($b,�FILTER_VALIDATE_IP)�)�{

�echo�"{$b}는�올바른�IP입니다.<br>";

}�else�{

�echo�"{$b}는�올바른�IP가�아닙니다.<br>";

}

if(�filter_var($c,�FILTER_VALIDATE_IP)�)�{

�echo�"{$c}는�올바른�IP입니다.<br>";

}�else�{

�echo�"{$c}는�올바른�IP가�아닙니다.<br>";

}

?>

Ÿ filter_url.php

<?php�

/**

�*�filter_url.php

�*�값이�올바른�URL인지�검사

�*/

$a�=�"http://www.webskills.kr";

$b�=�"webskills.kr";

$c�=�"webskills";

Page 101: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 101

if(�filter_var($a,�FILTER_VALIDATE_URL)�)�{

�echo�"{$a}는�올바른�URL입니다.<br>";

}�else�{

�echo�"{$a}는�올바른�URL이�아닙니다.<br>";

}

if(�filter_var($b,�FILTER_VALIDATE_URL)�)�{

�echo�"{$b}는�올바른�URL입니다.<br>";

}�else�{

�echo�"{$b}는�올바른�URL이�아닙니다.<br>";

}

if(�filter_var($c,�FILTER_VALIDATE_URL)�)�{

�echo�"{$c}는�올바른�URL입니다.<br>";

}�else�{

�echo�"{$c}는�올바른�URL이�아닙니다.<br>";

}

?>

Ÿ filter_sanitize_email.php

<?php�

/**

�*�filter_sanitize_email.php

�*�값이�Email�주소에�유효하지�않은�값을�제거한�후�검사

�*/

$a�=�"(�[email protected]�)";

$aa�=�filter_var($a,�FILTER_SANITIZE_EMAIL);�//공맥�및�()�제거

$b�=�"�{[email protected]�}�";

$bb�=�filter_var($a,�FILTER_SANITIZE_EMAIL);�//공맥�및�{}�제거

if(�filter_var($a,�FILTER_VALIDATE_EMAIL)�)�{

�echo�"{$a}는�올바른�Email�주소입니다.<br>";

}�else�{

�echo�"{$a}는�올바른�Email�주소가�아닙니다.<br>";

}

if(�filter_var($aa,�FILTER_VALIDATE_EMAIL)�)�{

�echo�"{$aa}는�올바른�Email�주소입니다.<br>";

}�else�{

Page 102: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 102

�echo�"{$aa}는�올바른�Email�주소가�아닙니다.<br>";

}

if(�filter_var($b,�FILTER_VALIDATE_EMAIL)�)�{

�echo�"{$b}는�올바른�Email�주소입니다.<br>";

}�else�{

�echo�"{$b}는�올바른�Email�주소가�아닙니다.<br>";

}

if(�filter_var($bb,�FILTER_VALIDATE_EMAIL)�)�{

�echo�"{$bb}는�올바른�Email�주소입니다.<br>";

}�else�{

�echo�"{$bb}는�올바른�Email�주소가�아닙니다.<br>";

}

?>

Ÿ filter 참조 링크들

F https://www.w3schools.com/php/php_filter.asp

F https://www.w3schools.com/php/php_filter_advanced.asp

F http://php.net/manual/kr/filter.filters.php

F http://php.net/manual/kr/filter.filters.validate.php

F http://php.net/manual/kr/filter.filters.sanitize.php

Page 103: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 103

PHP 파일에 다른 PHP 포함

¡ include, require

Ÿ include와 require는 모두 PHP 파일 안에 또 다른 PHP 파일을 포함시켜 실행

하는데 사용하는 함수들이다.

Ÿ PHP 파일 안에 다른 PHP 파일을 포함할 수 있게 됨으로써 PHP는 훨씬 더 강

력한 코딩 구조를 가질 수 있게 되는데 예를 들어 여러 페이지들에 공통으로

사용되는 환경설정, DB 연결설정, 반복적으로 사용되는 함수나 클래스 들을 페

이지마다 새로 구현할 필요 없이 하나의 PHP 파일에 저장해두고 이를 등록하

여 사용할 수 있는 것이다.

Ÿ include와 require는 거의 모든 기능에서 유사하게 작동하지만 에러를 표시하

거나 처리하는 방법에서 다르다. 여기서는 두 함수의 차이점은 무시하고 공통

점을 가진 함수로 간주하여 예제를 만든다.

Ÿ include, include_once, require, requre_once

F include와 requre는 모두 PHP 파일 안에 다른 PHP를 포함한다는 점에서 같다. 그렇다면 각

함수이름 끝에 _once가 붙은 경우는 무엇이 다를까?

F include_once, require_once는 모두 파일을 한 번만 포함시킨 다는 점에서 다르다. 예를 들

어 어떤 파일 안에서 function.php 파일을 include 했는데 다른 줄에서 이 파일을 다시 한

번 포함시키면 어떤 문제가 생길까? 만일 함수나 클래스 등이 포함되어 있다면 중복 선언

등의 에러가 발생한다. 이러한 문제를 방지하기 위해 _once가 붙은 함수를 사용한다.

¡ include 기본 예제

Ÿ 이 예제의 기본 구조는 html 파일을 둘로 나누어 콘텐츠의 윗 부분은

header.php에 저장하고 아래 부분은 footer.php에 저장하여 include.php 파일

에 각각 포함시키는 방법이다.

Ÿ include.php 파일은 header.php 포함, 콘텐츠 직접입력, footer.php 포함 순으

Page 104: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 104

로 파일을 구성한다.

Ÿ header.php와 footer.php 두 파일을 합치면 기본적인 HTML 코드가 된다. 이를

둘러 나누어 위 아래로 배치하는 것이다.

Ÿ header.php

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="UTF-8">

�<title>include</title>

</head>

<body>

�<header>

��<h1>Include�Example</h1>

�</header>

�<div>

Ÿ footer.php

�</div>

�<p>&copy;�2017�webskills.kr.�All�Rights�Reserved.</p>

</body>

</html>

Ÿ include.php

<?php�include("header.php");�?>

<h2>Lorem</h2>

<p>Lorem�ipsum�dolor�sit�amet,�consectetur�adipisicing�elit,�sed�do�eiusmod

tempor�incididunt�ut�labore�et�dolore�magna�aliqua.�Ut�enim�ad�minim�veniam,

quis�nostrud�exercitation�ullamco�laboris�nisi�ut�aliquip�ex�ea�commodo

consequat.�Duis�aute�irure�dolor�in�reprehenderit�in�voluptate�velit�esse

cillum�dolore�eu�fugiat�nulla�pariatur.�Excepteur�sint�occaecat�cupidatat�non

proident,�sunt�in�culpa�qui�officia�deserunt�mollit�anim�id�est�laborum.</p>

<?php�include("footer.php");�?>

Page 105: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 105

Ÿ 위 include.php 파일을 실행하고 소스보기를 하면 다음과 같이 세 개의 파일이

합쳐진 결과를 볼 수 있다.

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="UTF-8">

�<title>include</title>

</head>

<body>

�<header>

��<h1>Include�Example</h1>

�</header>

�<div>

��<h2>Lorem</h2>

��<p>Lorem�ipsum�dolor�sit�amet,�consectetur�adipisicing�elit,�sed�do�eiusmod

tempor�incididunt�ut�labore�et�dolore�magna�aliqua.�Ut�enim�ad�minim�veniam,

quis�nostrud�exercitation�ullamco�laboris�nisi�ut�aliquip�ex�ea�commodo

consequat.�Duis�aute�irure�dolor�in�reprehenderit�in�voluptate�velit�esse

cillum�dolore�eu�fugiat�nulla�pariatur.�Excepteur�sint�occaecat�cupidatat�non

proident,�sunt�in�culpa�qui�officia�deserunt�mollit�anim�id�est�laborum.</p>

�</div>

�<p>&copy;�2017�webskills.kr.�All�Rights�Reserved.</p>

</body>

</html>

Page 106: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 106

¡ include 중복 시 에러 예제와 해결방법

Ÿ 위의 예제에서는 단순히 HTML 콘텐츠들만 포함된 PHP 파일들을 include했다.

이 경우에는 중복 include해도 크게 문제가 되지 않는다. 예를 들어 footer.php

를 두 번 include해도 내용만 두 번 출력될 뿐 에러는 나지 않는다.

Ÿ 아래 예제는 위 include.php 파일의 끝에 footer.php를 두 번 include 했다.

<?php�include("header.php");�?>

<h2>Lorem</h2>

<p>Lorem�ipsum�dolor�sit�amet,�consectetur�adipisicing�elit,�sed�do�eiusmod

tempor�incididunt�ut�labore�et�dolore�magna�aliqua.�Ut�enim�ad�minim�veniam,

quis�nostrud�exercitation�ullamco�laboris�nisi�ut�aliquip�ex�ea�commodo

consequat.�Duis�aute�irure�dolor�in�reprehenderit�in�voluptate�velit�esse

cillum�dolore�eu�fugiat�nulla�pariatur.�Excepteur�sint�occaecat�cupidatat�non

proident,�sunt�in�culpa�qui�officia�deserunt�mollit�anim�id�est�laborum.</p>

<?php�include("footer.php");�?>

<?php�include("footer.php");�?>

F 위 그림에서 보듯 단순한 HTML 콘텐츠 파일은 내용을 두 번 출력해줄 뿐이다. 물론 이것

이 w3c의 HTML Validation에서는 에러를 일으킬 것이다. 왜냐하면 </div></body></html>

Page 107: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 107

등이 두 번 포함되어 있기 때문이다. 그러나 적어도 PHP에서는 에러가 나지 않는다.

Ÿ 하지만 포함하려고 하는 php 파일에 함수와 같이 하나의 문서에 두 번 정의되

어서는 안되는 요소가 있을 때는 예기가 달라진다. 다음의 예제를 보자.

Ÿ functions.php

<?php�

function�myFunction()�{

�//임시�함수

}

?>

Ÿ include.php

<?php�include("functions.php");�?>

<?php�include("header.php");�?>

<h2>Lorem</h2>

<p>Lorem�ipsum�dolor�sit�amet,�consectetur�adipisicing�elit,�sed�do�eiusmod...</p>

<?php�include("footer.php");�?>

<?php�include("functions.php");�?>

F 위 include.php 파일에서 functions.php 파일을 문서의 처음과 끝에 두 번 include 시켰다.

functions.php 파일 안에는 두 번 정의될 수 없는 함수가 포함되어 있다. 특별한 실행코드

는 없지만 그 실행결과는 어떻게 될까?

Page 108: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 108

F 결과는 Fatal error 발생이다. 이미 정의된 myFunction()은 재 정의될 수 없다는 것이다.

F 이런 에러를 방지하기 위해 사용하는 것이 include_once()이다. 아래와 같이 코드를 고치면

에러가 발생하지 않는다.

<?php�include_once("functions.php");�?>

<?php�include("header.php");�?>

<h2>Lorem</h2>

<p>Lorem�ipsum�dolor�sit�amet,�consectetur�adipisicing�elit,�sed�do�eiusmod

tempor�incididunt�ut�labore�et�dolore�magna�aliqua.�Ut�enim�ad�minim�veniam,

quis�nostrud�exercitation�ullamco�laboris�nisi�ut�aliquip�ex�ea�commodo

consequat.�Duis�aute�irure�dolor�in�reprehenderit�in�voluptate�velit�esse

cillum�dolore�eu�fugiat�nulla�pariatur.�Excepteur�sint�occaecat�cupidatat�non

proident,�sunt�in�culpa�qui�officia�deserunt�mollit�anim�id�est�laborum.</p>

<?php�include("footer.php");�?>

<?php�include_once("functions.php");�?>

Page 109: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 109

PHP 날짜, 시간 다루기

¡ date() 함수를 사용하여 날짜 시간 다루기

Ÿ date() 함수는 서버의 날짜와 시간을 얻어 이를 형식화하는 함수이다.

Ÿ date() 함수 문법

string�date�(�string�$format�[,�int�$timestamp�]�)

F $format - 주어진 날짜 정보로부터 반환할 날짜의 형식

F $timestamp – 날짜 형식을 출력하기 위한 시간값(유닉스타임스탬프). 선택적이며 주어지

지 않으면 서버의 현재 시간을 기준으로 하게 됨.

Ÿ 서버의 현재 날짜로부터 년-월-일 시:분:초 얻어오기

<?php�

echo�date("Y-m-d�H:i:s");

?>

F 위 간단 예제를 보면 date() 함수는 서버의 현재 날짜를 얻어 이를 yyyy-mm-dd hh:mm:dd

형식으로 반환해준다는 것을 확인할 수 있다.

Ÿ 지정된 날짜에서 년-월-일 시:분:초 값 얻어오기.

<?php�

$d�=�strtotime("2017-12-31�23:59:59");

echo�date("Y-m-d�H:i:s",�$d);

?>

F strtotime() 함수는 문자열로 된 날짜 시간 값을 timestamp 값으로 변환해준다.

Page 110: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 110

Ÿ strtotime() 함수와 상대적 형식 구조(Relative Formats)를 활용한 다양한 예제

<?php�

$d1�=�strtotime("today");

echo�"오늘은�"�.�date("Y-m-d",�$d1)�.�"<br>";

$d1�=�strtotime("yesterday");

echo�"오늘의�1일�전은�"�.�date("Y-m-d",�$d1)�.�"<br>";

$d2�=�strtotime("tomorrow");

echo�"오늘의�1일�후는�"�.�date("Y-m-d",�$d2)�.�"<br>";

$d3�=�strtotime("noon");

echo�"오늘의�정오는�"�.�date("Y-m-d�H:i:s",�$d3)�.�"<br>";

$d4�=�strtotime("midnight");

echo�"오늘의�자정은�"�.�date("Y-m-d�H:i:s",�$d4)�.�"<br>";

$d5�=�strtotime("first�day�of�January�2018");

echo�"2018년의�1월�첫째�날의�요일은�"�.�date("D",�$d5)�.�"<br>";

$d6�=�strtotime("last�day�of�this�month");

echo�"이번�달의�마지막�날은�"�.�date("j",�$d6)�.�"<br>";

$d7�=�strtotime("last�day�of�last�month");

echo�"지난�달의�마지막�날은�"�.�date("j",�$d7)�.�"<br>";

$d8�=�strtotime("last�day�of�next�month");

echo�"다음�달의�마지막�날은�"�.�date("j",�$d8)�.�"<br>";

$d9�=�strtotime("+10�day");

echo�"오늘부터�10일�후는�"�.�date("Y-m-d",�$d9)�.�"<br>";

$d10�=�strtotime("-5�day");

echo�"오늘부터�5일�전은�"�.�date("Y-m-d",�$d10)�.�"<br>";

$d11�=�strtotime("-2�weeks");

echo�"오늘부터�2주�전은�"�.�date("Y-m-d",�$d11)�.�"<br>";

$d12�=�strtotime("+5�weeks");

echo�"오늘부터�5주�후는�"�.�date("Y-m-d",�$d12)�.�"<br>";

$d13�=�strtotime("Monday�next�week");

echo�"다음�주�월요일은�"�.�date("Y-m-d",�$d13)�.�"<br>";

?>

Page 111: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 111

F 참조 링크

http://php.net/manual/en/function.strtotime.php

http://php.net/manual/en/datetime.formats.relative.php

Ÿ date format

F 참조: http://php.net/manual/kr/function.date.php

F 날짜 관련

형식 문자 설명 반환값 예시d 일, 앞에 0이 붙는 2 숫자 01에서 31D 요일 글자 표현, 3 문자 Mon에서 Sunj 앞에 0이 붙지 않는 일 1에서 31l (소문자 'L') 요일의 완전한 글자 표현 Sunday에서 SaturdayN 요일의 ISO-8601 숫자 표현 (PHP 5.1.0에서 추가) 1(월요일)에서 7(일요일)S 일 영어 접미사, 2 문자 st, nd, rd, th. j와 잘 맞습니다.w 요일 숫자 표현 0(일요일)에서 6(토요일)z 해당 연도 일차 (0에서 시작) 0에서 365

F 주 관련

형식 문자 설명 반환값 예시W ISO-8601 주차, 주는 월요일에 시작 (PHP 4.1.0~) 예시: 42 (그 해의 42번째 주)

F 월 관련

형식 문자 설명 반환값 예시F January나 March 같은 월의 완전한 글자 표현 January에서 Decemberm 0이 붙는 월 숫자 표현 01에서 12M 월의 축약 글자 표현, 3 문자 Jan에서 Decn 0이 붙지 않는 월 숫자 표현 1에서 12t 주어진 월의 일 수 28에서 31

Page 112: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 112

F 연도 관련

형식 문자 설명 반환값 예시L 윤년 여부 윤년엔 1, 그 외엔 0

oISO-8601 연도. Y와 같지만, ISO 주차(W)가 전해나 다음해에 해당하면, 그 연도를 사용합니다.

예시: 1999나 2003 (PHP 5.1.0에서 추가)

Y 연도의 완전한 숫자 표현, 4 숫자 예시: 1999나 2003y 연도의 두 숫자 표현 예시: 99나 03

F 시간 관련

형식 문자 설명 반환값 예시a 오전과 오후의 소문자 am 또는 pmA 오전과 오후의 대문자 AM 또는 PMB 스와치 인터넷 시간 000에서 999g 0이 붙지 않는 12시간 형식 시 1에서 12G 0이 붙지 않는 24시간 형식 시 0에서 23h 0이 붙는 12시간 형식 시 01에서 12H 0이 붙는 24시간 형식 시 00에서 23i 0이 붙는 분 00에서 59s 초, 0이 붙음 00에서 59u 마이크로초 (PHP 5.2.2에서 추가) 예시: 54321

F 시간대 관련

형식 문자 설명 반환값 예시e 시간대 식별자 (PHP 5.1.0에서 추가) 예시: UTC, GMT, Atlantic/AzoresI (대문자 i) 일광 절약 시간 여부 일광 절약 시간이면 1, 아니면 0O 그리니치 시간(GMT)과 시차 예시: +0200

P시와 분 사이에 콜론이 들어가는 그리니치 시간(GMT)과 차이

예시: +02:00

T 시간대 축약어 예시: EST, MDT ...

Z시간대 오프셋 초. UTC 서쪽은 항상 음수, UTC 동쪽은 항상 양수

-43200에서 50400

F 날짜/시간 표현 관련

형식 문자 설명 반환값 예시c ISO 8601 날짜 (PHP 5에서 추가) 2004-02-12T15:19:21+00:00

r RFC 2822 형식 날짜예시: Thu, 21 Dec 2000 16:01:07 +0200

U유닉스 에포치(January 1 1970 00:00:00 GMT)부터 초수

time() 참조

¡ Time Zone 다루기

Ÿ 만일 서버가 전혀 다른 Time Zone을 가진다면, 얘를 들어 서버가 UTC나 호주

같은 곳의 Time Zone으로 설정되어 있다면 서버의 시간을 확인하면 로컬 시간

과는 다른 엉뚱한 시간이 표시될 것이다.

Page 113: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 113

Ÿ 또는 하나의 서버라 할지라도 Time Zone이 다른 지역에서 접근한다면 서버의

기본 Time Zone 설정을 알거나 스크립트에서 자신의 Time Zone으로 설정할

필요가 있을 것이다.

Ÿ 이와 같은 작업을 위해서 PHP는 Time Zone을 얻어오거나 설정할 수 있는 함

수를 제공한다.

① date_default_timezone_get() - 현재 설정된 Time Zone 정보를 얻어온다.

② date_default_timezone_set(string timezone) - 새로운 Time Zone으로 설정한다.

Ÿ Time Zone 예제

<?php�

echo�date_default_timezone_get()�.�"<br>";

echo�date("Y-m-d�H:i:s")�.�"<br>";

date_default_timezone_set("Asia/Seoul");

echo�date_default_timezone_get()�.�"<br>";

echo�date("Y-m-d�H:i:s");

?>

F PHP가 지원하는 Time Zone 목록은 다음 링크에서 확인 가능

http://php.net/manual/en/timezones.php

https://www.w3schools.com/php/php_ref_timezones.asp

¡ mktime()으로 날짜 시간 다루기

Ÿ mktime()은 주어진 날짜시간 정보를 입력하여 timestamp를 만드는 함수이다.

Ÿ 사용법

Page 114: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 114

mktime(hour,minute,second,month,day,year)

Ÿ 예제

<?php�

$hour�=�10;

$minute�=�32;

$second�=�21;

$month�=�12;

$day�=�31;

$year�=�2017;

$d�=�mktime($hour,�$minute,�$second,�$month,�$day,�$year);

echo�date("Y-m-d�H:i:s�l",�$d);

?>

Page 115: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 115

PHP File 다루기

¡ 서버에 파일 읽고 쓰기

Ÿ fopen.php - 파일 읽기 예제

<?php�

$text�=�"";

$filename��=�"./lorem.txt";

//만일�파일이�존재한다면...

if(�file_exists($filename)�)�{

�//파일을�읽기�전용으로�열면...

�if(�$file�=�fopen($filename,�"r")�)�{

��$filesize�=�filesize($filename);�//파일�사이즈를�구한다.�

��$text�=�fread($file,�$filesize);�//파일을�처음부터�파일사이즈까지�읽는다.

��fclose($file);�//파일을�닫는다.

�}���

}

echo�$text;

?>

Ÿ lorem.txt

Lorem�ipsum�dolor�sit�amet,�consectetur�adipisicing�elit.�Eum�quaerat�sunt�autem�iste�nostrum�

nulla�doloribus,�facere�exercitationem�porro�totam.�Quos�iusto�consequuntur�officia�quia�sunt�

voluptatum�distinctio�accusamus�illum.

Ÿ fwrite.php – 새로운 파일 생성하고 값 저장 예제

<?php�

$text�=�"";

$filename��=�"./new.txt";

//만일�파일이�존재한다면...

//파일을�쓰기�모드로�연다.�만일�파일이�없으면�생성한다.�

if(�$file�=�fopen($filename,�"w")�)�{

�$text�=�"파일에�새로운�내용�쓰기�테스트입니다("�.�date("Y-m-d�H:i:s")�.�")\r\n";�//\r\n은�줄바꿈

�fwrite($file,�$text);�//파일에�내용�넣기

�$text2�=�"파일에�두�번째�내용�쓰기�테스트입니다("�.�date("Y-m-d�H:i:s")�.�")\r\n";

�fwrite($file,�$text2);�//파일에�내용�추가하기,�파일을�close�하기�전까지�계속�추가�가능

�fclose($file);�//파일�닫기를�실행하면�실제로�파일이�저장된다.�

}

?>

Page 116: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 116

F new.txt 파일이 생성되어 열어보면 아래와 같이 텍스트가 저장되어 있다.

Ÿ freadwrite.php

F 위에서 저장한 new.txt 파일을 열어 내용을 읽고 다시 그 파일의 내용 뒤에 새로운 내용을

추가하여 저장하는 예제

<?php�

$text�=�"";

$filename��=�"./new.txt";

//만일�파일이�존재한다면...

if(�file_exists($filename)�)�{

�//파일을�읽기�전용으로�열면...

�if(�$file�=�fopen($filename,�"r")�)�{

��$filesize�=�filesize($filename);�//파일�사이즈를�구한다.�

��$text�=�fread($file,�$filesize);�//파일을�처음부터�파일사이즈까지�읽는다.

��fclose($file);�//파일을�닫는다.

�}���

}

//파일을�쓰기�모드로�연다.�만일�파일이�없으면�생성한다.�

if(�$file�=�fopen($filename,�"w")�)�{

�$text�.=�"\r\n파일�열어서�새로�추가한�내용입니다("�.�date("Y-m-d�H:i:s")�.�").";

�fwrite($file,�$text);�//파일에�내용�넣기

�fclose($file);�//파일�닫기를�실행하면�실제로�파일이�저장된다.�

}

?>

F new.txt 파일의 마지막 줄에 새로운 텍스트가 추가되어 저장되었다.

F w 모드로 새로 열어서 내용을 추가하면 원래 있던 내용은 삭제되기 때문에 한 번 읽어서

내용을 변수에 저장하고 변수에 새로운 텍스트를 추가하여 저장한 것임

Page 117: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 117

파일 쓰기 시 폴더와 파일에 쓰기 권한 필수

서버에 파일을 쓸 때는 서버의 해당 폴더 및 해당 파일에 쓰기 권한이 부여되어 있어야 한다. 이는 파일 업로드

에서도 마찬가지이다. 단, Windows Desktop PC는 권한이 없어도 쓰기 가능

¡ file_get_contents() 함수

Ÿ file_get_contents() 함수는 서버의 파일을 읽어서 String으로 반환해준다.

Ÿ 이 함수는 같은 서버에 저장된 파일 뿐만 아니라 웹서버에 URL로 접근하여 콘텐츠를 문자

열로 읽어 올 수 있다.

Ÿ 이 함수는 이러한 특성 때문에 타 서버에서 제공하는 XML 또는 JSON 형식의 콘텐츠를 읽

어오는데 사용할 수 있다.

Ÿ 예제 – file_get_contents.php

<?php�

echo�file_get_contents("lorem.txt");�//lorea.txt�파일을�읽어서�출력

$url�=�"http://webskills.kr/test.php";

$test�=�file_get_contents($url);�//URL로부터�파일�읽어옴

$test�=�htmlspecialchars($test);�//HTML태그로�인식되지�않게�하기�위하여�특수�문자로�처리

echo�"<pre>"�.�$test�.�"</pre>";�//pre는�줄바꿈�등을�있는�그대로�표시

?>

Page 118: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 118

PHP MySQL Database

¡ PHP Database

Ÿ PHP는 MySql을 비롯하여 많은 데이터베이스 시스템을 지원한다.

Ÿ 그 중에서도 MySQL은 오랫동안 PHP와 함께 사용되어온 DB시스템이다.

Ÿ PHP에서 DB 사용하려면 연결, Query, 결과 활용 등의 작업 과정을 거친다.

Ÿ 연결 방법은 직접 MySQL에 연결하는 MySQLi extension이 있고 PDO와 같은

PHP Data Object를 통하여 연결하는 방법 등이 있다.

Ÿ Query는 SQL(Structured Query Language)을 통해서 DB에 명령을 전달함으로

써 읽고, 쓰고, 수정하고, 삭제하는 등의 작업을 수행한다.

Ÿ Query 결과는 다양한 형식의 결과로 반환되어 사용자 인터페이스를 구성하는

데 활용한다.

¡ MySQLi vs PDO

Ÿ MySQLi – 개선된 MySQL용 extention으로 오직 MySQL DB에만 사용할 수 있

다.

Ÿ PDO – MySQL을 포함하여 12개의 DB 시스템을 지원한다.

Ÿ MySQL만 사용할 경우에는 MySQLi를 사용해도 큰 문제가 없고 PDO와 비교해

서 성능이나 보안성의 차이도 크게 없고 둘 다 객체형식이라는 점에서 같다.

Ÿ 그러나 향후 다양한 종류의 DB 연결에 대비해서는 PDO를 사용하는 것이 좋을

수 있다. 이 교재에서는 PDO를 주로 설명할 것이다.

Ÿ MySQLi 이전에 사용된 MySQL extention은 PHP 5 이후에는 더 이상 사용되지

않아서 에러를 발생시킨다. 따라서 교재 등에 mysql_connect() 와 같이 mysql_

로 시작하는 함수를 사용하는 경우는 새로운 PHP 버전에서는 더 이상 사용되

Page 119: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 119

지 않음을 알고 더 이상 사용하지 않도록 해야 한다.

¡ MySQL 준비 – phpMyAdmin

Ÿ XAMPP를 설치하면 MySQL이 같이 설치되고 DB 활용을 위한 phpMyAdmin이

설치된다. phpMyAdmin은 PHP로 만들어진 MySQL 관리 도구이다.

F MySQL 관리도구에는 phpMyAdmin 외에도 MySQL Workbench, Navicat for MySQL,

Sequel Pro, HeidiSQL, SQLyog, SQLWave, dbForge Studio, DBTools Manager, MyDB

Studio 등이 있다.

Ÿ phpMyAdmin 열기

F XAMPP를 실행하고 웹 브라우저에서 다음 주소를 입력한다.

http://localhost/phpmyadmin

F XAMPP에서 phpMyAdmin으로 DB를 열면 root 사용자로 접속하게 된다. root 사용자는 최

고 관리자이며 기본적으로는 암호가 비어 있다.

F 그러나 실제 온라인의 서버들은 반드시 암호를 설정해야 하고 대부분은 그렇게 되어 있거

나 외부에서의 root 접속을 차단하고 있다.

Page 120: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 120

Ÿ DB 사용자 추가하기

F phpMyAdmin 페이지의 상단에서 사용자 계정 메뉴를 클릭한다.

F 사용자 계정 화면에서 사용자 추가를 클릭한다.

F 사용자 추가 화면에서 다음 항목을 입력한다.

① 사용자명 : phpuser

② 호스트명 : 로컬 – localhost

③ 암호 : 123456 재입력 : 123456

● 암호 생성 버튼은 자동으로 암호를 생성해주는데 여기서는 클릭하지 않는다.

F 위 항목을 입력했으면 사용자 추가 화면의 가장 밑에 있는 [실행] 버튼을 누른다.

F 사용자 추가 결과 화면을 확인하고 다시 사용자 계정 메뉴를 눌러 새로운 사용자가 정상적

으로 추가되었는지 사용자 개요(목록)에서 확인한다.

Page 121: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 121

Page 122: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 122

Ÿ 데이터베이스 추가하기

F phpMyAdmin 화면의 상단에서 데이터베이스 메뉴를 클릭한다.

F 새 데이터베이스 만들기 아래 입력상자에 phptest 라고 데이터베이스 이름을 입력하고 옆

Page 123: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 123

의 데이터 정렬방식 선택상자에서 utf8_general_ci(다국어, 대소문자 구분없음)를 선택한 후

[만들기] 버튼을 누른다.

F 위 화면에서 보면 phptest라는 데이터베이스가 만들어지고 새 테이블 만들기 페이지로 자

동 이동된 것을 볼 수 있다. 나중에 이 페이지에 다시 들어오려면 왼쪽 tree 메뉴의 DB 목

록에서 phptest를 선택하면 된다.

Ÿ 데이터베이와 사용자 연결하기

F 앞에서 phpuser 사용자를 만들었고, phptest DB를 생성했다. 사용자 phpuser에게 DB

phptest에 대한 관리 권한을 제공해보자.

* 물론 root 사용자로 로그인 하면 모든 DB에 연결가능하다.

F 데이터베이스에 사용자를 연결하기 위해 첫 페이지에서 다시 사용자 계정을 클릭하여 사용

자 목록으로 이동한다. 만일 phptest와 같은 DB를 선택한 상태라면 상단에 DB 하위 메뉴만

보이게 되므로 당황할 수 있다. 이 때는 상단의 서버: 127.0.0.1과 같은 링크를 클릭하거나

왼쪽 상단의 집 모양 버튼을 클릭하면 첫 화면으로 이동하고 여기서 사용자 계정 메뉴를

확인할 수 있다.

Page 124: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 124

F 목록에서 phpuser 사용자의 "권한 수정”을 클릭한다.

F 권한 수정 화면에서 [데이터베이스] 버튼 클릭 → phptest 선택 → [실행] 버튼 클릭

F 권한 수정: 사용자 계정 'phpuser'@'localhost' - 데이터베이스 phptest 화면에서 아래와 같

이 데이터베이스에 관한 권한 옆의 모두 체크를 체크하여 다른 모든 항목들이 체크되도록

한 후 화면 하단의 [실행] 버튼을 클릭한다.

Page 125: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 125

Ÿ 테스트용 Table 생성하기

F 예제를 위해서 아래와 같이 친구목록을 만들기 위한 테이블을 생성하자.

F 테이블 명 - friends

Page 126: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 126

① id – int, primary, autoincrement

② friendName – varchar, 20

③ friendAddress – varchar, 200

④ friendEmail – varchar, 50

⑤ friendPhone – varchar, 20

⑥ friendAge – int

F 테이블 생성은 DB 생성과 마찬가지로 phpMyAdmin으로도 할 수 있고 SQL Query문으로도

할 수 있다. 여기서는 먼저 phpMyAdmin으로 생성하고 SQL Query문으로 생성하는 방법도

알아보기로 하자.

F phpMyAdmin을 실행하고 왼쪽 목록에서 phptest 테이블을 선택한다.

F 화면에 새 테이블 만들기가 표시되면 이름에 friends를 입력하고 컬럼 수에 6을 입력한다.

처음에는 테이블이 없으므로 "데이터베이스에 테이블이 없습니다.”가 표시된다.

F 테이블 이름과 컬럼수를 입력했으면 오른쪽 아래에 있는 [실행] 버튼을 클릭한다.

F 첫 번째 컬럼의 이름에 id를 입력하고 int가 선택된 채로 두고 해당 항목의 A_I를 체크한다.

그러면 인덱스 추가 창이 표시된다. 여기서 다른 선택 없이 [실행] 버튼을 클릭한다. A_I는

Auto Increment로 id 컬럼이 자동 증가 된다는 것이며 PRIMARY는 기본 키기 되면 이렇게

Page 127: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 127

되면 중복되지 않고 별도로 값을 입력하지 않아도 자동으로 증가되는 컬럼이 생성된다. DB

에서 대부분의 테이블은 이런 id를 가져야 한다. int 형은 별도로 크기를 지정하지 않아도

자동으로 기본 크기(11)가 설정된다.

F 다음으로 나머지 컬럼들의 이름을

입력하고 종류를 선택하고 크기를

지정한다.

① friendName(VARCHA, 20)

② friendAddress(VARCHA, 200)

③ friendEmail(VARCHA, 50)

④ friendPhone(VARCHA, 20)

⑤ friendAge(INT) -

크기 별도 지정 필요 없음

F 위와 같이 설정하고 화면 하단의 [저

장] 버튼을 누르면 테이블이 생성된

다.

Page 128: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 128

F 위와 같이 테이블이 생성되었다. id에는 노란색 열쇠 아이콘이 붙어 있어 이 컬럼이

PRIMARY임을 표시하였다.

F 테이블 생성은 위에서 한 것처럼 phpMyAdmin으로 작업할 수도 있지만 SQL문을 실행시켜

서도 할 수 있다.

F 테이블 생성을 위한 SQL은 구조를 잘 아는 개발자라면 직접 작성할 수도 있고 자신이 없는

Page 129: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 129

경우에는 phpMyAdmin에서 내보내기를 통해서 확인할 수 있다.

F 내보내기를 통해서 테이블 생성 SQL문 내보내기를 하려면 먼저 데이터베이스 phptest를 선

택하고 테이블 friends를 선택한 후 화면 상단의 내보내기 메뉴를 클릭한다.

F 아래와 같이 "friends" 테이블 내보내기 화면이 나오면 하단의 [실행] 버튼을 누른다.

F 위 화면에서 [실행] 버튼을 누르면 friends.sql 파일이 (chrome의 경우 자동으로) 다운로드

된다. 이 파일을 텍스트 편집기로 열어보자.

F 이 파일에는 friends 테이블을 만들기 위한 SQL이 정의되어 있다. 만일 테이블에 삽입된 데

이터가 있었다면 insert 문으로 데이터를 넣을 수 있도록 SQL문이 추가되어 있을 것이다.

아직은 추가할 데이터가 없고 빈 테이블만 만든다.

F friends.sql

--�phpMyAdmin�SQL�Dump

--�version�4.7.0

--�https://www.phpmyadmin.net/

--

--�Host:�127.0.0.1

--�생성�시간:�18-01-01�06:29

--�서버�버전:�10.1.25-MariaDB

--�PHP�버전:�7.1.7

SET�SQL_MODE�=�"NO_AUTO_VALUE_ON_ZERO";

SET�AUTOCOMMIT�=�0;

Page 130: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 130

START�TRANSACTION;

SET�time_zone�=�"+00:00";

/*!40101�SET�@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT�*/;

/*!40101�SET�@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS�*/;

/*!40101�SET�@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION�*/;

/*!40101�SET�NAMES�utf8mb4�*/;

--

--�데이터베이스:�`phptest`

--

--�--------------------------------------------------------

--

--�테이블�구조�`friends`

--

CREATE�TABLE�`friends`�(

��`id`�int(11)�NOT�NULL,

��`friendName`�varchar(20)�NOT�NULL,

��`friendAddress`�varchar(200)�NOT�NULL,

��`friendEmail`�varchar(50)�NOT�NULL,

��`friendPhone`�varchar(20)�NOT�NULL,

��`friendAge`�int(11)�NOT�NULL

)�ENGINE=InnoDB�DEFAULT�CHARSET=utf8;

--

--�덤프된�테이블의�인덱스

--

--

--�테이블의�인덱스�`friends`

--

ALTER�TABLE�`friends`

��ADD�PRIMARY�KEY�(`id`);

--

--�덤프된�테이블의�AUTO_INCREMENT

--

--

--�테이블의�AUTO_INCREMENT�`friends`

--

ALTER�TABLE�`friends`

��MODIFY�`id`�int(11)�NOT�NULL�AUTO_INCREMENT;COMMIT;

/*!40101�SET�CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT�*/;

/*!40101�SET�CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS�*/;

/*!40101�SET�COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION�*/;

Page 131: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 131

F friends.sql문으로 테이블을 만들기 위해서 테이블을 삭제하고 SQL을 실행하는 테스트를 해

보자.

F 먼저 phpmyadmin에서 DB phptest를 선택하고 테이블 friends를 선택한 후 상단의 테이블

작업 메뉴를 클릭해보자.

F 그러면 테이블 이름 변경, 복사, 이동 등 여러 가지 작업을 위한 양식과 테이블 내용 비지

우기(TRUNCATE), 테이블 삭제(DROP) 링크 등이 표시된다.

F 위 화면에서 테이블 삭제(DROP)을 클릭하면 확인 창이 표시되고 [확인]을 클릭하면 테이블

이 삭제된다. 나중에 데이터가 있을 때는 매우 조심해야 할 작업이다.

F 위 화면을 보면 테이블 friends가 삭제되었음을 확인할 수 있다.

F 이제 앞서 저장한 SQL 파일을 사용해서 테이블을 생성해보자.

F 화면 외쪽의 phptest DB를 선택한 다음 상단의 메뉴에서 가져오기를 클릭한다.

F "phptest" 데이터베이스로 가져오기 화면에서 가져올 파일: 업로드 파일 옆의 [파일선택] 버튼

Page 132: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 132

을 클릭하여 저장된 friends.sql 파일을 선택한다.

F 파일을 선택 한 후 화면 하단의 [실행] 버튼을 클릭한다.

F 위와 같이 실행하고 나서 왼쪽에서 phptest DB를 선택하고 friends 테이블을 선택한 후 상

단의 구조를 클릭해보자. 아래 그림과 같이 앞에서 만든 테이블과 같은 구조의 테이블이 생

성되었음을 확인할 수 있다.

Page 133: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 133

Ÿ Table에 테스트용 데이터(seed data) 삽입하기

F 프로그램 테스트를 위해서는 테이블에 데이터를 삽입해둘 필요가 있다.

F 테이블에 데이터를 넣기 위해서는 SQL insert 문을 실행하거나 phpMyAdmin에서 삽입하는

방법이 있다. 그러나 대량의 데이터를 테스트 데이터로 넣기 위해서 phpMyAdmin을 이용

하는 것은 매우 불편한 일이다.

F 여기서는 phpMyAdmin을 사용해서 하나의 데이터를 삽입하는 연습을 해 본 후에 임시 데

이터를 대량으로 넣는 방법에 대해 설명할 것이다.

Ÿ phpMyAdmin을 통한 데이터 삽입

F phpMyAdmin에서 phptest DB를 선택하고 friends 테이블을 선택한 후 상단 메뉴에서 삽입

메뉴를 클릭한다. 데이터 삽입 화면에서 id를 제외하고 나머지 데이터를 삽입한다. id는 자

동으로 증가되는 값으로 입력된다. 이 페이지에는 데이터를 두 개 입력할 수 있도록 폼이

준비되어 있으나 하나만 입력해보자.

Page 134: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 134

F 위와 같이 데이터를 삽입하고 friends 테이블 선택 후 보기 메뉴를 클릭하면 아래와 같이

데이터가 삽입되어 있는 것을 확인할 수 있다.

Ÿ SQL문 생성을 통한 테스트 데이터 삽입

F https://www.generatedata.com/ 사이트에 접속한다. 이 사이트는 SQL, JSON, XML 등의

데이터를 자동으로 생성해주는 기능을 제공한다. Fake 데이터를 얻고자 한다면 유용하게

사용할 수 있다. 사이트에 들어가서 먼저 하단의 EXPORT TYPES를 선택한다.

Page 135: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 135

F 하단의 EXPORT TYPES에는 여러 내보내기 타입들이 있는데 여기서는 SQL문을 내보낼 것

이므로 SQL 탭을 선택한다. 그리고 아래 화면과 같이 다음 항목들을 설정한다.

① Database table name – friends

② Database Type – MySQL

③ Misc Options

Include CREATE TABLE query – 체크 제거(이미 테이블이 있으므로 생성 필요 없음)

Include DROP TABLE query – 체크 제거(이미 테이블이 있으므로 제거 필요 없음

Enclose table and field names with backquotes – 체크함(테이블, 필드 이름을 따옴표로

감쌀지 설정)

④ Statement Type – INSERT 체크

⑤ INSERT batch size – 10, 하나의 insert문에 몇 개의 데이터를 삽입할지 정의

⑥ Primary Key - Add default auto-increment column 체크(자동증가할 id 컬럼 추가됨)

Page 136: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 136

F 위 그림에서 Generate 100 rows가 있는데 이는 전체 100개의 줄(데이터)를 추가하도록 설

정한 것이다. 만인 다를 숫자의 데이터를 추가하려면 여기에서 숫자를 조정하면 된다.

F 그 옆에 결과를 어떻게 보여줄지 선택하도록 되어 있는데 Generate in-page는 현재 페이지

가 바뀌면서 생성된 SQL문을 보여준다. New window/tab은 새 창 또는 새 탭에 결과를 보

여주고, Prompt to download는 저장할지 묻도록 한다. 여기서는 Prompt to download를

체크하여 파일을 다운로드 하도록 하자.

F Generate 버튼은 나중에 DATA SET 설정을 마친 후 클릭하면 위 설정에 따른 작업을 하도

록 해준다.

F DATA SET 설정 – 이 부분은 데이터 컬럼 정보와 데이터 추출 방법을 지정하는 부분이다.

여기에서 컬럼 이름과 데이터 타입 그리고 추가 옵션을 설정한다.

F 이제 friends 테이블에 입력할 DATA SET을 설정해보자.

F 먼저 id를 제외하고 추가할 컬럼 수가 5개 이므로 DATA SET 영역 아래의 Add 1 Rows 버

튼을 클릭해 컴럼을 하나 추가한다.

Page 137: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 137

F friendName 컬럼 추가

① 첫 번째 Table Column 에 friendName 입력

② Select Data Type에서 Human Data → Names 선택

③ Examples에서 Alex(any gender) 선택

F friendAddress 컬럼 추가

① 두 번째 Table Column에 friendAddress 입력

② Select Data Type에서 Text → Fixed Number of Words 선택 → 5 words 입력

③ Options의 단어수(words)에서 5 입력

F friendEmail 컬럼 추가

① 세 번째 Table Column에 friendEmail 입력

② Select Data Type에서 Human Data → Email 선택

F friendPhone 컬럼 추가

① 네 번째 Table Column에 friendPhone 입력

② Select Data Type에서 Human Data → Phone / Fax 선택

③ Examples에서 Different formats 선택

④ Options에서 모두 지우고 xxx-xxxx-xxxx 입력

F friendAge 컬럼 추가

① 다섯번 번째 Table Column에 friendAge 입력

② Select Data Type에서 Numeric → Number Range 선택

③ Options에서 Between 15 and 30 입력

Page 138: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 138

F 데이터 생성 – 위와 같이 하고 하단의 Generate 버튼을 누르면 sql 파일이 다운로드 될 것

이다.

F 위의 과정을 통해서 다운로드 받은 SQL 파일을 열어보면 insert문에 100개의 데이터를 추

가하도록 작성되어 있다. 이제 할 일은 이 SQL문을 DB 테이블에 가져오는 것이다.

F phpMyAdmin에서 phptes DB에서 friends 테이블을 선택하고 상단의 가져오기 메뉴를 클릭

하여 위에서 다운로드 받은 sql 파일을 업로드 하고 화면 하단의 [실행] 버튼을 클릭해보자.

Page 139: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 139

F 위와 같이 sql을 가져온 후 보기 메뉴에 들어가 보면 100개의 새로운 데이터가 추가되어

있음을 확인할 수 있다.

Page 140: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 140

¡ MySQL에 연결하기

Ÿ PHP에서 MySQL을 사용하는 방법에는 PDO, MySQLi가 있다.

Ÿ MySQLi는 PHP 5 이하 버전까지 사용하던 MySQL과 유사하게 사용하는 절차

적(procedural) 방법과 PDO처럼 객체지향(object-oriented) 사용방법을 제공한

다. 예전의 MySQL extention에 익숙한 사용자라면 MySQLi를 객체지향형으로

사용하는 것보다 절차적 방법으로 사용하는 것이 편할 수도 있다. 따라서 여기

에서는 절차적 방법으로 설명할 것이다.

Ÿ MySQLi를 사용한 DB 연결

<?php�

$host�=�"localhost";�//DB�서버�주소(또는�127.0.0.1)

$dbuser�=�"phpuser";�//DB�사용자�

$userpw�=�"123456";�//DB�사용자�패스워드

$dbname�=�"phptest";�//사용할�DB�이름

//MySQLi�DB�연결�생성�

$dbconn�=�mysqli_connect($host,�$dbuser,�$userpw,�$dbname�);

//연결�성공�여부�체크

if(�!�$dbconn�)�{

�//연결이�실패했다면�메시지를�출력하고�더�이상의�스크립트�실행을�중단한다.�

�die(�"DB�연결�실패:�"�.�mysqli_connect_error()�);

}

//DB�연결이�성공했다면�위에서�die�되지�않으므로�다음�줄�실행

echo�"DB�연결�성공";

mysqli_close($dbconn);�//DB�사용이�끝나면�MySQLi�연결을�닫아준다.

?>

F DB 연결정보가 맞다면 "DB 연결 성공” 메시지가 화면에 표시된다.

F 만일, 호스트이름이나 사용자이름 비밀번호를 다르게 쓰거나 없는 DB를 연결하고자 한다면

다음과 같이 에러가 나올 것이다. 에러메시지는 상황에 따라 다르게 나온다.

Page 141: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 141

Ÿ PDO를 사용한 DB 연결

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$userpw�=�"123456";

$dbname�=�"phptest";

//PDO�DB�연결�생성

//try�{�}�catch()�{}는�예외처리�방법으로�에러�발생에�대한�대응을�할�수�있다.�

try�{

�$dbconn�=�new�PDO("mysql:host=$host;dbname=$dbname",�$dbuser,�$userpw);�

�echo�"DB�연결�성공";

}�catch(PDOException�$exeption)�{

�echo�"DB�연결�실패:�"�.�$exeption->getMessage();�//$exeption->getMessage()는�예외�메시지

}�

$dbconn�=�null;�//DB�작업이�끝나면�PDO�연결을�종료한다.�

?>

F DB 연결정보가 맞다면 "DB 연결 성공” 메시지가 화면에 표시된다.

F 만일, 호스트이름이나 사용자이름 비밀번호를 다르게 쓰거나 없는 DB를 연결하고자 한다면

다음과 같이 에러가 나올 것이다. 에러메시지는 상황에 따라 다르게 나온다.

F PDO에서 try{ } catch( ){ } 를 사용한 예외처리를 하지 않으면 어떻게 될까? 다음의 코드를

보자. try{ } catch( ){ }를 사용하지 않았다. 그리고 패스워드를 생략했다.

Page 142: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 142

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$userpw�=�"";

$dbname�=�"phptest";

$dbconn�=�new�PDO("mysql:host=$host;dbname=$dbname",�$dbuser,�$userpw);�

?>

F 위 코드를 실행하면 다음과 같은 에러메시지가 표시된다.

F 위와 같은 상세한 에러메시지는 해커들에게는 손쉬운 해킹 소재가 될 수 있다. 따라서 반드

시 PDO를 사용할 때 try{ } catch( ){ }를 사용한 예외처리를 해주는 것이 좋다.

¡ MySQL 데이터 읽기 - SELECT

Ÿ 앞에서 만들어둔 phptest DB의 friends 테이블의 데이터를 읽어들이려면

SELECT 구문을 사용해야 한다. MySQLi, PDO 두 가지 방법으로 알아보자.

Ÿ MySQLi Table SELECT

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$dbpass�=�"123456";

$dbname�=�"phptest";

//MySQLi�DB�연결�생성�

$dbconn�=�mysqli_connect($host,�$dbuser,�$dbpass,�$dbname�);

//mysqli�연결의�문자셋을�utf8로�설정

//한글이�포함된�경우�반드시�설정

mysqli_set_charset($dbconn,"utf8");�

//연결�성공�여부�체크

if(�!�$dbconn�)�{

�//연결이�실패했다면�메시지를�출력하고�더�이상의�스크립트�실행을�중단한다.�

�die(�"DB�연결�실패:�"�.�mysqli_connect_error()�);

Page 143: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 143

}

$sql��=�"SELECT�*�FROM�friends";�//friends�테이블의�모든�데이터를�가져옴

$result�=�mysqli_query($dbconn,�$sql);�//쿼리문을�실행해서�결과를�$result에�저장함

//Query문을�실행한�결과�행의�갯수가�0보다�크면,�즉�1이상이면

if(�mysqli_num_rows($result)�>�0�)�{

�//DB�Record�Set�객체인�$result의�값을�하나씩�추출해서

�//$row에�대입하는�반복문

�//assoc는�$row['id']�와�같이�필드�이름으로�값을�가져오기�위함

��while(�$row�=�mysqli_fetch_assoc($result)�)�{

���echo�"id:�{$row['id']}";

���echo�",�name:{$row['friendName']}";

���echo�",�addr:{$row['friendAddress']}";

���echo�",�phone:{$row['friendPhone']}";

���echo�",�age:{$row['friendAge']}<br>";

��}

}

mysqli_close($dbconn);�//DB�사용이�끝나면�닫아준다.

?>

Ÿ PDO Table SELECT

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$userpw�=�"123456";

$dbname�=�"phptest";

//PDO�DB�연결�생성

try�{

�//charset=utf8�추가,�한글�사용을�위해서는�반드시�추가해야�함.�

�$dbconn�=�new�PDO("mysql:host=$host;dbname=$dbname;charset=utf8",�$dbuser,�$userpw);�

}�catch(PDOException�$exeption)�{

�echo�"DB�연결�실패:�"�.�$exeption->getMessage();

}�

$sql��=�"SELECT�*�FROM�friends";

//PDO는�prepare를�제공하여�쿼리�실행�전�오류를�제거할�수�있도록�한다

//prepare는�DB�injection�공격�방어를�위해서�유용하다.�

$stmt�=��$dbconn->prepare($sql);

$stmt->execute();

$result�=�$stmt->fetchAll(PDO::FETCH_ASSOC);

Page 144: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 144

foreach($result�as�$row)�{

��echo�"id:�{$row['id']}";

��echo�",�name:{$row['friendName']}";

��echo�",�addr:{$row['friendAddress']}";

��echo�",�phone:{$row['friendPhone']}";

��echo�",�age:{$row['friendAge']}<br>";

}

$dbconn�=�null;�//DB�작업이�끝나면�PDO�연결을�종료한다.

?>

¡ MySQL 데이터 읽기 개수 제한하기 - LIMIT

Ÿ 위의 MySQLi, PDO SELECT 예제는 테이블에 저장된 모든 레코드(행)을 읽어들

여 화면에 보여주었다.

Ÿ 그러나 실제로는 모든 데이터를 한꺼번에 열지는 않는다. 대개 몇 개로 제한해

서 불러옴으로써 서버에 대한 부하를 줄이고 네트워크 전송의 양을 줄인다.

Ÿ 이와 같이 개수를 제한하기 위해서는 간단히 SELECT 문의 끝에 LIMIT를 붙여

서 숫자를 제한하면 된다. 이는 PDO, MySQLi 어떤 방식이든 똑같이 적용된다.

Ÿ 처음 10개만 추출하기

SELECT�*�FROM�friends�LIMIT�10

Page 145: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 145

Ÿ 위 코드는 다음과 같다. 즉 첫 번째(0) 레코드로부터 10개를 추출한다.

SELECT�*�FROM�friends�LIMIT�0,�10

Ÿ 처음 10개 다음의 10개 추출하기

SELECT�*�FROM�friends�LIMIT�10,�10

Ÿ 이와 같이 추출 개수를 제한하는 것은 게시판 등에서 페이지네이션

(pagination)을 구현하는데 사용된다.

¡ MySQL 데이터 정렬 순서 – ORDER BY

Ÿ 표준 SQL문에서는 ORDER BY를 사용해 데이터의 정렬 순서를 별도로 설정할

수 있다. 정렬 기준은 하나 이상의 컬럼을 기준으로 설정하며 각각 오름차순

(ASC), 내림차순(DESC) 정렬할 수 있다. ASC 또는 DESC를 지정하지 않으면 기

본적으로 ASC 즉 오름차순 정렬된다. 정렬 기준 컬럼이 하나보다 많을 때는 쉽

Page 146: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 146

표로 구분하여 추가하되 먼저 정의된 컬럼(왼쪽부터)부터 적용된다.

Ÿ 예제 – friendAge기준 내림차순 정렬하고 friendAge 값이 같은 경우

friendName 기준 오름차순 정렬한다. 즉 나이가 많은 순부터 적은 순으로 정렬

하면서 나이가 같은 경우 알파벳 오름차순 순으로 정렬한다.

SELECT�*�FROM�friends�ORDER�BY�age�DESC,�name�ASC�LIMIT�0,�10

F 위 결과를 보면 33세부터 10, 9 순으로 나이 기준 내림차순 정렬되었고, 나이가 10으로 같

은 경우 Brent, Elvis, Grady, Lacota, Suki와 같이 이름 기준 오름차순 정렬되었다.

F ORDER BY는 LIMIT 앞에 사용되어야 하며 이 순서는 바뀔 수 없다.

¡ MySQL 데이터 검색 조건 – WHERE

Ÿ 표준 SQL에서는 SELECT, UPDATE, DELETE 등의 데이터 처리에서 조건을 지정

할 수 있다. SQL에서의 조건은 FROM dbname 뒤 WHERE 절 이하에 사용된다.

Ÿ 예제 1 – 나이가 10보다 큰 데이터 추출

SELECT�*�FROM�friends�WHERE�friendAge�>�10

Page 147: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 147

Ÿ 예제 2 – 이름이 Simon 인 데이터 추출

SELECT�*�FROM�friends�WHERE�friendName�=�'Simon'

Ÿ 예제 3 – 이름에 b 가 포함된 데이터 추출

SELECT�*�FROM�friends�WHERE�friendName�LIKE�'%b%'

F 이름에 알파벳 b가 포함된 레코드를 검색하면서 대소문자 구분은 하지 않았다.

F LIKE 뒤에 문자열 검색 시 %는 검색어의 위치에 대한 설정이다.

F ‘%b’와 같이 하면, 끝 글자가 b인 데이터를, ‘b%’는 시작 글자가 b인 데이터를 ‘%b%’는 위

치가 어디이든 b가 포함된 글자를 검색해준다.

Ÿ 예제 4 – AND 조건 검색 : 나이가 5보다 크고 이름에 a가 포함된 데이터 검색

SELECT�*�FROM�friends�WHERE�friendName�LIKE�'%b%'�AND�friendAge�>�5

Ÿ 예제 5 – OR 조건 검색 : 이름에 a 또는 b가 포함된 데이터 검색

SELECT�*�FROM�friends�WHERE�friendName�LIKE�'%a%'�OR��friendName�LIKE�'%b%'

Page 148: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 148

Ÿ 예제 6 – AND, OR 혼합 검색 : 이름에 a 또는 b가 포함되고 나이는 5세에서

7세 사이인 데이터 검색

SELECT�*�FROM�friends�WHERE�(friendName�LIKE�'%a%'�OR��friendName�LIKE�'%b%')�AND�

(friendAge�>=�5�AND�friendAge�<=�7)

F 위 예제는 (friendName LIKE '%a%' OR friendName LIKE '%b%') 조건과 또 다른 조건

(friendAge >= 5 AND friendAge <= 7)를 동시에 만족하는 데이터를 추출한다.

F 만일 이 두 조건 사에에 AND 대신에 OR가 쓰여졌다면 데이터는 훨씬 더 많은 결과를 추

출하게 될 것이다.

¡ MySQL 데이터 삽입하기 – INSERT INTO

Ÿ 표준 SQL에서 데이터를 삽입하려면 INSERT INTO를 사용한다.

Ÿ 기본 문법

INSERT�INTO�table_name�(column1,�column2,�column3,...)

VALUES�(value1,�value2,�value3,...)

Page 149: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 149

Ÿ SET 사용 문법

INSERT�INTO�table_name�SET�column1�=�value1,�column2�=�value2,�column3�=�value3

F 위의 SET 사용 문법은 데이터를 UPDATE하는 것과 유사하다. 이러한 사용법은 때로는 개발

자들이 조건에 따라 데이터 삽입여부를 결정하는 등 유연성을 제공하며 MySQL 사이트에서

5.5 버전부터 이와 같은 구문을 지원하는 것으로 확인된다.

https://dev.mysql.com/doc/refman/5.5/en/insert.html

Ÿ MySQLi - 데이터 삽입하기 예제

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$dbpass�=�"123456";

$dbname�=�"phptest";

$dbconn�=�mysqli_connect($host,�$dbuser,�$dbpass,�$dbname�);�//MySQLi�DB�연결�생성

//mysqli�연결의�문자셋을�utf8로�설정,�한글이�포함된�경우�반드시�설정

mysqli_set_charset($dbconn,"utf8");�

//연결�성공�여부�체크

if(�!�$dbconn�)�{

�//연결이�실패했다면�메시지를�출력하고�더�이상의�스크립트�실행을�중단한다.�

�die(�"DB�연결�실패:�"�.�mysqli_connect_error()�);

}

$sql��=�"INSERT�INTO�friends(id,�friendName,�friendAddress,�friendEmail,�friendPhone,�friendAge)�

VALUES(NULL,�'박철수',�'대전광역시�중구�문화동�1234',�'[email protected]',�'010-7777-8888',�41)";

if(�mysqli_query($dbconn,�$sql)�)�{

�if(�$newid�=�mysqli_insert_id($dbconn)�)�{

��echo�"id:�$newid,�{$sql}";�//데이터�삽입이�성공하면�마지막�입력한�레코드�id와�$sql을�출력

�}

}

mysqli_close($dbconn);�//DB�사용이�끝나면�닫아준다.

?>

Page 150: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 150

Ÿ PDO - 데이터 삽입하기 예제

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$userpw�=�"123456";

$dbname�=�"phptest";

//PDO�DB�연결�생성

try�{

�//charset=utf8�추가,�한글�사용을�위해서는�반드시�추가해야�함.�

�$dbconn�=�new�PDO("mysql:host=$host;dbname=$dbname;charset=utf8",�$dbuser,�$userpw);�

}�catch(PDOException�$exeption)�{

�die("DB�연결�실패:�"�.�$exeption->getMessage());

}�

$sql��=�"INSERT�INTO�friends(id,�friendName,�friendAddress,�friendEmail,�friendPhone,�friendAge)�

VALUES(NULL,� '김영철',� '서울특별시�중구�을지로� 6가� 123',� '[email protected]',� '010-1111-2222',�

25)";

if(�$stmt�=�$dbconn->prepare($sql)�)�{

�if(�$result�=�$stmt->execute()�)�{

��if(�$newid�=�$dbconn->lastInsertId()�)�{

���echo�"id:�$newid,�{$sql}";�//마지막에�추가한�데이터의�id와�$sql을�출력

��}

�}

}

$dbconn�=�null;�//DB�작업이�끝나면�PDO�연결을�종료한다.

?>

Ÿ SET을 사용한 INSERT INTO 구문 작성

F 위 MySQLi나 PDO 모두 데이터를 삽입하기 위해서 같은 SQL문을 사용하였다.

INSERT� INTO� friends(id,� friendName,� friendAddress,� friendEmail,� friendPhone,� friendAge)�

VALUES(NULL,�'박철수',�'대전광역시�중구�문화동�1234',�'[email protected]',�'010-7777-8888',�41)

Page 151: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 151

INSERT� INTO� friends(id,� friendName,� friendAddress,� friendEmail,� friendPhone,� friendAge)�

VALUES(NULL,�'김영철',�'서울특별시�중구�을지로�6가�123',�'[email protected]',�'010-1111-2222',�25)

F 위 두 SQL문은 각각 다음과 같이 바꿔서 실행할 수 있다.

INSERT� INTO� friends� SET� id=NULL,� friendName='박철수',� friendAddress='대전광역시� 중구� 문화동�

1234',�friendEmail='[email protected]',�friendPhone='010-7777-8888',�friendAge=41

INSERT�INTO�friends�SET�id=NULL,�friendName='김영철',�friendAddress='서울특별시�중구�을지로�6가�

123',�friendEmail='[email protected]',�friendPhone='010-1111-2222',�friendAge=25

F 위 SET을 활용한 SQL 구문은 다음과 같이 PHP의 문자열 연산자를 사용해서 여러 줄로 구

성할 수 있다. 이런 구성은 나중에 코드 구성에서 보다 유연한 조건처리 등을 쉽게 코드로

구현할 수 있게 해준다.

$sql�=�"INSERT�INTO�friends�SET�";

$sql�.=�"id=NULL";

$sql�.=�",�friendName='아파치'";

$sql�.=�",�friendAddress='Apache�City,�Open�Source,�WEB'";

$sql�.=�",�friendEmail='[email protected]'";

$sql�.=�",�friendPhone='123-456-7890'";

$sql�.=�",�friendAge=55";

¡ MySQL 데이터 수정하기 – UPDATE

Ÿ 표준 SQL에서 데이터 수정은 UPDATE 구문으로 처리할 수 있다.

Ÿ UPDATE는 대개 중복되지 않는 고유의 킷값을 기준으로 데이터를 대상으로 하

여 처리하는데 WHERE 절을 사용한다.

Ÿ 만일 조건을 지정하지 않고 UPDATE를 실행하면 테이블의 모든 레코드가 지정

한 값으로 UPDATE된다. 의도한 작업이 아닌 한 각별히 주의해야 할 작업이다.

Page 152: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 152

Ÿ UPDATE 문법

UPDATE�table_name

SET�column1=value,�column2=value2,...

WHERE�some_column=some_value�

Ÿ 예제 – 모든 friend의 나이(friendAge)를 1씩 더해서 저장하기

<?php�

include("dbcon_mysqli.php");�//MySQLi�DB�연결�코드를�별도의�파일로�저장하여�include

$sql�=�"UPDATE�friends�SET�friendAge=friendAge+1";

if(�mysqli_query($dbconn,�$sql)�)�{

�$rowcount�=�mysqli_affected_rows($dbconn);

�echo�"모두�{$rowcount}개의�레코드가�변경되었습니다.";

}

mysqli_close($dbconn);�//DB�사용이�끝나면�닫아준다.

?>

F 위 코드를 실행하면 아래 첫 번째 그림의 줄들의 끝에 보이는 age 옆의 숫자가 두 번째 그

림에서처럼 1씩 증가되어 있다. 위 코드를 실행할 때마다 숫자는 증가될 것이다.

Page 153: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 153

F dbcon_mysqli.php – 앞으로 MySQLi DB 연결 파일에 include 할 파일

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$dbpass�=�"123456";

$dbname�=�"phptest";

//MySQLi�DB�연결�생성�

$dbconn�=�mysqli_connect($host,�$dbuser,�$dbpass,�$dbname�);

//mysqli�연결의�문자셋을�utf8로�설정

//한글이�포함된�경우�반드시�설정

mysqli_set_charset($dbconn,"utf8");�

//연결�성공�여부�체크

if(�!�$dbconn�)�{

�//연결이�실패했다면�메시지를�출력하고�더�이상의�스크립트�실행을�중단한다.�

�die(�"DB�연결�실패:�"�.�mysqli_connect_error()�);

}

?>

Ÿ 예제 – 특정 id 검색해서 주소 변경하기

Page 154: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 154

<?php�

include("dbcon_pdo.php");

$sql��=�"UPDATE�friends�SET�friendName='새이름'�WHERE�id=2";

$stmt�=��$dbconn->prepare($sql);

$stmt->execute();

$rowcount�=�$stmt->rowCount();

echo�"모두�{$rowcount}개의�레코드가�변경되었습니다.";

$dbconn�=�null;�//DB�작업이�끝나면�PDO�연결을�종료한다.

?>

F dbcon_pdo.php - 앞으로 PDO DB 연결 파일에 include 할 파일

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$userpw�=�"123456";

$dbname�=�"phptest";

//PDO�DB�연결�생성

try�{

�//charset=utf8�추가,�한글�사용을�위해서는�반드시�추가해야�함.�

�$dbconn�=�new�PDO("mysql:host=$host;dbname=$dbname;charset=utf8",�$dbuser,�$userpw);�

}�catch(PDOException�$exeption)�{

�die("DB�연결�실패:�"�.�$exeption->getMessage());

}�

?>

Page 155: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 155

Ÿ 예제 – 모든 friend의 나이가 20으로 일괄 변경

<?php�

include("dbcon_mysqli.php");

$sql�=�"UPDATE�friends�SET�friendAge=20";

if(�mysqli_query($dbconn,�$sql)�)�{

�$rowcount�=�mysqli_affected_rows($dbconn);

�echo�"모두�{$rowcount}개의�레코드가�변경되었습니다.";

}

mysqli_close($dbconn);�//DB�사용이�끝나면�닫아준다.

?>

F 모든 레코들의 friendAge 값이 20으로 변경되어 있다.

Ÿ 예제 – 특정 문자열을 찾아서 다른 문자로 치환하여 UPDATE

<?php�

include("dbcon_pdo.php");

//friendName�컬럼에�포함된�'i'�문자를�'아이'로�치환하여�UPDATE

$sql��=�"UPDATE�friends�SET�friendName=REPLACE(friendName,�'i',�'아이')";

Page 156: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 156

$stmt�=��$dbconn->prepare($sql);

$stmt->execute();

$rowcount�=�$stmt->rowCount();

echo�"모두�{$rowcount}개의�레코드가�변경되었습니다.";

$dbconn�=�null;�//DB�작업이�끝나면�PDO�연결을�종료한다.

?>

F friendName 컬럼에 포함된 모든 ‘i’가 ‘아이’로 변경됨

¡ MySQL 데이터 삭제하기 – DELETE

Ÿ 표준 SQL에서 데이터 수정은 DELETE 구문으로 처리할 수 있다.

Ÿ DELETE는 대개 중복되지 않는 고유의 킷값을 기준으로 데이터를 대상으로 하

여 처리하는데 WHERE 절을 사용한다.

Ÿ 만일 조건을 지정하지 않고 DELETE를 실행하면 테이블의 모든 레코드가 삭제

된다. 의도한 작업이 아닌 한 각별히 주의해야 할 작업이다.

Ÿ DELETE 문법

DELETE�FROM�table_name

WHERE�some_column�=�some_value�

Page 157: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 157

Ÿ 예제 – 선택한 id의 레코드 삭제

<?php�

include("dbcon_pdo.php");

//id가�1인�데이터를�모두�삭제

$sql��=�"DELETE�FROM�friends�WHERE�id=1";

$stmt�=��$dbconn->prepare($sql);

$stmt->execute();

$rowcount�=�$stmt->rowCount();

echo�"모두�{$rowcount}개의�레코드가�삭제되었습니다.";

$dbconn�=�null;�//DB�작업이�끝나면�PDO�연결을�종료한다.

?>

Ÿ 예제 – 조건에 따라 레코드 삭제

<?php�

include("dbcon_mysqli.php");

//나이가�1보다�작은�데이터를�모두�삭제

$sql�=�"DELETE�FROM�friends�WHERE�friendAge�<�1";

if(�mysqli_query($dbconn,�$sql)�)�{

�$rowcount�=�mysqli_affected_rows($dbconn);

�echo�"모두�{$rowcount}개의�레코드가�삭제되었습니다.";

}

mysqli_close($dbconn);�//DB�사용이�끝나면�닫아준다.

?>

Ÿ 예제 – 모든 레코드 삭제 : 조건을 지정하지 않으면 모두 삭제

DELETE�FROM�friends

F 위와 같이 삭제하면 모든 레코드가 삭제되기는 하지만 자동증가 번호(Auto Increment)는

변함이 없다. 예를 들어 마지막 번호가 105였다면 위와 같은 SQL문으로 모두 삭제한 다음

에도 새로운 레코드르르 추가하면 106부터 시작하게 된다.

F 자동증가 번호도 초기화 하고 간단하게 테이블의 레코드를 삭제하려면 다음과 같이

TRUNCATE를 사용하면 된다.

TRUNCATE�TABLE�friends

Page 158: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 158

¡ MySQL DB 보안

Ÿ MySQL DB 작업을 할 때 예를 들어 Form에서 사용자가 정보를 입력하고 서버

에 전송해서 이를 DB에 반영할 때 해커나 불순한 의도를 가진 이들에 의해서

의도하지 않은 결과를 야기할 수 있다.

Ÿ DB에서 보안을 유지해야 할 경우는 크게 두 가지가 있는데 다음과 같다.

① XSS(Cros Site Scripting) 공격 – Script 삽입 공격

② Injection 공격 – DB에 의도하지 않은 Query 삽입하여 공격

Ÿ 위 두 유형의 공격 중에서 첫 번째 XSS 공격은 앞에서 Form 부분에서 다룬적

이 있다. Injection 공격은 DB 수준에서 방어해야 하는데 PHP 코드와 DB 코드

에서 방어할 수 있다.

Ÿ PDO와 MySQLi

Ÿ Injection 공격 사례 – view.php

<?php�

include("dbcon_pdo.php");

$id�=�"";

if(�isset($_POST['id'])�)�{

�$id�=�$_POST['id'];

}

?>

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="UTF-8">

�<title>Injection�Test</title>

</head>

<body>

�<div>

��<form�action="view.php"�method="POST">

���<input�type="text"�name="id"�id="id"�value="<?php�echo�$id;?>">

���<input�type="submit"�value="보기">

��</form>

�</div>

<?php

if(�$id�)�{

�$sql��=�'SELECT�*�FROM�friends�WHERE�id='�.�$id;

�echo�$sql;

Page 159: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 159

�$dbconn->query($sql);

}

?>

</body>

</html>

<?php�$dbconn=null;�?>

F 위 코드는 검색 폼에 id 번호를 입력하고 [보기] 버튼을 누르면 열면 입력한 id를 가진 데이

터를 추출해서 화면에 출력해주는 코드이다. 그런데 만일 id를 다음과 같이 입력하면 어떻

게 될까? 아래 결과를 보면 모든 레코드들이 사라져 있다.

1;DELETE�FROM�friends

F 위와 같은 문제는 Query를 실행할 때 데이터를 검증할 어떤 장치도 마련하지 않았기 때문

이다.

F 1;DELETE FROM friends를 입력한 쿼리는 다음과 같이 되었다.

Page 160: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 160

SELECT�*�FROM�friends�WHERE�id=1;�DELETE�FROM�friends

F 세미콘론 ; 은 Query문에서 하나의 문장을 끝내고 다른 문장을 시작하는 의미이기 때문에

먼저 ELECT * FROM friends WHERE id=1을 실행하고 DELETE FROM friends 코드를 이어

서 실행하므로 모든 데이터를 삭제하게 된 것이다.

F 또한 id는 숫자이어야 하는데 문자열을 그대로 받아들여서 Query문에 그대로 넣었기 때문

에 ; DELETE FROM friends 같은 코드를 거를 수 없었던 것이다.

F 이와 같은 문제를 방어하려면 다음과 같이 해야 한다.

Ÿ Injection 공격 방어 코드 사례 – safe_view_pdo.php

<?php�

include("dbcon_pdo.php");

$id�=�"";

if(�isset($_POST['id'])�)�{

$id�=�$_POST['id'];

}

?>

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="UTF-8">

�<title>Injection�Test</title>

</head>

<body>

�<div>

��<form�action="safe_view.php"�method="POST">

���<input�type="text"�name="id"�id="id"�value="<?php�echo�$id;?>">

���<input�type="submit"�value="보기">

��</form>

�</div>

<?php

if(�$id�)�{

�$sql��=�"SELECT�*�FROM�friends�WHERE�id=:id";

�$stmt�=��$dbconn->prepare($sql);

�$stmt->bindParam(":id",�$id,�PDO::PARAM_INT);

�$stmt->execute();

�$row�=�$stmt->fetch(PDO::FETCH_ASSOC);

�if(�$row�)�{

���echo�"id:�{$row['id']}";

���echo�",�name:{$row['friendName']}";

���echo�",�addr:{$row['friendAddress']}";

���echo�",�phone:{$row['friendPhone']}";

���echo�",�age:{$row['friendAge']}<br>";

�}

Page 161: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 161

}

?>

</body>

</html>

<?php�$dbconn=null;�?>

F prepare, bindParam, execute 과정을 거치면서 데이터는 검증되었고 그 결과 1;DELETE

FROM friends 와 같은 코드에서 ;DELETE FROM friends는 실행되지 않았다.

Ÿ Injection 공격 방어 코드 사례 – safe_view_mysqli.php

<?php�

include("dbcon_mysqli.php");

$id�=�"";

if(�isset($_POST['id'])�)�{

$id�=�$_POST['id'];

}

?>

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="UTF-8">

�<title>Injection�Test</title>

</head>

<body>

�<div>

��<form�action="safe_view_mysqli.php"�method="POST">

���<input�type="text"�name="id"�id="id"�value="<?php�echo�$id;?>">

���<input�type="submit"�value="보기">

��</form>

�</div>

<?php

if(�$id�)�{

�$sql��=�"SELECT�*�FROM�friends�WHERE�id=?";

�$stmt�=��mysqli_prepare($dbconn,�$sql);

�$stmt->bind_param('s',�$id);

�$stmt->execute();

�$result�=�$stmt->get_result();

�$row�=�mysqli_fetch_assoc($result);

Page 162: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 162

�if(�$row�)�{

���echo�"id:�{$row['id']}";

���echo�",�name:{$row['friendName']}";

���echo�",�addr:{$row['friendAddress']}";

���echo�",�phone:{$row['friendPhone']}";

���echo�",�age:{$row['friendAge']}<br>";

�}

}

?>

</body>

</html>

<?php�mysqli_close($dbconn);�?>

F MySQLi에서도 PDO와 마찬가지로 mysqli_prepare, bind_param execute 과정을 거치면서

데이터는 검증되었고 그 결과 1;DELETE FROM friends 와 같은 코드에서 ;DELETE FROM

friends는 실행되지 않았다.

¡ MySQL DB 추가 정보

Ÿ MySQL 데이터베이스를 다루는데 필요한 대부분의 지식은 표준 SQL문을 이해

하는 것이다. 표준 SQL문을 이해하면 두 개 이상의 테이블을 하나로 합치는데

필요한 JOIN이나 다양한 조건검색 등을 구현할 수 있다.

Ÿ 따라서 DB를 보다 자유자재로 사용하고자 한다면 반드시 SQL에 대한 추가 학

습이 필요하다.

Ÿ 또한 DB를 다룰 때 가장 중요시 해야 하는 것 중 하나가 Injection 공격 방어이

다.

Ÿ SQL 학습 관련 링크

F https://www.w3schools.com/sql/default.asp

Ÿ Injection 방어 링크

F http://packetcode.com/article/preventing-sql-injection-php-security

Page 163: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 163

PHP 그래픽(GD)

¡ GD란?

Ÿ GD는 Graphics Draw로 PHP에서 그래픽 요소를 생성하거나 다룰 수 있도록 제

공하는 라이브러리이다.

Ÿ GD Library에서 지원하는 그래픽 포맷은 다음과 같다.

형식 읽기 지원 쓰기 지원 비고JPEG 예 예  

PNG 예 예  

GIF 예 예 GD 2.0.28 과 PHP 5.0.1에서 사용 가능

XBM 예 예  

XPM 예 아니오 Windows용 PHP 5.3.19에서 읽기 지원

WBMP 예 예  

WebP 예 예 PHP 5.5+

출처: http://php.net/manual/kr/intro.image.php

¡ GD로 이미지 생성하기

Ÿ imagecreate() - GD로 화면에 이미지 생성하기

resource�imagecreate�(�int�$width�,�int�$height�)

F width : 이미지 넓이, height : 이미지 높이

F 예) $img = imagecreate( 200, 50); //가로x세로 200x50 pixel 이미지 생성

Ÿ imagecreate() 예제

<?php

//페이지�헤더를�Content-Type:�image/png로�설정한다.�

//이렇게�하면�이�페이지는�이미지를�직접�연것�처럼�이미지로�작동한다.�

header("Content-Type:�image/png");

$img�=�imagecreate(200,�50);�//200x50�크기의�이미지�리소스�생성

Page 164: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 164

imagecolorallocate($img,�0,�0,�255);�//배경이미지를�blue로�설정

$color�=�imagecolorallocate($img,�255,�255,�255);�//글자�색으로�쓸�컬러�조합�생성(흰색)

//이미지에�글자�쓰기(Hello�World!)

//imagestring(이미지리소스,�폰트사이즈(1~5),�가로좌표,�세로좌표,�문자열,�글자색조합);

imagestring($img,�5,�45,�18,��"Hello�World!",�$color);

imagepng($img);�//png�타입�이미지를�출력(화면�또는�파일,�여기서는�화면)�

imagedestroy($img);�//출력을�완료한�이미지를�파괴(메모리�절약)

?>

¡ 존재하는 이미지 불러 작업하기Ÿ imagecreatefrompng, imagecreatefromgif, imagecreatefromjpeg

Ÿ 이 함수들은 이미 존대하는 이미지를 불러서 새로운 이미지를 만드는데 사용한다. 몇 가지

예제를 통해서 이 함수들의 사용법을 알아보자.

Ÿ 기존 이미지 열어서 글자 쓰기

<?php

$imgfile�=�"./images/sample.jpg";�//이미지�파일

if(�file_exists($imgfile)�)�{�//파일이�존재하는지�체크

�//파일의�정보를�읽어�$size에�저장(배열)

�if(�$size�=�getimagesize($imgfile)�)�{

��$width�=�$size[0];�//이미지�가로�사이즈

��$height�=�$size[1];�//이미지�세로�사이즈

��$imgname�=�basename($imgfile);

��$imginfo�=�$imgname�.�"("�.�$width�.�"x"�.�$height�.�")";

��//페이지�헤더를�Content-Type:�image/jpeg로�설정한다.�

��//이렇게�하면�이�페이지는�이미지를�직접�연것�처럼�이미지로�작동한다.�

��header("Content-Type:�image/jpeg");�

��$img�=�imagecreatefromjpeg($imgfile);�//jpeg�파일로부터�이미지�리소스�생성

��$color�=�imagecolorallocate($img,�255,�255,�255);�//글자�색으로�쓸�컬러�조합�생성(흰색)

Page 165: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 165

��//이미지에�글자�쓰기($imginfo)

��//imagestring(이미지리소스,�폰트사이즈(1~5),�가로좌표,�세로좌표,�문자열,�글자색조합);

��imagestring($img,�5,�10,�10,��$imginfo,�$color);

��imagejpeg($img);�//jpeg�타입�이미지를�출력(화면�또는�파일,�여기서는�화면)�

��imagedestroy($img);�//출력을�완료한�이미지를�파괴(메모리�절약)

�}

}

?>

Ÿ 화면에 표시된 이미지 저장하기

F 앞의 예제에서 imagejpeg($img); 는 화면에 이미지를 출력하는데 사용하였다.

F 이 코드를 imagejpeg($img, "./images/sample_new.jpg"); 와 같이 수정하면 $img 이미지 리

소스를 현재 폴더 아래의 images 폴더에 sample_new.jpg로 저장하게 된다.

F 아래와 같이 코드를 수정하면 이미지가 저장된다.

<?php

$imgfile�=�"./images/sample.jpg";

if(�file_exists($imgfile)�)�{

�if(�$size�=�getimagesize($imgfile)�)�{

��$width�=�$size[0];

��$height�=�$size[1];

��$imgname�=�basename($imgfile);

��$imginfo�=�$imgname�.�"("�.�$width�.�"x"�.�$height�.�")";

Page 166: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 166

��$img�=�imagecreatefromjpeg($imgfile);

��$color�=�imagecolorallocate($img,�255,�255,�255);

��imagestring($img,�5,�10,�10,��$imginfo,�$color);

��imagejpeg($img,�"./images/sample_new.jpg");�//jpeg�타입�이미지를�파일로�저장

��imagedestroy($img);�//출력을�완료한�이미지를�파괴(메모리�절약)

�}

}

?>

F 위 코드를 실행하고 폴더를 열어보면 다음과 같이 텍스트가 포함된 새로운 이미지가 생성

되어 있는 것을 확인할 수 있다.

¡ 두 개의 이미지 합치기Ÿ imagecopy() - 이 함수는 이미지의 특정부분을 복사하는데 사용한다.

bool�imagecopy�(�resource�$dst_im�,�resource�$src_im�,�int�$dst_x�,�int�$dst_y�,�int�$src_x�,�

int�$src_y�,�int�$src_w�,�int�$src_h�)

F dst_im – 배경 이미지 리소스

F src_im – 붙여 넣을 이미지 리소스

F dst_x – 배경 이미지 리소스(배경)에 원본을 붙여넣을 x 좌표(가로)

F dst_y – 배경 이미지 리소스(배경)에 원본을 붙여넣을 y 좌표(세로)

F src_x – 붙여 넣을 이미지의 x 좌표(가로)

F src_y – 붙여 넣을 이미지의 y 좌표(세로)

F src_w – 붙여 넣을 이미지의 넓이

Page 167: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 167

F src_h – 붙여 넣을 이미지의 높이

Ÿ php.net에서는 배경이미지를 목표(target), 붙여 넣을 이미지를 원본(source)로

설명하고 있으나 자칫 복잡할 수도 있어 배경이미지와 붙여넣을 이미지로 부

르기로 한다.

Ÿ imagecopy() 함수를 사용하려면 두 개 이상의 이미지가 있어야 한다. 하나의

이미지에 여러 이미지를 합성할 수 있다. 간단한 사용 예는 다음과 같다.

$img1�=�imagecreatefromjpeg("sample1.jpg”);�//sample1.jpg를�열어�$img1�리소스�생성

$img2�=�imagecreatefromjpeg("sample2.jpg”);�//sample2.jpg를�열어�$img2�리소스�생성

//$img1에�$img2를�좌측�모서리�상단에�200x2000�크기로�붙여�넣는다.�$img2는�$img1에�포함된다.

imagecopy($img1,�$img2,�0,�0,�0,�0,�200,�200);�

imagejpeg($img1,�"sample1_2.jpg”);�//두�파일이�합쳐진�$img1을�sample1_2.jpg를�저장한다.�

Ÿ 예제

F 아래 두 개의 이미지를 준비한다.

sample.jpg

sample1.png

F 아래와 같이 코드를 작성하고 실행해보자.

<?php

$imgfile1�=�"./images/sample.jpg";

$imgfile2�=�"./images/sample2.png";

$img1�=�imagecreatefromjpeg($imgfile1);

$img2�=�imagecreatefrompng($imgfile2);

imagecopy($img1,�$img2,�0,�0,�0,�0,�200,�180);

imagejpeg($img1,�"./images/sample1_2.jpg");

imagedestroy($img1);

?>

Page 168: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 168

F 폴더를 열어보면 아래와 같이 sample1_2.jpg가 생성된 것을 확인할 수 있다.

sample1_2.jpg

¡ 이미지 크기 변경하여 저장하기Ÿ imagecopyresized() - 이미지 크기를 변경하는데 사용하는 함수로 썸네일(thumbnail) 등을

만들 때 유용하게 사용된다.

bool�imagecopyresized�(�resource�$dst_image�,�resource�$src_image�,�int�$dst_x�,�int�$dst_y�,�int�

$src_x�,�int�$src_y�,�int�$dst_w�,�int�$dst_h�,�int�$src_w�,�int�$src_h�)

F dst_image – 대상이미지 리소스(즉, 크기 조절해서 새로 만들 이미지 리소스)

F src_image – 원본 이미지 리소스

F dst_x – 대상이미지의 x 좌표(대상 이미지에 원본을 그릴 x 좌표)

F dst_y – 대상이미지의 y 좌표(대상 이미지에 원본을 그릴 y 좌표)

F src_x – 원본 이미지의 x 좌표(원본이미지에서 잘라 올 x 좌표)

F src_y – 원본 이미지의 y 좌표(원본이미지에서 잘라 올 y 좌표)

F dst_w – 대상 이미지의 넓이

F dst_h – 대상 이미지의 높이

F src_w – 원본 이미지의 넓이

F src_h – 원본 이미지의 높이

Page 169: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 169

Ÿ 예제 – 원본 보다 50% 작은 이미지 만들기

<?php

$srcfile�=�"./images/sample.jpg";�//400x300�크기의�이미지

$percent�=�1/2;�//0.5,�이미지�줄일�비율을�50%로�함

list($width_src,�$height_src)�=�getimagesize($srcfile);�//이미지�사이즈를�각각의�변수에�저장

$width_new�=�$width_src�*�$percent;�//원본�이미지�넓이에�0.5를�곱함(50%)

$height_new�=�$height_src�*�$percent;�//원본�이미지�높이에�0.5를�곱함(50%)

$img_new�=�imagecreatetruecolor($width_new,�$height_new);�//빈�trucolor이미지�생성(50%크기)

$img_src�=�imagecreatefromjpeg($srcfile);�//원본�이미지�리소스�$img_src�생성

//새로운�이미지�$img_new에�원본�이미지�$img_src를�사이즈�조정하여�집어�넣는다

imagecopyresized($img_new,�$img_src,�0,�0,�0,�0,�$width_new,�$height_new,�$width_src,�$height_src);

imagejpeg($img_new,�"./images/thumb_sample.jpg");�//새로�만들어진�$img_new를�저장

imagedestroy($img_src);�//원본�이미지�리소스를�제거

imagedestroy($img_new);�//새로�만들어진�이미지�리소스를�제거

?>

F 위 소스를 실행하면 400x300 이미지의 50% 크기인 200x150 사이즈의 작은 이미지가 생성

된다.

Page 170: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 170

F 만일 원본의 일부만 가져다 크기를 변경하여 저장하려면 위 코드에서 src_x, src_y, src_w,

src_h 값들을 조정하면 된다. 다음과 같이 imagecopyresized() 함수를 변경하면 새로운 이미

지 파일들이 생성된다.

imagecopyresized($img_new,� $img_src,� 0,� 0,� 0,� 0,� $width_new,� $height_new,� $width_src/2,�

$height_src/2);

imagecopyresized($img_new,�$img_src,�0,�0,�$width_src/2,�$height_src/2,�$width_new,�$height_new,�

$width_src/2,�$height_src/2);

F 위 그림을 보면 왼쪽의 그림은 원본의 좌측 상단에서 x, y 절반 크기의 영역만 가져왔고,

오른쪽 그림은 원본의 x, y 절반 위치부터 우측하단까지의 영역만 가져와 저장했다.

¡ 썸네일 함수 만들기Ÿ 위의 이미지 크기 변경하여 저장하기 예제와 몇가지 추가적인 함수들을 활용하여 썸네일을

만드는 함수를 만들어 보자. 함수를 만들면 언제든지 재사용할 수 있으므로 코드를 절약하

고 간결하게 할 수 있다.

Ÿ 다음의 예제는 원본 이미지와 가로세로 최대 크기 값을 참조하여 썸네일을 만드는 예제이

다. 예를 들어 sample.jpg 파일이 주어지고 150이라는 숫자가 주어진다고 치자. 함수는 이

이미지가 gif인지 jpeg인지 또는 png 인지 검사하여 알맞은 함수를 실행해야 하고, 이미지

Page 171: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 171

의 가로가 세로보다 크면 가로 크기를 150에 고정하고 세로는 비율에 맞게 축소해야 하며

반대의 경우에는 반대로 사이즈를 조정해야 한다. 이와 같은 작업을 거쳐 썸네일 이미지를

저장하고 화면에 출력하는 예제이다. 상세한 설명은 코드 안에 포함되어 있다.

<?php

$src_file�=�"./images/sample.jpg";

$thumb_file�=�"./images/thumb_sample.jpg";

$max_size�=�150;�//가로�세로�최대�사이즈

//썸네일을�생성(저장)하는�함수�save_thumbnail()�호출

//함수�실행�결과�true�또는�false�반환

$make_thumb�=�save_thumbnail($src_file,�$thumb_file,�$max_size);

//썸네일�함수�실행�결가가�참(true)이면�이미지를�화면에�출력

if(�$make_thumb�)�{

�echo�"<html><body>";

�echo�"<img�src='{$src_file}'>�";

�echo�"<img�src='{$thumb_file}'>";

�echo�"</body></html>";

}

//썸네일�생성�함수

//$src_file:�원본이미지

//$thumb_file:�썸네일�이미지�경로와�이름

//$max_size:�가로세로�최대�크기

function�save_thumbnail($src_file,�$thumb_file,�$max_size)�{

�//�소스파일이�존재하지�않으면�중단하고�false�반환.�

�if(�!�file_exists($src_file)�)�return�false;�

�//이미지�정보�얻어내기

�//list�함수를�사용하여�getimagesize()에서�얻어내는�배열의�첫�3개�값을�3개의�변수에�저장�

�//$width:�가로사이즈,�$height:�세로사이즈,�$type�:�1=>'GIF',�2=>'JPEG',�3=>'PNG'

�if(�!�list($width,�$height,�$type)�=�getimagesize($src_file)�)�return�false;

�//이미지가�GIF,�JPEG,�PNG�아니면�중단하고�false�반환.

�if(�$type�<�1�||�$type�>�3�)�return�false;��

�//이미지�가로�세로�사이즈�비교하여�썸네일�가로�세로�사이즈�구하기�

�$thumb_width�=�0;�//썸네일�이미지�가로�사이즈�초기화

�$thumb_height�=�0;�//썸네일�이미지�세로�사이즈�초기화

�if(�$width�>�$height�)�{�//만일�원본의�가로가�세로보다�크면�

��$thumb_width�=�$max_size;�//썸네일의�가로는�주어진�최대�사이즈

��//세로는�가로보다�작으므로�비율에�맞게�계산.�floor()함수는�소수점�이하를�버림�

��$thumb_height�=�floor($height�*�($thumb_width�/�$width));

�}�elseif(�$width�<�$height�)�{�//만일�원본의�세로가�가로보다�크면�

��//가로는�세로보다�작으므로�비율에�맞게�계산.�floor()함수는�소수점�이하를�버림�

��$thumb_width�=�floor($width�*�($thumb_height�/�$height));

Page 172: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 172

��$thumb_height�=�$max_size;�//썸네일의�세로는�주어진�최대�사이즈

�}�else�{�//위�두�조건이�아니면,�즉�가로와�세로가�같으면�

��$thumb_width�=�$max_size;�//썸네일의�가로는�주어진�최대�사이즈

��$thumb_height�=�$max_size;�//썸네일의�세로는�주어진�최대�사이즈

�}

�//썸네일의�넓이�높이�값이�없으면�중단하고�false�반환�

�if(�!�$thumb_width�||�!�$thumb_height�)�return�false;

�//이미지�type에�따라�다른�imagecreatefrom...�함수�실행

�switch(�$type�){

��case�1:�$src_img�=�imagecreatefromgif($src_file);�break;

��case�2:�$src_img�=�imagecreatefromjpeg($src_file);�break;

��case�3:�$src_img�=�imagecreatefrompng($src_file);�break;

��default:�return�false;�break;

�}

�if(�!�$src_img�)�return�false;

�//썸네일�사이즈의�빈�truecolor�이미지�리소스�$thumb_img�생성�

�$thumb_img�=�imagecreatetruecolor($thumb_width,�$thumb_height);

�//이미지�리소스�$thumb_img에�원본(소스)이미지�리소스의�사이즈를�조정하여�삽입함

�//imagecopyresampled()는�imagecopyresized()와�유사하나�성능이�보다�나은�것으로�평가됨

�imagecopyresampled($thumb_img,�$src_img,�0,�0,�0,�0,�$thumb_width,�$thumb_height,�$width,�$height);

�//이미지�type에�따라�다른�image...�함수�실행(이미지�저장)

�switch(�$type�){

��case�1:�imagegif($thumb_img,�$thumb_file);�break;

��case�2:�imagejpeg($thumb_img,�$thumb_file);�break;

��case�3:�imagepng($thumb_img,�$thumb_file);�break;

��default:�return�false;�break;

�}

�imagedestroy($src_img);�//�이미지�리소스�제거

�imagedestroy($thumb_img);�//�이미지�리소스�제거

�//썸네일이�생성되어�파일이�존재하는지�체크

�if(�file_exists($thumb_file)�)�{

��return�true;�//존재하면�true�반환

�}�else�{

��return�false;�//존재하지�않으면�false�반환

�}

}

?>

Page 173: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 173

F 소스코드를 실행하면 위 그림처럼 원본 이미지와 썸네일 이미지를 보여준다.

응용과제

만일 원본 이미지의 가로 세로 사이즈 모두 주어진 썸네일 크기보다 작은 경우 원본 이미지 사이즈 그대로 썸

네일을 만들도록 코드를 수정해보자.

¡ 그래픽 관련 함수

Ÿ getimagesize() - 이미지 정보를 얻어오는 함수

F 이 함수는 이미지 파일로부터 여러 정보를 얻어온다. 이 함수를 파일이 이미지인지 아닌지

를 확인하는 용도로 사용하기도 한다.

array�getimagesize�(�string�$filename�[,�array�&$imageinfo�]�)

F 반환되는 값 :

① 가로사이즈 – 배열 0번으로 반환되는 이미지 가로 넓이 픽셀의 정수값

② 세로사이즈 – 배열 1번으로 반환되는 이미지 세로 높이 픽셀의 정수값

③ 타입 – 배열 2번으로 반환되는 이미지 타입에 대한 정수값

1=>'GIF', 2=>'JPEG', 3=>'PNG’ ... 전체 이미지 타입 값은 보충설명 참조

④ 넓이와높이 텍스트값 – 배열 3번으로 width="400" height="300" 문자열 반환

⑤ bits – ['bit']로 이미지의 bit를 정수 값으로 반환

⑥ channels – ['channels']로 이미지 채널을 반환

⑦ mime – ['mime']로 이미지의 타입을 mage/jpeg와 같은 문자열로 반환

Page 174: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 174

F [보충설명] 이미지 타입별 번호

이 값들은 PHP의 get_defined_constants() 함수를 통해서 얻을 수 있다.

print_r(get_defined_constants()); 와 같이 출력하면 PHP에서 정의된 상수들의 배열 값을 화

면에 출력해준다. 그 중에서 IMAGETYPE_로 시작하는 값들을 보면 다음과 같다.

- [IMAGETYPE_GIF] => 1

- [IMAGETYPE_JPEG] => 2

- [IMAGETYPE_PNG] => 3

- [IMAGETYPE_SWF] => 4

- [IMAGETYPE_PSD] => 5

- [IMAGETYPE_BMP] => 6

- [IMAGETYPE_TIFF_II] => 7

- [IMAGETYPE_TIFF_MM] => 8

- [IMAGETYPE_JPC] => 9

- [IMAGETYPE_JP2] => 10

- [IMAGETYPE_JPX] => 11

- [IMAGETYPE_JB2] => 12

- [IMAGETYPE_SWC] => 13

- [IMAGETYPE_IFF] => 14

- [IMAGETYPE_WBMP] => 15

- [IMAGETYPE_JPEG2000] => 9

- [IMAGETYPE_XBM] => 16

- [IMAGETYPE_ICO] => 17

- [IMAGETYPE_WEBP] => 18

- [IMAGETYPE_UNKNOWN] => 0

- [IMAGETYPE_COUNT] => 19

F getimagesize() 예제

<?php

$img�=�"./images/sample.jpg";

$size�=�getimagesize($img);

print_r($size);

?>

Page 175: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 175

¡ 막대그래프 그리기 예제Ÿ GD는 수많은 함수를 제공하며 이를 통해서 다양한 그래픽 관련 작업을 수행할 수 있다. 예

를 들어 그래프 그리기가 그 중 하나이다. 앞에서 다루지 않은 많은 기능들을 다음의 예제

를 통해서 살펴보고 심도 있는 학습을 진행할 수 있을 것이다.

Ÿ GD 관련 함수들의 자세한 내용은 다음 링크에서 확인할 수 있다.

F http://php.net/manual/kr/ref.image.php

Ÿ 그래프 그리기 예제

Page 176: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 176

<?php

//GD를�활용해�막대�그리프�그리기

$width�=�600;�//이미지�가로�넓이

$height�=�400;�//이미지�세로�높이

$padding�=�50;�//이미지의�안쪽�여백

$graph_width�=�$width�-�$padding;�//그래프�영역�넓이

$graph_height�=�$height�-�$padding;�//그래프�영역�높이

//그래프를�그리기�위해�2017년�12월�기준�웹브라우저�별�점유율�데이터를�사용

//참조:�https://www.netmarketshare.com/browser-market-share.aspx

$browsers�=�array(

�"Chrome"=>60.57,

�"Edge"=>4.61,

�"Firefox"=>11.02,

�"IE"=>12.36,

�"Etc"=>11.44

);

$nums�=�sizeof($browsers);�//배열의�갯수

$total�=�array_sum($browsers);�//배열에�포함된�값의�합

//막대그래프�각각의�넓이*80%,�그래프가�서로�붙어�있는�것을�방지

$column_width�=�($graph_width�/�$nums)�*�0.8;�

//그래프�좌우�여백의�합,�20%/2

$column_padding�=�(($graph_width�/�$nums)�*�0.2)/2;�

//빈�이미지�리소스�$graph�생성(500,400)

$graph�=�imagecreatetruecolor($width,�$height);

//그래프에서�사용할�컬러�조합�생성

$black�=�imagecolorallocate($graph,�0,�0,�0);

$white�=�imagecolorallocate($graph,�255,�255,�255);

$green�=�imagecolorallocate($graph,�0,�255,�0);

$red�=�imagecolorallocate($graph,�255,�0,�0);

//이미지의�배경을�흰색으로�채움�

imagefill($graph,�0,�0,�$white);

//배열을�반복하면서�막대�그리기

$x�=�$padding;

foreach�($browsers�as�$key�=>�$value)�{

�//막대�그리기

�$x_start�=�$x�+�$column_padding;

�$y_percent�=�$value�/�$total;

�$y_height�=�$graph_height�*�$y_percent;

�$y_start�=�$height�-�($padding�+�$y_height);

�$x_end�=�$x_start�+�$column_width;

�$y_end�=�$graph_height;

Page 177: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 177

�imagefilledrectangle($graph,�$x_start,�$y_start,�$x_end,�$y_end,�$green);

�//브라우저�이름�쓰기

�$text�=�$key;

�$text_width�=�imagefontwidth(2)�*�strlen($text);

�$text_center�=�$x_start�+�($column_width/2);

�$text_x�=�$text_center�-�($text_width/2)�;

�$text_y�=�($height�-�$padding)�+�10;

�imagestring($graph,�2,�$text_x,�$text_y,�$text,�$black);

�//그래프�위에�숫자값�쓰기

�$text2�=�$value�.�"%";

�$text2_width�=�imagefontwidth(2)�*�strlen($text2);

�$text2_center�=�$text_center;

�$text2_x�=�$text2_center�-�($text2_width/2);

�$text2_y�=�$y_start�-�20;

�imagestring($graph,�2,�$text2_x,�$text2_y,�$text2,�$red);

�$x�=�$x_end;

}

//그래프�하단에�x축�라인�그리기

//imageline�(이미지리소스�,�시작x좌표�,�시작y좌표�,�끝x좌표�,�끝y좌표�,�컬러�)

//imageline($graph,�50,�350,�550,�550,�$black)

imageline($graph,�$padding,�$graph_height,�$graph_width,�$graph_height,�$black);

//그래프�왼쪽에�y축�라인�그리기

//imageline($graph,�50,�50,�50,�350,�$black)

imageline($graph,�$padding,�$padding,�$padding,�$graph_height,�$black);

imagestring($graph,�2,�$padding�-�10,�$graph_height�-�10,�"0",�$black);

imagestring($graph,�2,�$padding�-�20,�($graph_height/2)�+�$padding,�"50%",�$black);

imagestring($graph,�2,�$padding�-�30,�$padding�-�5,�"100%",�$black);

header('Content-Type:�image/png');

imagepng($graph);

imagedestroy($graph);

?>

GD 그래프 추가 과제

위에서 그린 막대그래프를 파이형 그래프로 그려보자.

Page 178: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 178

PHP XML

¡ XML이란?

Ÿ XML은 웹사이트들 간에 데이터를 공유하는데 사용되는 구조화된 데이터이다.

Ÿ XML은 eXtensible Markup Language의 약자이다.

Ÿ XML은 HTML을 포함하는 개념이다.

Ÿ 뉴스나 BLOG 등에서 자료 공유를 위해 제공하는 RSS가 대표적인 XML이다.

Ÿ PHP는 XML을 읽고 쓰거나 변환하는 기능을 제공한다.

Ÿ XML 사례

<?xml�version='1.0'�encoding='UTF-8'?>

<booklist>

�<book>

��<title>PHP�MySQL�배우기</title>

��<author>홍길동</author>

��<pubDate>2018.01.01</pubDate>

��<price>18000</price>

�</book>

�<book>

��<title>HTML�배우기</title>

��<author>김영철</author>

��<pubDate>2017.08.14</pubDate>

��<price>12000</price>

�</book>�

�<book>

��<title>MySQL�배우기</title>

��<author>박철수</author>

��<pubDate>2016.05.24</pubDate>

��<price>13500</price>

�</book>�

�<book>

��<title>JavaScript�배우기</title>

��<author>최영희</author>

��<pubDate>2017.02.10</pubDate>

��<price>11800</price>

�</book>��

</booklist>�

Page 179: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 179

F XML은 <?xml version='1.0' encoding='UTF-8'?>로 시작하며 그 아래에 tree 구조의 데이터

가 포함되어 있다. Root Element인 booklist 아래에 book 요소(Elemnt)들이 나열되어 있다.

book 요소들 아래에는 각각 title, author, pubDate, price 요소들 있다.

¡ PHP SimpleXML Parser로 XML 읽고 표시하기

Ÿ simplexml_load_string() 함수로 문자열 변수의 XML 읽기

<?php�

$xmlData�=�

"<?xml�version='1.0'�encoding='UTF-8'?>

<booklist>

�<book>

��<title>PHP�MySQL�배우기</title>

��<author>홍길동</author>

��<pubDate>2018.01.01</pubDate>

��<price>18000</price>

�</book>

�<book>

��<title>HTML�배우기</title>

��<author>김영철</author>

��<pubDate>2017.08.14</pubDate>

��<price>12000</price>

�</book>�

�<book>

��<title>MySQL�배우기</title>

��<author>박철수</author>

��<pubDate>2016.05.24</pubDate>

��<price>13500</price>

�</book>�

�<book>

��<title>JavaScript�배우기</title>

��<author>최영희</author>

��<pubDate>2017.02.10</pubDate>

��<price>11800</price>

�</book>��

</booklist>";

$xml�=�simplexml_load_string($xmlData);�//문자열로부터�XML을�읽어�$xml로�저장

print_r($xml);�//배열�$xml을�출력

?>

Page 180: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 180

Ÿ XML node들 읽어서 출력하기

<?php�

$xmlData�=�

"<?xml�version='1.0'�encoding='UTF-8'?>

<booklist>

�<book>

��<title>PHP�MySQL�배우기</title>

��<author>홍길동</author>

��<pubDate>2018.01.01</pubDate>

��<price>18000</price>

�</book>

�<book>

��<title>HTML�배우기</title>

��<author>김영철</author>

��<pubDate>2017.08.14</pubDate>

��<price>12000</price>

�</book>�

�<book>

��<title>MySQL�배우기</title>

��<author>박철수</author>

��<pubDate>2016.05.24</pubDate>

��<price>13500</price>

�</book>�

�<book>

��<title>JavaScript�배우기</title>

��<author>최영희</author>

��<pubDate>2017.02.10</pubDate>

��<price>11800</price>

�</book>��

</booklist>";

$xml�=�simplexml_load_string($xmlData);�//문자열로부터�XML을�읽어�$xml로�저장

$books�=�$xml->children();�//�$xml의�자식노드들을�$books에�저장(root�노드�booklist는�제외됨)

foreach(�$books�as�$book�)�{

�echo�"제목:"�.�$book->title�.�",�";

�echo�"저자:"�.�$book->author�.�",�";

Page 181: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 181

�echo�"출간일:"�.�$book->pubDate�.�",�";

�echo�"가격:"�.�$book->price�.�"<br>";

}

?>

Ÿ 속성 읽고 처리하기

F <book color='black'>와 같이 노드 요소들은 속성(attribute)을 가질 수 있는데 이 속성을

읽어들이기 위해서는 attributes() 함수를 사용해야 한다.

F 다음은 속성을 읽어서 처리하는 예제이다.

<?php�

$xmlData�=�

"<?xml�version='1.0'�encoding='UTF-8'?>

<booklist>

�<book�color='black'>

��<title�fontsize='25px'>PHP�MySQL�배우기</title>

��<author>홍길동</author>

��<pubDate>2018.01.01</pubDate>

��<price>18000</price>

�</book>

�<book�color='blue'>

��<title�fontsize='10px'>HTML�배우기</title>

��<author>김영철</author>

��<pubDate>2017.08.14</pubDate>

��<price>12000</price>

�</book>�

</booklist>";

$xml�=�simplexml_load_string($xmlData);�//문자열로부터�XML을�읽어�$xml로�저장

$books�=�$xml->children();�//�$xml의�자식노드들을�$books에�저장(root�노드�booklist는�제외됨)

foreach(�$books�as�$book�)�{

�$color�=�$book->attributes()->color;�//book�요소의�속성�color�값을�읽는다

�$fontsize�=�$book->title->attributes()->fontsize;�//book의�title�요소의�fontsize�값을�읽는다

�echo�"<p�style='color:{$color};'>";

�echo�"<span�style='font-size:{$fontsize};'>제목:"�.�$book->title�.�"</span>,�";

�echo�"저자:"�.�$book->author�.�",�";

�echo�"출간일:"�.�$book->pubDate�.�",�";

�echo�"가격:"�.�$book->price;

Page 182: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 182

�echo�"</p>";

}

?>

Ÿ simplexml_load_file() 함수로 외부 XML 파일 읽기

F sample.xml

<?xml�version='1.0'�encoding='UTF-8'?>

<booklist>

�<book>

��<title>PHP�MySQL�배우기</title>

��<author>홍길동</author>

��<pubDate>2018.01.01</pubDate>

��<price>18000</price>

�</book>

�<book>

��<title>HTML�배우기</title>

��<author>김영철</author>

��<pubDate>2017.08.14</pubDate>

��<price>12000</price>

�</book>�

�<book>

��<title>MySQL�배우기</title>

��<author>박철수</author>

��<pubDate>2016.05.24</pubDate>

��<price>13500</price>

�</book>�

�<book>

��<title>JavaScript�배우기</title>

��<author>최영희</author>

��<pubDate>2017.02.10</pubDate>

��<price>11800</price>

�</book>��

</booklist>�

Page 183: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 183

F xml.php

<?php�

$xml=simplexml_load_file("sample.xml");//외부�파일로부터�XML을�읽어�$xml로�저장

$books�=�$xml->children();�//�$xml의�자식노드들을�$books에�저장(root�노드�booklist는�제외됨)

foreach(�$books�as�$book�)�{

�echo�"제목:"�.�$book->title�.�",�";

�echo�"저자:"�.�$book->author�.�",�";

�echo�"출간일:"�.�$book->pubDate�.�",�";

�echo�"가격:"�.�$book->price�.�"<br>";;

}

?>

F 파일을 읽어오는 것에서만 차이가 있고 나머지 사용법은 simplexml_load_string()과 똑같으

므로 세부적은 코드는 simplexml_load_string()와 같이 작성 가능

Ÿ simplexml_load_file() 로 웹사이트의 XML 파일 읽기

<?php�

$xml=simplexml_load_file("http://webskills.kr/sample.xml");//웹에서�XML을�읽어�$xml로�저장

$books�=�$xml->children();�//$xml의�자식노드들을�$books에�저장(root�노드�booklist는�제외됨)

foreach(�$books�as�$book�)�{

�echo�"제목:"�.�$book->title�.�",�";

�echo�"저자:"�.�$book->author�.�",�";

�echo�"출간일:"�.�$book->pubDate�.�",�";

�echo�"가격:"�.�$book->price�.�"<br>";;

}

?>

Page 184: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 184

¡ 뉴스 rss 읽어서 출력하기(네이버 뉴스 예)

Ÿ 대부분의 뉴스 사이트들은 rss를 제공한다.

Ÿ rss란 Rich Site Summary 로 뉴스, 블로그 등에서 내용을 공유하게 위해 제공

하는 XML 기반의 데이터이다. 참조: https://ko.wikipedia.org/wiki/RSS

Ÿ rss 구조

<?xml�version="1.0"�encoding="UTF-8"?>

�<rss�version="2.0">

��<channel>

����<title>제목</title>

����<link>주소</link>

����<description>설명</description>

����<item>

������<title>제목</title>

������<link>글주소(URL)</link>

������<description>글요약</description>

������<pubDate>출판일(등록일)</pubDate>

������<author>저자(언론사)</author>

������<category>섹션</category>

����</item>

����<item>

������<title>제목</title>

������<link>글주소(URL)</link>

������<description>글요약</description>

������<pubDate>출판일(등록일)</pubDate>

������<author>저자(언론사)</author>

������<category>섹션</category>

����</item>

��</channel>

�</rss>

Ÿ 네이버 뉴스 읽어서 화면에 보여주기

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="UTF-8">

�<title>RSS�Read</title>

�<link�rel="stylesheet"�

href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

</head>

Page 185: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 185

<body>

�<div�class="container-fluid">

��<table�class="table">

���<tr�class="active">

����<td>분류</td>

����<td>제목</td>

����<td>저자</td>

����<td>출판일</td>

���</tr>

<?php

$sch�=�"웹개발";

$news�=�"http://newssearch.naver.com/search.naver?where=rss&query={$sch}";

$news�.=�"&field=0&nx_search_query=&nx_and_query=&nx_sub_query=&nx_search_hlquery=";

$xml�=�simplexml_load_file($news);

$channel�=�$xml->channel;

$newslist�=�$channel->item;

foreach(�$newslist�as�$news�){

?>�

���<tr>

����<td><?php�echo�$news->category;?></td>

����<td><?php�echo�$news->title;?></td>

����<td><?php�echo�$news->author;?></td>

����<td><?php�echo�$news->pubDate;?></td>

���</tr>

<?php�

}

?>

��</table>

�</div>

</body>

</html>

Page 186: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 186

RSS 응용 과제

F 위 네이버 뉴스 검색 코드를 응용해서 사용자가 폼에 검색어를 입력하면 해당 검색어를

화면에 출력해주는 코드 작성해보기

F 뉴스 제목을 클릭하면 해당 링크로 이동하도록 코드 작성하기

F RSS 분석하여 썸네일 이미지 정보가 있는 경우 목록에 썸네일 이미지 표시하기

F 다른 뉴스 사이트(국내외) 또는 공개 블로그 등 RSS 제공 사이트의 정보 표시

● 뉴스 사이트 RSS 주소는 제공자의 결정에 따라 바뀔 수 있음

Page 187: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 187

PHP JSON

¡ JSON이란?

Ÿ JSON은 JavaScript Object Notation으로 자바스크립트 객체 표기법이다.

Ÿ 최근에 인터넷 사용환경의 변화(스마트폰 사용 등)로 XAML보다는 좀더 가볍고

JavaScript에서 처리하기에 간단한 JSON 사용이 늘고 있다.

Ÿ JSON은 다음과 같은 구조를 갖는다.

{�"name1":�"value1",�"name2":�"value2"�...�}

Ÿ PHP는 이러한 JSON 파일을 encoding(배열을 JSON으로), decoding(JSON을

배열로) 처리할 수 있는 함수를 제공하며 DB 자료를 JSON으로 변환할 수

있다.

¡ 배열을 JSON으로 변환

<?php�

$friends�=�array(

��array("name"=>"KIM",�"age"=>30,�"phone"=>"010-1111-1111"),

��array("name"=>"LEE",�"age"=>27,�"phone"=>"010-2222-2222"),

��array("name"=>"PARK",�"age"=>19,�"phone"=>"010-3333-3333")

�);

$json�=�json_encode($friends);�//배열�$friends를�JSON�형식을�변환

echo�$json;

?>

Page 188: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 188

[{"name":"KIM","age":30,"phone":"010-1111-1111"},{"name":"LEE","age":27,"phone":"010-2222-2222"

},{"name":"PARK","age":19,"phone":"010-3333-3333"}]

F 위 코드를 실행하면 [{...},[{...}]....]와 같은 구조의 데이터가 화면에 출력된다. 이 데이터는 [

]로 둘러싸인 하나의 배열안에 3개의 JSON 데이터가 { }로 둘러싸여 있는 구조이다.

F 출력된 데이터는 문자열이며 JavaScript 등에서 JSON 형식으로 변환하여 사용가능하다.

¡ XML을 JSON으로 변환

Ÿ 앞에서 만든 네이버 뉴스 검색 결과를 JSON으로 변환하는 예제

<?php

$sch�=�"웹개발";

if(�isset($_GET['sch'])�)�$sch�=�$_GET['sch'];

$news�=�"http://newssearch.naver.com/search.naver?where=rss&query={$sch}";

$news�.=�"&field=0&nx_search_query=&nx_and_query=&nx_sub_query=&nx_search_hlquery=";

$xml�=�simplexml_load_file($news);

$channel�=�$xml->channel;

$newslist�=�$channel->item;

$data�=�array();�//빈�배열�생성

$no�=�0;�//배열�번호를�0으로�초기화

foreach(�$newslist�as�$news�){

�$data[$no]�=�array(

��'title'=>�$news->title,

��'author'=>$news->author,

��'link'=>$news->link,

��'category'�=>�$news->category,

��'pubDate'�=>�$news->pubDate

�);

�$no++;�//하나의�뉴스를�읽고�배열에�저장한�다음에는�배열�번호를�1씩�증가

}

$json�=�json_encode($data,�JSON_UNESCAPED_UNICODE);

//JSON_UNESCAPED_UNICODE�옵션은�화면에서�유니코드가�escape되어서�

//\uae4c와�같이�형식으로�표시되는�것을�방지해준다.�

//그러나�실제�JavaScript에서�데이터를�읽을�때는�

//JSON_UNESCAPED_UNICODE를�사용하지�않아도�된다.

echo�$json;

?>

Page 189: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 189

¡ DB 테이블을 JSON으로 변환

Ÿ 앞에서 만든 friends 테이블의 데이터를 모두 읽어서 JSON으로 변환해보자.

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$userpw�=�"123456";

$dbname�=�"phptest";

try�{

�$dbconn�=�new�PDO("mysql:host=$host;dbname=$dbname;charset=utf8",�$dbuser,�$userpw);�

}�catch(PDOException�$exeption)�{

�die("DB�연결�실패:�"�.�$exeption->getMessage());

}�

$sql��=�"SELECT�*�FROM�friends";

$stmt�=��$dbconn->prepare($sql);

$stmt->execute();

$result�=�$stmt->fetchAll(PDO::FETCH_ASSOC);

$dbconn�=�null;

echo�json_encode($result,�JSON_UNESCAPED_UNICODE);

?>

Page 190: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 190

¡ JSON을 배열으로 변환

Ÿ json_decode() - JSON 형식의 데이터를 배열로 변환

<?php�

$json� =�

'[{"name":"KIM","age":30,"phone":"010-1111-1111"},{"name":"LEE","age":27,"phone":"010-2222-2222

"},{"name":"PARK","age":19,"phone":"010-3333-3333"}]';

$data�=�json_decode($json);

print_r($data);

?>

Page 191: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 191

PHP AJAX

¡ AJAX란?

Ÿ AJAX란 "Asynchronous JavaScript and XML(비동기 자바스크립트와 XML)"이

다.

Ÿ 비동기라는 뜻은 페이지를 로딩할 때 데이터를 읽어오는 방식이 아니라 하나

의 페이지 안에서 페이지 이동 없이 다른 페이지의 내용을 읽어 값을 화면에

표시하거나 처리하는데 사용할 수 있는 기술이다.

Ÿ 최근의 주요 웹서비스들은 대부분 AJAX에 기반하여 기능과 콘텐츠를 제공한

다.

Ÿ PHP와 AJAX를 활용하면 회원가입 시 아이디 중복여부를 실시간으로 확인하거

나 자동완성 기능을 제공하는 등 다양한 서비스가 가능하다.

Ÿ AJAX는 JavaScript에서 다룰 내용이지만 여기서는 앞에서 만든 데이터베이스와

JSON 등을 웹에서 어떻게 활용하는지 예제를 통해서 알아보기로 하자.

Ÿ AJAX에서 서버는 데이터 제공의 기능을 주로하고 대부분의 코드는 클라이언트

사이드에서 JavaScript로 처리한다.

Ÿ JavaScript는 XMLHttpRequest() 함수를 통해서 AJAX 기능을 제공하고 jQuery

도 다양한 AJAX 기능을 제공한다. 또한 Angular, VueJS 등 많은 프레임워크도

router 등의 기능으로 AJAX를 제공한다.

¡ Email 중복 여부 확인 예제

Ÿ 프로그램 설명

F 예제에서는 입력한 이메일 주소가 중복되었는지 뿐만 아니라 유효한지도 PHP의 Filter를 사

용해서 검사하고 체크 결과에 따라 입력 폼에서 알맞은 에러메시지를 표시하도록 할 것이

Page 192: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 192

다. 또한 메일이 중복되거나 유효하지 않으면 전송되지 않도록 JavaScript로 폼을 제어하도

록 할 것이다.

F 프로그램은 form.html과 emailcheck.php 두 파일로 구성한다.

Ÿ emailcheck.php – 전송된 email이 데이터에 존재하는지와 유효한지 체크

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$userpw�=�"123456";

$dbname�=�"phptest";

try�{

�$dbconn�=�new�PDO("mysql:host=$host;dbname=$dbname;charset=utf8",�$dbuser,�$userpw);�

}�catch(PDOException�$exeption)�{

�die("DB�연결�실패:�"�.�$exeption->getMessage());

}�

$email�=�"";

$count�=�0;

$result�=�array("success"=>"","msg"=>"");�//결과정보�배열(나중에�JSON�변환)

if(�isset($_GET['email'])�)�$email�=�$_GET['email'];�//[email protected]

if(�!�$email�)�{�//만일�$email�값이�없으면

�$result['success']�=�"false";

�$result['msg']�=�"이메일을�입력하세요!";

}�else�{

�//Email�데이터�형식이�유요한지�filter_var�함수로�검사�

�if(�!�filter_var($email,�FILTER_VALIDATE_EMAIL)�)�{

��//Email�Filter�검사�결과가�FALSE�이면�실패

��$result['success']�=�"false";

��$result['msg']�=�"이메일�형식이�바르지�않습니다.";

�}�else�{

��//Email�Filter�검사�결과가�TRUE�이면�쿼리문�실행하여�중복�체크

��$sql��=�"SELECT�*�FROM�friends�WHERE�friendEmail=:email";

��$stmt�=��$dbconn->prepare($sql);

��$stmt->bindParam(":email",$email);

��$stmt->execute();

��$count�=�$stmt->rowCount();�//쿼리�실행�결과�반환된�레코드�수

��if(�$count�)�{

���//이미�같은�Email이�존재하면�실패�

���$result['success']�=�"false";

���$result['msg']�=�"이미�존재하는�Email입니다.";

��}�else�{

���//같은�Email이�존재하지�않으면�성공�

���$result['success']�=�"true";

���$result['msg']�=�"사용가능한�Email입니다.";

��}

�}

}

Page 193: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 193

$dbconn�=�null;

echo�json_encode($result,�JSON_UNESCAPED_UNICODE);

?>

F 파일 테스트 - http://localhost/emailcheck.php

┖▶ 주소에 email 파라미터가 없어서 email 값이 전달되지 않아서 실패함

F 파일 테스트 – http://localhost/emailcheck.php?email=

┖▶주소에 email 파라미터는 있지만 값이 비어 있어서 실패함

F 파일 테스트 – http://localhost/emailcheck.php?email=abcd

┖▶올바른 메일 형식이 아니라서 실패함

F 파일 테스트 – http://localhost/emailcheck.php?email=abcd@test.

┖▶올바른 메일 형식이 아니라서 실패함

F 파일 테스트 – http://localhost/[email protected]

┖▶이미 존재하는 메일이라서 실패함

F 파일 테스트 – http://localhost/[email protected]

Page 194: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 194

┖▶메일 주소가 유효하고 데이터베이스에서 찾을 수 없어 성공함

Ÿ form.html – From에서 이메일을 입력하고 전송하는 문서

<!DOCTYPE�html>

<html�lang="ko">

<head>

�<meta�charset="UTF-8">

�<title>Email�Check</title>

</head>

<body>

�<form�action=""�method="POST"�onsubmit="return�checkFrom();">

��<div>

���<input�type="hidden"�name="emailok"�id="emailok"�value="false">

���<input�type="text"�name="email"�id="email"�onkeyup="emailCheck(this.value);">

���<input�type="submit"�value="전송">

��</div>

��<p�id="msg"></p>

��<p�id="json"></p>

�</form>

�<script�type="text/javascript">

��var�msgBox�=�document.getElementById("msg");

��var�emailOk�=�document.getElementById("emailok");

��var�jsonBox�=�document.getElementById("json");

��//id=email�input에�글자를�입력할�때마다�실행되는�email�체크�함수

��function�emailCheck(email)�{

���//email�값이�있을�때만�전송해야�하나�여기서는�테스트를�위해�빈값도�전송

���var�xhr�=�new�XMLHttpRequest();�//XMLHttpRequest�객체�생성�

���xhr.onreadystatechange�=�function()�{�//XMLHttpRequest�상태가�변경되면

����//XMLHttpRequest의�응답이�성공하면�

����if�(this.readyState�==�4�&&�this.status�==�200)�{

�����result�=�this.responseText;�//응답받은�텍스트를�변수�result에�대입

�����jsonBox.innerHTML�=�result;�//id가�json인�p�태그�안에�응답결과를�표시

�����//응답결과�텍스트를�JSON으로�변환하여�resultJSON으로�저장

�����var�resultJSON�=�JSON.parse(result);�

�����if(�resultJSON.success�==�"true"�)�{

������//JSON의�success�값이�"true"�이면

������msgBox.style.color�=�"blue";�//id=msg인�p�태그의�글자색을�blue로�

������emailOk.value�=�"true";�//id=emailok인�input의�value를�"true"로

�����}�else�{

������//JSON의�success�값이�"true"가�아니면

Page 195: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 195

������msgBox.style.color�=�"red";�//id=msg인�p�태그의�글자색을�red로�

������emailOk.value�=�"false";�//id=emailok인�input의�value를�"false"로

�����}

�����msgBox.innerHTML�=�resultJSON.msg;�//id=msg인�p�태그에�JSON의�msg�값을�표시�

����}

���};

���//emailcheck.php?email={입력된값}�주소를�열어�전송한다.�

���xhr.open("GET",�"emailcheck.php?email="�+�email,�true);

���xhr.send();�//이�전송이�성공하면�위의�xhr.onreadystatechange�=...구문이�실행됨

��}

��//폼�전송을�시도할�때�실행되는�함수

��function�checkFrom()�{

���//id=emailok인�input의�값이�"true"가�아니면�전송이�안되도록�함�

���if(�emailOk.value�!=�"true"�)�{

����alert("Email이�유효하지�않아�전송할�수�없습니다.");

����return�false;

���}

��}

�</script>

</body>

</html>

Page 196: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 196

¡ 추천 검색어 보여주기 예제

Ÿ 프로그램 설명

F 이 예제는 사용자가 검색어 입력상자에 검색어를 입력하면 해당 글자로 시작하는 글자들을

찾아서 화면에 보여주는 예제이다.

F 여기서는 앞에서 만든 friends 테이블의 이름을 검색하는 것으로 하고 입력한 이름의 글자

로 시작하는 추천 검색어를 화면에 보여주도록 할 것이다.

Ÿ recommend.php – 검색어 s를 받아서 s로 시작하는 모든 데이터의 이름들을

반환

<?php�

$host�=�"localhost";

$dbuser�=�"phpuser";

$userpw�=�"123456";

$dbname�=�"phptest";

try�{

�$dbconn�=�new�PDO("mysql:host=$host;dbname=$dbname;charset=utf8",�$dbuser,�$userpw);�

}�catch(PDOException�$exeption)�{

�die("DB�연결�실패:�"�.�$exeption->getMessage());

}�

$s�=�"";

$count�=�0;

$names�=�"";�//결과정보를�저장할�문자열�변수

if(�isset($_GET['s'])�)�$s�=�$_GET['s'];�//recommend.php?search=a

if(�$s�)�{

�//friendName이�검색어�$s로�시작하는�모든�데이터�검색

�$sql��=�"SELECT�friendName�FROM�friends�WHERE�friendName�LIKE�'{$s}%'";

�$stmt�=�$dbconn->prepare($sql);

�$stmt->execute();

�if(�$result�=�$stmt->fetchAll(PDO::FETCH_ASSOC)�)�{

��foreach($result�as�$friend)�{

���if(�$friend['friendName']�)�{

����if(�$names�)�$names�.=",";

Page 197: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 197

����$names�.=�$friend['friendName'];

���}

��}//end�foreach

�}//end�if

}//end�if

$dbconn�=�null;

echo�$names;

?>

Ÿ search.html – 검색폼을 제공하고 추천검색어를 제공하는 클라이언트 파일

<!DOCTYPE�html>

<html�lang="ko">

<head>

�<meta�charset="UTF-8">

�<title>Search�Name</title>

</head>

<body>

�<form�action=""�method="POST">

��<div>

���<input�type="text"�name="s"�id="s"�onkeyup="recommendNames(this.value);">

���<input�type="submit"�value="검색">

��</div>

��<p>추천검색어:�<span�id="names"></span></p>

�</form>

�<script�type="text/javascript">

��var�namesBox�=�document.getElementById("names");

��function�recommendNames(s)�{

���var�xhr�=�new�XMLHttpRequest();

���xhr.onreadystatechange�=�function()�{

����if�(this.readyState�==�4�&&�this.status�==�200)�{

�����result�=�this.responseText;

�����namesBox.innerHTML�=�result;

����}

���};

���xhr.open("GET",�"recommend.php?s="�+�s,�true);

���xhr.send();

��}

�</script>

</body>

</html>

Page 198: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 198

Page 199: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 199

[부록] PHP MVC

Page 200: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 200

PHP MVC Part 1

¡ MVC란 무엇인가?

Ÿ mvc는 model-view-controller의 약자로 소프트웨어 공학에서 어플리케이션을

구성하는 패턴(pattern) 중 하나이다.

Ÿ 이 mvc 패턴은 응용프로그램의 시각적 부분과 가 이면의 동작과 제어를 처리

하는 부분(비즈니스 로직이라 한다)을 분리하여 서로에 미치는 영향 없이도 응

용프로그램을 변경할 수 있다는 장점이 있다.

Ÿ 예를 들어 데이터베이스나 제어프로그램의 변경 없이 시각적인 부분만 수정하

려면 view에 해당하는 부분만 수정하면 되고 시각적인 부분과 관계 없이 데이

터 처리 부분만 수정하려면 model 부분만, 프로그램간 연결과 제어를 수정하

려면 controller 부분만 수정하면 되는 방식이다.

F Model - Model은 응용프로그램에서 데이터를 처리하는 부분을 가리킨다. 데이터베이스에

연결하고 데이터를 추출하거나 저장, 삭제, 업데이트, 변환 등의 작업을 수행하는 역할을 한

다.

F View - View는 화면에 표시되는 부분이다. 추출한 데이터나 일반적인 텍스트 데이터를 표

시하거나 입력폼 또는 사용자와의 상호작용을 위한 인터페이스를 표시하는 영역이다.

F Controller - Controller는 어플리케이션에서 각 요소들의 연결관계를 설정하고 데이터와 시

각적 부분의 연결 등을 관리한다. 대개 url로부터 입력되는 정보로부터 어떤 데이터와 뷰를

연결할 지 등을 제어한다.

Controller

Model

View

사용자

Page 201: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 201

Ÿ MVC 패턴에서 사용자가 Controller에 작업을 요청하면 Controller는 Model을

호출하여 데이터를 처리하고 Model이 데이터를 처리한 결과를 View에 보내고

이 결과를 사용자가 보게 된다.

¡ MVC 프로그래밍 준비

Ÿ 폴더 구성

mvc 응용프로그램들은 일반적으로 응용프로그램을 저장하기 위한 application 폴

더와 이미지, 스크립트와 스타일시트 파일들을 저장하는 public 폴더로 구분하여

폴더를 구성한다. 아래 그림은 이 예제를 위해 구성한 실제 폴더 구조이다.

windows의 tree 명령어로 htdocs 하위의 폴더 구조를 보면 아래와 같다. 아래와

같이 폴더를 구성해보자.

Page 202: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 202

¡ url 정책 설정(.htaccess)

대개 mvc 프로젝트들은

http://127.0.0.1/index.php?controller=about&action=intro 와 같은 url 구조보다는

http://127.0.0.1/about/intro 와 같은 구조를 선호한다. mvc가 아니더라도 주소가

훨씬 간단할 뿐만아니라 mvc의 성격상 주소를 통해서 접근하고 있는 콘트롤러와

액션 및 파라미터를 쉽게 파악할 수 있기 때문일 것이다.

따라서 .htaccess 파일을 구성해 위와 같은 구조를 만들어보자.

htdocs 폴더(사이트의 루트)에 아래와 같이 .htaccess 파일을 만들어 저장하자.

Ÿ .htaccess

Options�-MultiViews

RewriteEngine�On

Options�-Indexes

RewriteCond�%{REQUEST_FILENAME}�!-d

RewriteCond�%{REQUEST_FILENAME}�!-f

RewriteCond�%{REQUEST_FILENAME}�!-l

RewriteRule�^(.+)$�index.php?url=$1�[QSA,L]

위와 같이 하면 브라우저의 url 입력창에는 http://127.0.0.1/about/intro 와 같이

접근하지만 실제로 내부적으로는 http://127.0.0.1/index.php?url=about/intro 로

접근하게 된다. 응용프로그램에서는 이제부터 $_GET[‘url’]에 입력된 값이 있는지

체크하고 있다면 이를 다시 슬래시(/) 문자열로 구분하여 배열에 저장하고 첫 번째

값을 Controller 이름, 두 번째 값을 Action 이름으로 세 번째 부터는 전달되는 값

(파라미터)들로 인식하게 할 것이다.

F .htaccess 참조 : http://webskills.kr/archives/473

Page 203: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 203

¡ index.php

웹사이트의 루트인 htdocs 폴더에서 기본적으로 실행될 index.php 파일을 먼저 만

들어보자.

<?php

require�'application/config/config.php';

require�'application/libs/application.php';

require�'application/libs/controller.php';

$app�=�new�Application();

이 코드는 앞으로 만들어야할 파일들을 불러오도록 코딩되어 있고 어플리케이션

을 실행하도록 되어 있다. 먼저 config.php 파일은 어플리케이션의 환경설정을 저

장하고 있고, application.php는 주소처리와 클래스 실행등 이 mvc 프로그램의 핵

심 코드가, controller.php 파일에는 콘트롤러를 실행할 때 기본적으로 실행해야

할 코드 들이 포함될 예정이다. $app = new Application();은 application.php 파일

의 Application 클래스를 실행하는 코드이다.

이제부터 이 파일들을 하나씩 만들어보기로 하자.

¡ application\config\config.php

이제 환경 설정 파일을 만들어보자. 이 config.php 파일은 application 폴더 아래

config 폴더에 저장하면 된다.

<?php

error_reporting(E_ALL);

ini_set("display_errors",�1);

define('URL',�'http://127.0.0.1/');

/**�나중에�여기에�DB�관련�환경설정�값이�입력됨�*/

이 환경 설정 파일에는 에러 처리에 관한 설정과 웹사이트 주소에 관한 설정, DB

에 관한 설정(여기서는 생략하지만)등이 포함된다.

Page 204: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 204

Ÿ error_reporting(E_ALL), ini_set("display_errors”, 1);

이것은 php가 실행하면서 발생하는 모든 에러메시지에 대해 리포팅을 하도록 설

정하고 화면에 표시하도록 설정한다. 에러표시에 관해 좀더 상세히 알고 싶으면

아래 두 링크를 참조해보시기 바란다.

F http://php.net/manual/kr/function.error-reporting.php

F http://php.net/manual/kr/errorfunc.constants.php

Ÿ

Ÿ define(‘URL’, ‘http://127.0.0.1/’);

URL 이라는 상수를 선언한다. 이 것은 웹사이트의 HOME 주소를 표시한다.

여기서 실제 온라인에서 운영되는 서버라면 define(‘URL’,

‘http://www.yourdomain.com’); 과 같이 할 수 있다. 또는 필요에 따라

define(‘URL’, ‘http://www.yourdomain.com/mvc’);와 같이 해서 서브디렉토리(서브

폴더) 또는 가상디렉토리를 HOME으로 할 수도 있다. 이 때는 위 .htaccess도

변경되야 한다.

¡ application\libs\application.php

이제 이 사이트의 주소 처리와 콘트롤러 호출을 담당하는 핵심 프로그램인

application.php를 만들어보자. 이 파일은 application 폴더 아래 libs 폴더에 저장

한다.

<?php

class�Application

{

�private�$controller�=�null;

�private�$action�=�null;

�public�function�__construct()

�{

��$cancontroll�=�false;

Page 205: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 205

��$url�=�"";

��if�(isset($_GET['url']))�{

���$url�=�rtrim($_GET['url'],�'/');

���$url�=�filter_var($url,�FILTER_SANITIZE_URL);

��}

��$params�=�explode('/',�$url);

��$counts�=�count($params);

��$this->controller�=�"home";

��if(isset($params[0]))�{

���if($params[0])�$this->controller�=�$params[0];

��}

��if�(file_exists('./application/controller/'�.�$this->controller�.�'.php'))�{

���require�'./application/controller/'�.�$this->controller�.�'.php';

���$this->controller�=�new�$this->controller();

���$this->action�=�"index";�

���if(isset($params[1]))�{

����if($params[1])�$this->action�=�$params[1];

���}

���if�(method_exists($this->controller,�$this->action))�{

����$cancontroll�=�true;

����switch�($counts)�{

�����case�'0':

�����case�'1':

�����case�'2':

������$this->controller->{$this->action}();

������break;

�����case�'3':

������$this->controller->{$this->action}($params[2]);

������break;

�����case�'4':

������$this->controller->{$this->action}($params[2],$params[3]);

������break;

�����case�'5':

������$this->controller->{$this->action}($params[2],$params[3],$params[4]);

������break;

�����case�'6':

������$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5]);

������break;

�����case�'7':

������

$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5],$params[6]);

������break;

�����case�'8':

������

$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5],$params[6],$para

ms[7]);

������break;

�����case�'9':

������

$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5],$params[6],$para

Page 206: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 206

ms[7],$params[8]);

������break;

�����case�'10':

������

$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5],$params[6],$para

ms[7],$params[8],$params[9]);

������break;

����}�

���}

��}

��if($cancontroll� ===� false)� echo� "<!DOCTYPE� html><html><head><meta�

charset='utf-8'></head><body><h1>Oops!!!�잘못된�접근입니다.</h1></body></html>";

�}

}

이 파일은 Application 이라는 클래스(객체)를 생성한다. 클래스는 나중에 상세히 다룰 기회가 생

기면 설명하겠지만 기본적으로 프라퍼티(클래스 안에 포함된 변수)와 메서드(클래스 안에 포함된

함수)로 구성되어 있다.

Ÿ 프라퍼티 설정

이 application.php 파일에 보면 $controller 와 $action 두개의 프라퍼티가 있다.

그리고 클래스 처음 부분에 이 값들을 null 값으로 초기화 했다. null은 값이 없다

는 것이다. 이것은 "”와는 다르다.

private�$controller�=�null;

private�$action�=�null;

위 두 줄의 코드는 $controller와 $action을 null로 초기화해주는데 앞에 private가

붙어 있다. 이것은 이 프라퍼티가 이 클래스 안에서만 사용될 값이라는 뜻이다. 만

을 응용프로그램의 다른 곳에서도 이 값을 사용하려면 public 이라고 붙여줘야 한

다.

Ÿ public function __construct(){//…}

이 부분은 클래스 생성자라고 부르는 부분이다. 쉽게 말하면 클래스를 생성할 때

Page 207: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 207

실행되는 것이다. 예를 들어 $application = new Application(); 이라고 클래스를

생성하면 바로 실행되는 메서드인 것이다. 그 외에 다른 이름의 메서드는

$application->hello();와 같이 호출해줘야 하지만 __construct()는 클래스를 생성

하면서 동시에 실행된다.

이 생성자 안의 코드들에 대해 살펴보자.

$cancontroll�=�false;

이 변수는 나중에 콘트롤러가 정상 실행되었는지 확인하여 정상적이지 않다면 에

러페이지 또는 에러메시지를 표시해주기 위한 초기 설정값으로 처음에는 false로

해두었다가 콜트롤러를 정상 호출하고 메서드를 실행하고 나면 true로 바꿔주도록

했다.

$url�=�"";

if�(isset($_GET['url']))�{

$url�=�rtrim($_GET['url'],�'/');

$url�=�filter_var($url,�FILTER_SANITIZE_URL);

}

$params�=�explode('/',�$url);

$counts�=�count($params);

이 코드는 처음에 $url이라는 변수를 빈 값("”)으로 초기화 하고 만일 주소에

$_GET[‘url’] 값이 선언되었다면 $url 변수의 값을 $_GET[‘url’]로 대입한 후, 오른 쪽

끝의 /는 제거- $url = rtrim($_GET[‘url’], ‘/’); -하고 주소에 포함되어서는 안될 문

자들을 제거- $url = filter_var($url, FILTER_SANITIZE_URL); -한다.

그리고 나서 $url을 / 문자로 구분하여 쪼갠 후 배열 $params에 저장한다.

$counts 는 나중에 사용하기 위하여 배열의 크기를 대입한 변수이다.

Page 208: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 208

$this->controller�=�"home";

if(isset($params[0]))�{

�if($params[0])�$this->controller�=�$params[0];

}

이 코드는 프로그램에서 호출할 콘트롤러를 정해주는 부분이다. $this 란 이 클래

스(객체) Application 자신을 말하고 이 객체에 포함된 프라퍼티를 지정하는 방법

은 $this->controller와 같이 하는 것이다. 따라서 클래스를 호출할 때 null로 초기

화 했던 $controller 변수는 "home”이라는 값을 갖게 된다. $this->controller =

"home”; 과 같이 한 이유는 주소가 127.0.0.1 과같이 뒤에 아무것도 붙지 않았을

경우 기본적으로 실행되어야 할 콘트롤러를 home으로 초기화 해주기 위한 것이

다. 이 값은 바로 다음 줄에서 주소 끝에 입력된 값의 첫 번째 배열에 값이 있다면

그 값으로 변경된다. 예를 들어 127.0.0.1/about 이라고 주소에서 입력했다면

$this->controller의 값은 home에서 about로 바뀌게 된다.

if�(file_exists('./application/controller/'�.�$this->controller�.�'.php'))�{

require�'./application/controller/'�.�$this->controller�.�'.php';

//codes....

}

이 코드는 위에서 얻어온 $this->controller 의 값(주소 끝에 입력된 첫 번째의 값,

없다면 home)을 파일명으로 갖는 콘트롤러 파일이 있는지 검사하여 파일이 존재

한다면 이를 불러오도록 하는 코드이다. 대부분의 주요 코드들은 이 조건 문 안에

//codes 부분에 있다.

만일 127.0.0.1 이 입력되었다면 "./application/controller/home.php” 파일이 존재

하는지 확인하고, 만일 127.0.0.1/about 이 입력되었다

면”./application/controller/about.php” 파일이 존재하는지 확인한 후 존재 한다면

Page 209: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 209

require 구분으로 불러온다. require는 include와 같은 동작을 한다. 다만 불러운

파일에서 에러가 발생했을 때 include는 계속 진행을 하지만 require는 동작을 멈

춘다는 점에서 다르다.

$this->controller�=�new�$this->controller();

이 부분은 콘트롤러 클래스를 생성하는 부분이다. 앞의 코드에서 콘트롤러 파일을

실행했으므로 콘트롤러 파일들에는 "class 콘트롤러명”이라고 클래스가 선언되어

있다. 예를 들어 콘트롤러가 home이라면 home.php 파일 안에는 class Home

extends Controller { //… } 와 같이 되어 있는데 바로 이 Home을 실행하여 새로운

객체를 만드는 것이다. Home을 새로운 객체로 만들려면 $controller = new

Home(); 같이 한다. 그러나 여기서는 어떤 콘트롤러가 실행될 지 직접 정해주는

것이 아니라 주소 입력에 따라 $this->controller에 저장된 콘트롤러 명을 사용한

다.

여기서 $this->controller = new $this->controller(); 와 같이 사용함으로써 앞에서

문자열 변수로 사용된었던 $this->controller는 이제부터는 클래스(객체)가 된다.

물론 클래스를 다른 이름으로 생성할 수도 있지만 여기서는 일단 이렇게 했다. 주

소 입력에 따라 $this->controller는 new home(); 또는 new about()이 될 것이다.

참고로 나중에 만들게 될 콘트롤러 파일들에는 class Home 과 같이 클래스 이름

의 첫 글자를 대문자로 했는데 호출할 때는 new home()과 같이 첫 글자를 소문자

로 한 점이 이상할 수 있다. 그러나 php는 클래스 이름에 대해서는 대소문자를 가

리지 않는다. 따라서 new Home()이나 new home()과 같이 사용해도 된다. 그러나

클래스 명은 기본적으로 첫 글자를 대문자로 해서 만든다(예, class Home).

$this->action�=�"index";�

Page 210: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 210

if(isset($params[1]))�{

if($params[1])�$this->action�=�$params[1];

}

이제 액션을 지정해주자. 액션이란 클래스가 호출되고 클래스 안에 포함된 메서드

를 실행하는 것을 말한다. 예를 들어 주소에 127.0.0.1/about/intro 라고 했다면

about 클래스 안에 intro() 메서드를 실행하라는 것이다.

여기서는 기본 값으로 처음에 $this->action에 "index”를 지정했다. 이것은 액션이

지정되지 않았을 때 기본적으로 실행할 메서드를 index()로 초기화해준 것이다. 그

다음 줄에서는 만약에 주소 끝에 입력된 값을 /로 구분하여 두 번 째 값이 있다면

그것을 액션으로 처리해준다.

얘를 들어 127.0.0.1/about 까지만 입력되었다면 about 클래스 안의 index()가 호

출되고, 127.0.0.1/about/intro 까지 입력되었다면 about 클래스 안의 intro가 호출

되는 식이다. 여기서는 호출할 메서드의 이름만 지정했지 아직 메서드를 호출할

것은 아니다.

if�(method_exists($this->controller,�$this->action))�{

$cancontroll�=�true;

//codes...

}

앞에서 클래스를 생성하고 실행할 메서드까지 정했으므로 이제는 클래스 안에 실

제 메서드가 존재하는지 확인해야 한다. 이 조건문은 클래스 안에 지정한 메서드

가 존재하는지 확인하는 것으로 존재한다면 그 다음의 코드를 실행하게 된다.

$cancontroll 변수는 여기 와서야 true 값을 가진다.

Page 211: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 211

switch�($counts)�{

�case�'0':

�case�'1':

�case�'2':

��$this->controller->{$this->action}();

��break;

�case�'3':

��$this->controller->{$this->action}($params[2]);

��break;

�case�'4':

��$this->controller->{$this->action}($params[2],$params[3]);

��break;

�case�'5':

��$this->controller->{$this->action}($params[2],$params[3],$params[4]);

��break;

�case�'6':

��$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5]);

��break;

�case�'7':

��$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5],$params[6]);

��break;

�case�'8':

��

$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5],$params[6],$para

ms[7]);

��break;

�case�'9':

��

$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5],$params[6],$para

ms[7],$params[8]);

��break;

�case�'10':

��

$this->controller->{$this->action}($params[2],$params[3],$params[4],$params[5],$params[6],$para

ms[7],$params[8],$params[9]);

��break;

}

이 코드는 실제로 클래스의 메서드를 호출하는 코드이다. 그런데 왜 이렇게 복잡

할까? 그것은 주소에 입력되는 정보에 따라 다르다. 예를 들어 127.0.0.1이라고만

되어 있을 때와 127.0.0.1/about 또는 127.0.0.1/about/intro 까지만 입력되었을 때

는 $this->controller->{$this->action}(); 과 같이 해서 클래스의 메서드를 호출하면

된다. 왜냐면 127.0.0.1처럼 콘트롤러가 지정되지 않으면 home을 콘트롤러로 했고

127.0.0.1/about처럼 콘트롤러가 지정되었지만 액션이 지정되지 않았으면 index()

Page 212: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 212

를 기본 메서드로 지정했고 127.0.0.1/about/intro 의 경우는 콘트롤러와 액션이

모두 지정되어 있으므로 해당 콘트롤러의 해당 액션을 지정하면 된다.

따라서 $params의 배열의 크기가 0~2까지는 기본적으로

$this->controller->{$this->action}();처럼 하면 된다. 클래스 안의 메서드를

실행하는 것은 $this->controller->index()처럼 하면 되지만 여기서

$this->controller->$this->action()로 하지 않고

$this->controller->{$this->action}()처럼 액션을 {}로 둘러 싼 것은 $this->action이

문자열 변수이기 때문이다. 이렇게 하지 않으면 에러가 발생한다.

배열 $params의 크기가 3 이상이면 즉 1270.0.1/board/view/2 과 같이 되어 있다

면 세 번째 부터는 콘트롤러나 액션이 아닌 파라미터값으로 인식해서 메서드에 넘

겨주어야 한다. 예를 들어 위 주소는 $this->controller->view($idx)와 같이 넘겨야

한다. 따라서 세 번째 부터는 쉽표로 구분하여 () 안에 파라미터로 넘겨주기 위한

것이고, 3~10까지 파라미터의 갯수를 늘려가며 호출하도록 했다. 물론 10개까지

되지 않는다면 줄여도 되고 그 이상이라면 늘려도 되고 for 문등을 사용해 코드를

간소화 할 수도 있다. 어쨋든 원리는 그렇다는 것이다.

이 과정까지 마치면 클래스를 생성하로 메서드를 호출하고 값이 있을 경우 파라미

터로 넘겨주는 작업이 끝나게 된다.

if($cancontroll�===�false)�echo�"<!DOCTYPE�html><html><head><meta�

charset='utf-8'></head><body><h1>Oops!!!�잘못된�접근입니다.</h1></body></html>";

__construct() 메서드의 끝에 보면 위 코드가 보인다. 앞에서 살펴본대로 클래스가

호출되고 최종적으로 메서드가 존재하는지 확인 되고 나서야 처음에 false였던

$cancontroll의 값이 true로 바뀌게 되는데, 이 코드는 이러한 과정이 수행되지 못

Page 213: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 213

하고 콘트롤러와 메서드가 제대로 실행되지 않았을 때 에러메시지를 보여주게 하

는 코드이다. 물론 여기서도 직접 echo 문을 사용하기 보다 다른 파일을 require

또는 include 시킬 수도 있다.

¡ 콘트롤러 엔진 application\libs\controller.php

<?php

class�Controller

{

function�__construct()

{

}

}

이 파일은 앞으로 모든 콘트롤러들을 실행할 때마다 기본적으로 부르게 되는 콘트

롤러들의 부모 쯤 되는 콘트롤러이다. 여기서 제시하는 코드에는 내용이 비어 있

고 그냥 클래스 틀만 존재하지만 앞으로 이 콘트롤러에는 데이터베이스 연결 등

콘트롤러 실행에 필요한 내용들이 포함될 것이다.

앞으로 만들게 될 콘트롤러 클래스들은 class Home extends Controller 와 같이

모두 Controller 클래스를 상속받게 될 것이다. 여기서 Controller 는 부모 클래스

이고 Home은 자식 클래스이다. 이런 식으로 코드를 작성하면 Home 클래스는

Controller 클래스의 프라퍼티와 메서드를 상속받는다고 한다.

¡ 첫 번째 콘트롤러 만들기

위에서 만든 controller.php는 콘트롤러라기 보다는 지금부터 만들 콘트롤러들의

핵심 코드를 포함하고 있는 부모 컨트롤러이다.

Page 214: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 214

이제부터 만드는 것이 실제 사용자의 주소 입력으로부터 정보를 받아 실행되는 콘

트롤러이다.

지금까지 작성한 코드를 보면 127.0.0.1과 같이 주소에 다른 정보가 없이 입력되었

을 때는 기본적으로 home이 컨트롤러가 되며 home 컨트롤러 안의 index() 메서

드를 실행하게 되어 있다. 따라서 home.php 파일을 만들고 클래스 Home을 선언

하고 그 안에 최소한 index() 메서드를 만들어야 한다.

아래 home.php 파일의 코드가 있다.

Ÿ application\controller\home.php

<?php

class�Home�extends�Controller

{

�public�function�index()

�{

��require�'application/views/_templates/header.php';

��require�'application/views/home/index.php';

��require�'application/views/_templates/footer.php';

�}

}

앞에서 충분히 설명한 것 처럼 class Home extends Controller는 controller.php

파일의 Controller 클래스를 상속받은 Home 클래스를 생성하는 코드이다.

public function index(){//…}는 메서드이다. 이 메서가 실행되면 ‘header.php’를 불

러와 실행하고 다음으로 ‘index.php’를 불러와 실행하며 끝으로 ‘footer.php’를 불

러와 실행하도록 되어 있다. 비교적 쉬운 코드이다. ‘header.php’와 ‘footer.php’는

application의 view 폴더 아래 _templates 폴더를 만들고 저장할 파일들이다. 이 파

Page 215: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 215

일들은 앞으로 모든 콘트롤러에 사용되어 페이지 전체의 일관적인 템플릿으로 사

용될 것이다. 향후에 코드를 조금 더 수정한다면 config.php 파일에서 기본 템플릿

값을 주고 값에 따라 다른 디렉토리의 템플릿을 사용할 수 있도록 할 수도 있을

것이다.

이 콘트롤러가 실행되면 ‘header.php’와 ‘footer.php’가 화면에 표시되고 그 중간에

index.php가 실행되어 표시될 것이다.

그럼, 먼저 header.php와 footer.php를 만들어 보자.

이 두 파일은 application\views\_templates 폴더 안에 저장하면 된다.

Ÿ application\views\_templates\header.php

<!DOCTYPE�html>

<html�lang="en">

<head>

�<meta�charset="utf-8">

�<meta�http-equiv="X-UA-Compatible"�content="IE=edge">

�<title>나의�첫�번째�MVC</title>

�<meta�name="viewport"�content="width=device-width,�initial-scale=1.0">

�<link�href="<?php�echo�URL;�?>public/css/style.css"�rel="stylesheet">

</head>

<body>

�<div�class="wrapper">

��<div�class="header">

���<div�class="nav"><a�href="/">HOME</a><a�href="/about/intro/">회사소개</a><a�

href="/about/history/">연혁</a><a�href="/about/map/">찾아오시는길</a><a�

href="/board/">게시판</a><a�href="/sitemap/">사이트맵</a></div>

��</div>

��<div�class="container">

Ÿ application\views\_templates\footer.php

��</div>

��<div�class="footer">

���you�can�copy�this�mvc�source�free.�

Page 216: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 216

��</div>

�</div>

</body>

</html>

Ÿ application\public\css\style.css

header.php 파일에 보면 style.css 파일이 링크되어 있다. 시각적 효과를 위해 이

파일도 만들어보자.

html,�body�{

����margin:�0;

����padding:�0;

}

body�{

����font-size:�15px;

}

.header�{

�width:100%;

�height:50px;

�background-color:#007eff;

}

.header�a�{

�display:inline-block;

�width:auto;

�padding:0�10px;

�height:50px;

�line-height:50px;

�color:#fff;

�font-size:�1.2em;

�text-decoration:none;

�font-weight:bold;

}

.header�a:hover�{

�background-color:#7cbdff;

�color:#f00;

}

.container�{

�width:100%;

�padding:20px;

�min-height:250px;

}

Page 217: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 217

.footer�{

�width:100%;

�height:30px;

�line-height:30px;

�background-color:#ddd;

�text-align:center;

}

다음으로 실제 home이 실행되었을 때 보여질 index.php 파일을 만들어 보자. 이

파일은 application\views\home 폴더를 만들고 그곳에 저장하면 된다.

Ÿ application\views\home\index.php

<h2>여기는�메인페이지(home)입니다.</h2>

<p>이� 페이지는� http://127.0.0.1/� 또는� 이� 페이지는� http://127.0.0.1/home� 또는� 이� 페이지는�

http://127.0.0.1/home/index�로�접근할�수�있습니다.</p>

여기서는 예제이므로 기본적인 내용들만 표시되도록 하였다.

¡ mvc 실행 테스트

위 코드까지만 생성하고 나면 기본적인 mvc 프로그램이 생성된 것이다.

웹서버를 실행하고 브라우저에서 http://127.0.0.1 을 입력하여 사이트를 열어보자.

Page 218: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 218

화면을 보면 header.php와 footer.php가 화면에 표시되어 있고, 가운에 index.php

에 입력했던 내용이 표시되는 것을 볼 수 있다.

¡ 추가적인 파일 생성 및 저장

지금까지의 코드로 첫 번재 mvc 프로그램이 성공적으로 실행되었음을 확인하였

다. 이제는 메뉴에 표시된 또다른 페이지들을 위한 콘트롤러와 뷰 파일들을 생성

해보기로 하자.

예제의 메뉴를 보면 회사소개(http://127.0.0.1/about/intro/),

연혁(http://127.0.0.1/about/history/), 찾아오시는 길(http://127.0.0.1/about/map/),

게시판(http://127.0.0.1/board/), 사이트맵(http://127.0.0.1/sitemap) 이 있다.

회사소개, 연혁, 찾아오시는 길은 모두 about을 공통으로 갖는다. 이 mvc

프로그램에서 첫 번째 값인 about는 콘트롤러를 가리킨다. 따라서

application\controller 폴더 안에는 about.php 파일이 있어야 한다는 뜻이고,

Page 219: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 219

about.php 파일 안에는 About 클래스가 존재하고 About 클래스 안에는 다시

intro, history, map 세가지의 메서드가 기본적으로 존재하여야 한다.

Ÿ application\controller\about.php

<?php

class�About�extends�Controller

{

�public�function�index()

�{

��$this->intro();

�}

�public�function�intro()

�{

��require�'application/views/_templates/header.php';

��require�'application/views/about/intro.php';

��require�'application/views/_templates/footer.php';

�}

�public�function�history()

�{

��require�'application/views/_templates/header.php';

��require�'application/views/about/history.php';

��require�'application/views/_templates/footer.php';

�}

�public�function�map()

�{

��require�'application/views/_templates/header.php';

��require�'application/views/about/map.php';

��require�'application/views/_templates/footer.php';

�}

}

위 코드는 앞에서 설명한 것과 같은 맥락의 코드들이 포함되어 있다. 다만 index()

메서드 안에는 $this->intro(); 가 한 줄 있는데 이 코드는 만일

127.0.0.1/about/intro나 127.0.0.1/about/history 또는 127.0.0.1/about/map 과 같

이 입력되지 않고 127.0.0.1/about 까지만 입력되었을 경우 기본적으로 index()가

실행되도록 application.php에 프로그램되어 있기 때문에 index() 메서드를 만들고

기본적으로 intro()가 실행되도록 해 준 것이다. 여기서 $this->intro();처럼 하지 않

고 intro();만 실행하면 에러가 발생한다. 클래스 안에서 다른 메서드를 호출할 때

Page 220: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 220

는 $this->메서드명() 과 같은 방법으로 해야 한다.

위 콘트롤러에 따라 views 폴더 안에는 about 폴더를 만들고 intro.php,

histroy.php, map.php 파일을 각각 만들어주면 된다. 그 내용은 각자 필요한 내용

을 적으면 되지만 여기서 간단한 에제를 제공한다.

Ÿ applocation\views\intro\about\intro.php

<h2>여기는�회사소개�페이지(intro)입니다.</h2>

<p>이�페이지는�http://127.0.0.1/about/intro�로�접근할�수�있습니다.</p>

Ÿ applocation\views\intro\about\history.php

<h2>여기는�연혁�페이지(history)입니다.</h2>

<p>이�페이지는�http://127.0.0.1/about/history�로�접근할�수�있습니다.</p>

Ÿ applocation\views\intro\about\map.php

<h2>여기는�찾아오시는길�페이지(map)입니다.</h2>

<p>이�페이지는�http://127.0.0.1/about/map�로�접근할�수�있습니다.</p>

이렇게 해서 웹브라우저에서 회사소개를 클릭하면 다음과 같이 될 것이다.

Page 221: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 221

이번에는 board 부분을 만들어보자

Ÿ application\controller\board.php

<?php

class�Board�extends�Controller

{

�public�function�index()

�{

��require�'application/views/_templates/header.php';

��require�'application/views/board/index.php';

��require�'application/views/_templates/footer.php';

Page 222: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 222

�}

�public�function�write()

�{

��require�'application/views/_templates/header.php';

��require�'application/views/board/write.php';

��require�'application/views/_templates/footer.php';

�}

�public�function�view($idx)

�{

��require�'application/views/_templates/header.php';

��require�'application/views/board/view.php';

��require�'application/views/_templates/footer.php';

�}

}

board.php 파일은 index, write, view 세 개의 메서드를 포함하고 있다. index는 리

스트 역할을 하고, write는 글쓰기 페이지를 열어주고, view는 보기 페이지이다. 여

기에는 앞으로 delete라든가 기타 여러 메서드들이 포함될 수 있을 것이고, 무엇보

다도 데이터베이스 연결 관련 코드가 포함되어 있어야 한다. 그러나 이 글은 우선

mvc를 이해하도록 하는데 목적이 있으므로 데이터베이스 관련 부분은 생략하고

html 코드로 대신하였다.

특이한 것은 view 메서드이다. view 메서드는 view($idx)라고 되어 있는데 이는 콘

트롤러와 액션을 제외하고 바로 뒤에 따라오는 값을 $idx로 받아들인다는 뜻이다.

예를 들어 127.0.0.1/board/view/5 라고 입력하면 5가 $idx가 되는 것이다.

이런 구조는 application.php 파일에서 설명한 부분을 참조하면 이해하기 쉬울 것

이다.

board의 view 파일들을 만들어보자.

Page 223: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 223

Ÿ application\views\board\index.php

<h2>여기는�게시판�목록�페이지(board/index)입니다.</h2>

<p>이� 페이지는� http://127.0.0.1/board� 또는� http://127.0.0.1/board/index� 로� 접근할� 수� 있습니

다.</p>

<ul�class="board-list">

<li><a�href="/board/view/1">1번�게시물�예제입니다.(2014.08.13)</a></li>

<li><a�href="/board/view/2">2번�게시물�예제입니다.(2014.08.13)</a></li>

<li><a�href="/board/view/3">3번�게시물�예제입니다.(2014.08.13)</a></li>

<li><a�href="/board/view/4">4번�게시물�예제입니다.(2014.08.13)</a></li>

<li><a�href="/board/view/5">5번�게시물�예제입니다.(2014.08.13)</a></li>

</ul>

<button�onclick="location.href='/board/write'">글쓰기</button>

Ÿ application\views\board\write.php

<h2>여기는�게시판�글�보기(board/index)입니다.</h2>

<p>이�페이지는�http://127.0.0.1/board/view/글번호�와�같이�접근할�수�있습니다.</p>

<div�class="board-view">

<h2><?php�echo�$idx;?>�번�글을�보고�계십니다.</h2>

</div>

<button�onclick="location.href='/board/index'">목록으로</button>

마지막에 view.php에 보면 변수 $idx가 포함된 것을 볼 수 있다. 이는 view($idx)에

서 받아온 값이다.

board가 실행된 각각의 화면을 보면 다음과 같다.

Page 224: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 224

Page 225: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 225

기타 메뉴에 있는 것이니 사이트맵도 만들어보자.

Ÿ application\controller\sitemap.php

<?php

class�Sitemap�extends�Controller

{

�public�function�index()

�{

��require�'application/views/_templates/header.php';

��require�'application/views/sitemap/index.php';

��require�'application/views/_templates/footer.php';

�}

}

Page 226: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 226

Ÿ application\views\sitemap\index.php

<h2>여기는�사이트맵�페이지(sitemap)입니다.</h2>

<p>이� 페이지는� http://127.0.0.1/board� 또는� http://127.0.0.1/board/index� 로� 접근할� 수� 있습니

다.</p>

여기까지 해서 mvc 기본 구조를 이해할 수 있는 예제를 만들어 보았다.

PHP MVC Part 1 예제는 전부 아래 링크에서 다운받을 수 있다.

다운로드: http://webskills.kr/php-mvc/php-mvc-simple-htdocs-1.zip

온라인데모 : http://webskills.kr/php-mvc/

PHP MVC Part 2 에서는 이 예제에 데이터베이스를 연결하여 model 부분까지 구

현한 예제를 만들어볼 것이다.

PHP MVC Part 3 에서는 데이터 수정, 삭제 코드를 구현할 것이다.

PHP MVC Framework

PHP MVC Framework는 PHP로 MVC 어플리케이션을 쉽게 작성할 수 있도록 거의 모든 기능들을 미리

구현해놓은 프로그램이다. PHP는 꽤 많은 MVC 프레임워크를 가지고 있는데 다음과 같은 것들이다. 이 중에

서 2017년 12월 말 현재 가장 많이 사용되는 것은 Laravel이다.

F Laravel

F Yii

F Codeigniter

F Symfony

F CakePHP

F Zend

Page 227: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 227

PHP MVC Part 2PHP MVC Part 1 에서는 php mvc 패턴의 기본적인 이해를 돕기 위해 model 부분

은 빼고 페이지 구성과 연결 관계를 알아보는데 주력했다. 이제 여기서는 데이터

베이스를 포함한 어플리케이션을 구성해보기로 하자. 즉 model 부분을 구성하여

데이터베이스을 어떻게 처리하는지 경험해볼 것이다.

¡ 데이터베이스 준비

XAMPP나 기타 웹서버를 사용하고 MySql 데이터베이스를 사용한다면

phpMyAdmin 응용프로그램을 잘 알 것이다. 지금부터 MySql에 데이터베이스와

테이블을 만들고 임시 데이터를 입력해보자.

Ÿ database , table 만들고 데이터 입력하기

phpMyAdmin을 실행하고 화면에서 [데이터베이스]를 선택한 후 표시되는 화면에

서 [새 데이터베이스 만들기] 아래의 입력대화상자에 데이터베이스명 "mymvc”를

입력하고 데이터정렬방식으로 "utf8_general_ci”를 선택한 후 [만들기] 버튼을 누르

면 데이터베이스 "mymvc”가 생성된다.

Page 228: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 228

이제 만들어진 데이터베이스에 테이블 "board”를 만들어보자. 데이터베이스를 만

들고 나면 목록에 데이터베이스명 "mymvc”가 표시된다. 이 이름을 클릭하면 데이

터베이스 선택 화면으로 이동하고 테이블을 만들 수 있는 인터페이스가 표시된다.

테이블 명에 "board”를 입력하고 칼럼수를 5로 입력하여 실행버튼을 누른다.

Page 229: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 229

키 이름 종류 고유값 압축됨 컬럼명 관계성 데이터정렬방식 Null 설명PRIMARY BTREE 예 아니오 idx 10 A 아니오

테이블 board의 칼럼 구조는 다음과 같다.

[board]

컬럼명 종류 Null 기본값 설명 MIMEidx int(11) 아니오title varchar(100) 아니오content text 아니오writer varchar(20) 아니오wdate datetime 아니오

[index]

이제 만들어진 테이블에 데이터를 입력해보자. 아직 웹 어플리케이션에서 입력폼을 만들지 않았

으므로 phpMyAdmin에서 [삽입] 버튼을 눌러 직접 입력하면 된다. 물론 idx 칼럼은 자동으로 증

가하므로 입력하지 않아도 된다.

Page 230: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 230

데이터를 10개 쯤 입력해보자. 아래 SQL문은 board 테이블에 10개의 데이터를 입

력할 수 있는 코드이다. phpMyAdmin에서 데이터베이스와 테이블을 선택한 후에

화면에서 [SQL]을 선택하여 아래 코드를 복사해서 붙여넣고 [실행]하면 데이터가

입력된다.

INSERT�INTO�`board`�(`idx`,�`title`,�`content`,�`writer`,�`wdate`)�VALUES

(1,�'mvc란�무언인가?',�'Model–view–controller�(MVC)�is�a�software�architectural�pattern�for�

implementing�user�interfaces.�It�divides�a�given�software�application�into�three�interconnected�

parts,�so�as�to�separate�internal�representations�of�information�from�the�ways�that�information�is�

presented�to�or�accepted�from�the�user.',�'mvc�tester',�'2014-08-14�06:11:22'),

(2,�'Model이란�무엇인가?',�'A�model�notifies�its�associated�views�and�controllers�when�there�has�

been�a�change�in�its�state.�This�notification�allows�the�views�to�produce�updated�output,�and�the�

controllers�to�change�the�available�set�of�commands.�In�some�cases�an�MVC�implementation�might�

instead�be�"passive,"�so�that�other�components�must�poll�the�model�for�updates�rather�than�being�

notified.',�'admin',�'2014-08-14�03:10:08'),

(3,�'View란�무엇인가?',�'A�view�requests�information�from�the�model�that�it�uses�to�generate�an�

output�representation�to�the�user.',�'관리자',�'2014-08-14�02:01:05'),

(4,�'Controller란�무엇인가?',�'A�controller�can�send�commands�to�the�model�to�update�the�model''s�

state�(e.g.,�editing�a�document).�It�can�also�send�commands�to�its�associated�view�to�change�the�

view''s� presentation� of� the� model� (e.g.,� by� scrolling� through� a� document).',� '홍길동',�

'2014-08-14�02:06:09'),

(5,�'History�of�MVC�pattern',�'MVC�was�one�of�the�seminal�insights�in�the�early�development�of�

graphical�user�interfaces,�and�one�of�the�first�approaches�to�describe�and�implement�software�

constructs�in�terms�of�their�responsibilities.[9]\r\n\r\nTrygve�Reenskaug�introduced�MVC�into�

Smalltalk-76�while�visiting�Xerox�Parc[10][11]�in�the�1970s.�In�the�1980s,�Jim�Althoff�and�others�

implemented�a�version�of�MVC�for�the�Smalltalk-80�class�library.�It�was�only�later,�in�a�1988�

article� in� The� Journal� of� Object� Technology,� that� MVC� was� expressed� as� a� general�

concept.[12]\r\n\r\nThe�MVC�pattern�has�subsequently�evolved,[13]�giving�rise�to�variants�such�as�

HMVC,� MVA,� MVP,� MVVM,� and� others� that� adapted� MVC� to� different� contexts.',� '프로래머',�

'2014-08-14�03:13:06'),

(6,�'Search�engine�optimization',�'Search�engine�optimization�(SEO)�is�the�process�of�affecting�

the�visibility�of�a�website�or�a�web�page�in�a�search�engine''s�"natural"�or�un-paid�("organic")�

search�results.�In�general,�the�earlier�(or�higher�ranked�on�the�search�results�page),�and�more�

frequently�a�site�appears�in�the�search�results�list,�the�more�visitors�it�will�receive�from�the�

search�engine''s�users.�SEO�may�target�different�kinds�of�search,�including�image�search,�local�

search,� video� search,� academic� search,[1]� news� search� and� industry-specific� vertical� search�

engines.\r\n\r\nAs�an�Internet�marketing�strategy,�SEO�considers�how�search�engines�work,�what�

people�search�for,�the�actual�search�terms�or�keywords�typed�into�search�engines�and�which�search�

engines�are�preferred�by�their�targeted�audience.�Optimizing�a�website�may�involve�editing�its�

content,�HTML�and�associated�coding�to�both�increase�its�relevance�to�specific�keywords�and�to�

remove�barriers�to�the�indexing�activities�of�search�engines.�Promoting�a�site�to�increase�the�

number� of� backlinks,� or� inbound� links,� is� another� SEO� tactic.\r\n\r\nThe� plural� of� the�

abbreviation�SEO�can�also�refer�to�"search�engine�optimizers",�those�who�provide�SEO�services.',�

'개발자',�'2014-08-14�01:03:13'),

(7,�'What�is�the�Rewrite�engine?',�'A�rewrite�engine�is�software�located�in�a�Web�application�

framework�running�on�a�Web�server�that�modifies�a�web�URL''s�appearance.�Many�framework�users�have�

come�to�refer�to�this�feature�as�a�"Router".�This�modification�is�called�URL�rewriting.�Rewritten�

URLs�(sometimes�known�as�short,�pretty�or�fancy�URLs,�search�engine�friendly�-�SEF�URLs,�or�slugs)�

Page 231: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 231

are�used�to�provide�shorter�and�more�relevant-looking�links�to�web�pages.�The�technique�adds�a�

layer�of�abstraction�between�the�files�used�to�generate�a�web�page�and�the�URL�that�is�presented�

to�the�outside�world.',�'Rewriter',�'2014-08-14�01:05:18'),

(8,�'What�is�.htaccess?',�'A�.htaccess�(hypertext�access)�file�is�a�directory-level�configuration�

file�supported�by�several�web�servers,�that�allows�for�decentralized�management�of�web�server�

configuration.�They�are�placed�inside�the�web�tree,�and�are�able�to�override�a�subset�of�the�

server''s� global� configuration� for� the� directory� that� they� are� in,� and� all�

sub-directories.[1]\r\n\r\nThe�original�purpose�of�.htaccess—reflected�in�its�name—was�to�allow�

per-directory�access�control,�by�for�example�requiring�a�password�to�access�the�content.�Nowadays�

however,�the�.htaccess�files�can�override�many�other�configuration�settings�including�content�

type�and�character�set,�CGI�handlers,�etc.',�'아파치',�'2014-08-14�03:06:09'),

(9,�'About�Apache�HTTP�Server',�'he�Apache�HTTP�Server,�commonly�referred�to�as�Apache�(/əˈpætʃiː/�ə-pa-chee),�is�a�web�server�application�notable�for�playing�a�key�role�in�the�initial�growth�of�the�World�Wide�Web.[3]�Originally�based�on�the�NCSA�HTTPd�server,�development�of�Apache�began�in�

early�1995�after�work�on�the�NCSA�code�stalled.�Apache�quickly�overtook�NCSA�HTTPd�as�the�dominant�

HTTP�server,�and�has�remained�the�most�popular�HTTP�server�in�use�since�April�1996.�In�2009,�it�

became�the�first�web�server�software�to�serve�more�than�100�million�websites.[4]\r\n\r\nApache�is�

developed�and�maintained�by�an�open�community�of�developers�under�the�auspices�of�the�Apache�

Software�Foundation.�Most�commonly�used�on�a�Unix-like�system,[5]�the�software�is�available�for�a�

wide�variety�of�operating�systems,�including�Unix,�FreeBSD,�Linux,�Solaris,�Novell�NetWare,�OS�X,�

Microsoft�Windows,�OS/2,�TPF,�OpenVMS�and�eComStation.�Released�under�the�Apache�License,�Apache�

is�open-source�software.',�'관리자',�'2014-08-14�04:06:27'),

(10,�'What�is�PHP?',�'PHP�is�a�server-side�scripting�language�designed�for�web�development�but�

also�used�as�a�general-purpose�programming�language.�As�of�January�2013,�PHP�was�installed�on�more�

than� 240� million� websites� (39%� of� those� sampled)� and� 2.1� million� web� servers.[4]� Originally�

created�by�Rasmus�Lerdorf�in�1994,[5]�the�reference�implementation�of�PHP�(powered�by�the�Zend�

Engine)�is�now�produced�by�The�PHP�Group.[6]�While�PHP�originally�stood�for�Personal�Home�Page,[5]�

it�now�stands�for�PHP:�Hypertext�Preprocessor,�which�is�a�recursive�acronym.[7]\r\n\r\nPHP�code�

can�be�simply�mixed�with�HTML�code,�or�it�can�be�used�in�combination�with�various�templating�

engines�and�web�frameworks.�PHP�code�is�usually�processed�by�a�PHP�interpreter,�which�is�usually�

implemented�as�a�web�server''s�native�module�or�a�Common�Gateway�Interface�(CGI)�executable.�After�

the�PHP�code�is�interpreted�and�executed,�the�web�server�sends�resulting�output�to�its�client,�

usually�in�form�of�a�part�of�the�generated�web�page�–�for�example,�PHP�code�can�generate�a�web�

page''s�HTML�code,�an�image,�or�some�other�data.�PHP�has�also�evolved�to�include�a�command-line�

interface� (CLI)� capability� and� can� be� used� in� standalone� graphical� applications.[8]',� 'PHP',�

'2014-08-14�10:05:28');

이렇게 해서 데이터베이스와 테이블을 만들고 데이터를 입력하였다. 이제 이 데이

터베이스를 활용하여 mvc 코드에서 데이터를 보여주고 입력하고 수정 또는 삭제

하는 코드를 만들어보기로 하자.

Ÿ config.php 수정하기

이전 강좌에서 config.php는 아래와 같이 간단히 에러리포팅 관련 설정과 URL 상

수만 정의하였다.

Page 232: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 232

<?php

error_reporting(E_ALL);

ini_set("display_errors",�1);

define('URL',�'http://127.0.0.1/');

이제는 데이터베이스를 사용하기 위해 DB 관련 설정을 추가해보자.

<?php

error_reporting(E_ALL);

ini_set("display_errors",�1);

define('URL',�'http://127.0.0.1/');

define('DB_TYPE',�'mysql');

define('DB_HOST',�'127.0.0.1');

define('DB_NAME',�'mymvc');

define('DB_USER',�'root');

define('DB_PASS',�'');

특별한 사항은 없다. 다만 DB_TYPE 상수에 mysql이라고 값을 넣은 것은 이전의

mysql_connect에서는 사용하지 않던 값인데 여기서는 PDO를 사용할 예정이므로

DB_TYPE를 정의한 것이다. 이 값들은 뒤에 살펴볼 controller.php 수정에서 db 연

결 시에 사용된다.

Ÿ controller.php 수정하기

이전 강좌에서 controller.php는 클래스를 생성한 것 말고는 내용이 아무 것도 없

었다. 여기서는 데이터베이스 연결 관련 코드를 추가해보자. 여기서 추가할 작업은

controller가 실행될 때 데이터베이스를 연결하고 콘트롤러에서 db를 사용할 수

있도록 model 관련 설정이다.

<?php

class�Controller

{

�public�$db�=�null;

�function�__construct()

�{

��$this->dbConnect();

Page 233: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 233

�}

�private�function�dbConnect()

�{

��$options� =� array(PDO::ATTR_DEFAULT_FETCH_MODE� =>� PDO::FETCH_OBJ,� PDO::ATTR_ERRMODE� =>�

PDO::ERRMODE_WARNING);

��$this->db�=�new�PDO(DB_TYPE�.�':host='�.�DB_HOST�.�';dbname='�.�DB_NAME�.�';charset=utf8',�

DB_USER,�DB_PASS,�$options);

�}

�public�function�loadModel($model_name)

�{

��require�'application/models/'�.�strtolower($model_name)�.�'.php';

��return�new�$model_name($this->db);

�}

}

수정된 controller.php 코드들에 대해 살펴보자.

public�$db�=�null;

이 코드는 앞으로 생성할 데이터베이스 연결객체의 변수명 $db를 null 값으로 초

기화 하는 것이다.

function�__construct()

{

$this->dbConnect();

}

이 메서드는 첫 번째 강좌에서 설명한 것처럼 클래스 생성자이다. 클래스가 실행

되자마자 실행되는 메서드이다. 여기서는 이 클래스 안에 포함된 dbConnect() 라

는 메서드를 실행하도록 코딩되어 있다. 즉 앞으로는 콘트롤러를 실행하면 무조건

데이터베이스를 연결하는 메서드를 실행하게 된다. 따라서 데이터베이스가 준비되

어 있지 않거나 config.php에 데이터베이스 연결 관련 설정이 바르게 추가되어 있

지 않다면 에러가 발생할 것이다.

Page 234: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 234

private�function�dbConnect()

{

�$options� =� array(PDO::ATTR_DEFAULT_FETCH_MODE� =>� PDO::FETCH_OBJ,� PDO::ATTR_ERRMODE� =>�

PDO::ERRMODE_WARNING);

�$this->db� =� new� PDO(DB_TYPE� .� ':host='� .� DB_HOST� .� ';dbname='� .� DB_NAME� .� ';charset=utf8',�

DB_USER,�DB_PASS,�$options);

}

이 메서드는 데이터베이스를 연결하고 그 결과로 DB 연결객체 $db 를 생성하는

코드를 포함하고 있다.

여기서 핵심적인 부분은 $this->db = new PDO(…) 부분이다. PDO DB connection

은 아래와 같다.

$db�=�new�PDO('mysql:host=localhost;dbname=mydb;charset=utf8',�'user',�'pass');

new�PDO(DB_TYPE�.�':host='�.�DB_HOST�.�';dbname='�.�DB_NAME�.�';charset=utf8',�DB_USER,�DB_PASS,�

$options);

위 코드에서 DB_TYPE과 DB_HOST, DB_NAME, DB_USER, DB_PASS는 config.php

에서 정의한 상수이므로 이 상수들에 대입된 값을 적용해보면 이 코드는

‘mysql:host=127.0.0.1;dbname=mymvc;charset=utf8′,’root’,”,$options) 가 된다. 여

기서 추가된 $options는 아래와 같이 배열로 저장한 설정값들이 포함된다.

$options� =� array(PDO::ATTR_DEFAULT_FETCH_MODE� =>� PDO::FETCH_OBJ,� PDO::ATTR_ERRMODE� =>�

PDO::ERRMODE_WARNING);

F PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ

위 설정은 db에서 select 된 값을 fetch 할 때 적용하는 모드이다. 여기서는

Page 235: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 235

FETCH_OBJ로 설정했다. FETCH_OBJ는 $row->title 과 같이 데이터를 출력할 수 있

는 모드이다.

PDO의 fetch 모드에 대해 간단히 살펴보면 아래와 같은 것들이 있다.

PDO::FETCH_ASSOC : 추출된 데이터를 칼럼명으로 구분하는 배열로 반환

($row[‘title’])

PDO::FETCH_NUM : 추출된 데이터를 칼럼 번호로 구분하는 배열로 반환, 첫 번째

칼럼은 0 ($row[0])

PDO::FETCH_BOTH : 칼럼명과 번호로 모두 접근 가능한 배열 반환

PDO::FETCH_OBJ : 레코드 셋을 객체로 반환하며 $row->title 과 같이 접근가능

이 외에서 몇 가지 모드가 더 있다. 기타 fetch 스타일에 관한 정보는 아래 링크를

통해 알아보자.

http://php.net/manual/en/pdostatement.fetch.php�

DB를 연결할 때 PDO는 별도의 fetch 모드를 정해주지 않으면 PDO::FETCH_BOTH

가 기본 값이 된다.

F PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING

이 부분은 에러가 발생할 때 어떻게 처리할 지를 정하는 부분인데

PDO::ERRMODE_WARNING 은 에러가 발생하면 이를 표시해주도록 하고 있다.

ATTR_ERRMODE의 값으로는 PDO::ERRMODE_WARNING 외에도

PDO::ERRMODE_SILENT,

PDO::ERRMODE_EXCEPTION 이 있다. PDO::ERRMODE_SILENT는 에러가 발생해도

이를 표시하지 않도록 하며 PDO::ERRMODE_EXCEPTION는 예외처리 설정에

따르도록 하고 있다.

Page 236: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 236

public�function�loadModel($model_name)

{

require�'application/models/'�.�strtolower($model_name)�.�'.php';

return�new�$model_name($this->db);

}

이 부분은 각각의 콘트롤러에서 model 파일을 열어 실행하고 새로운 model 객체

를 생성하도록 하고 있다. 앞으로 model을 불러오려면 $board_model =

$this->loadModel(‘BoardModel’); 과 같은 형식으로 하면 된다.

strtolower($model_name) 코드는 입력된 모델 이름이 대문자를 포함하고 있더라

도 모두 소문자로 변환해 파일명을 지정하기 때문에 앞으로 model 파일은 반드시

소문자로만 저장해야 할 것이다.

return new $model_name($this->db); 코드는 불러들인 model 파일로부터 새로는

model 객체를 생성하여 반환해준다. 이 때 DB 연결객체($this->db) 파라미터로

함께 넘겨준다. loadModel(‘BoardModel’)과 같이 호출하였다면,

applicaion/model/boardmodel.php 파일을 읽어들이고, DB 연결 객체를 파라미터

로 넘기며 객체 BoardModel을 생성한다.

¡ model 파일 만들기

이제 실제로 사용할 model 파일을 만들어보기로 하자. 이전의 강좌에서는 model

파일을 만들지 않았는데 이제 board를 연결할 모델을 하나 만들어보자.

application\models 폴더에 boardmodel.php를 아래의 코드를 포함해 저장해보

자.

Page 237: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 237

Ÿ application\models\boardmodel.php

<?php

class�BoardModel

{

�function�__construct($db)�{

��try�{

���$this->db�=�$db;

��}�catch�(PDOException�$e)�{

���exit('데이터베이스�연결에�오류가�발생했습니다.');

��}

�}

�public�function�getBoardList()

�{

��$sql�=�"SELECT�idx,title,writer,wdate�FROM�board";

��$query�=�$this->db->prepare($sql);

��$query->execute();

��return�$query->fetchAll();

�}

�public�function�getBoardView($idx)

�{

��$sql�=�"SELECT�*�FROM�board�where�idx={$idx}";

��$query�=�$this->db->prepare($sql);

��$query->execute();

��return�$query->fetch();

�}

}

코드를 보면 클래스 명이 BoardModel인 것을 알 수 있다. 이 클래스 안에는 기본

적으로 DB 연결객체를 받아서 객체로 지정하는 생성자 __construct($db) 와 게시

판 리스트를 추출할 때 호출할 getBoardList() 메서드, 글 보기 때 호출할

getBoardView($idx) 메서드가 포함되어 있다. 각각을 살펴보자.

function�__construct($db)�{

try�{

$this->db�=�$db;

}�catch�(PDOException�$e)�{

exit('데이터베이스�연결에�오류가�발생했습니다.');

}

}

Page 238: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 238

이 코드는 $model_name($this->db) 와 같이 객체를 생성할 때 받아온 DB 연결

객체를 클래스 자신의 프라퍼티로 만들어 주는 과정이다. try{ //…} catch() {/…} 구

문은 try 구문 안에서 원하는 작업을 수행하고 이 때 에러가 발생하면 catch 구문

이 처리되도록 한다. 여기서는 파라미터로 받아온 $db를 $this->db로 저장하며 이

때 에러가 발생하면 ‘데이터베이스 연결에 오류가 발생했습니다’라는 메시지를 출

력하며 작업을 종료하도록 하고 있다. 문제가 없다면 $this->db에 DB 연결 객체가

저장될 것이다.

public�function�getBoardList()

{

$sql�=�"SELECT�idx,title,writer,wdate�FROM�board";

$query�=�$this->db->prepare($sql);

$query->execute();

return�$query->fetchAll();

}

이 메서드는 board 테이블로부터 모든 행을 반환 받아 그 결과를 반환하는 기능을

한다. PDO의 메서드를 사용하므로 mysql_connect를 사용하던 학생들에게는 생소

할 수 있지만 알고보면 훨씬 쉽다.

아마도 $query = $this->db->prepare($sql); 부분이 가장 생소할 것이다. 이것은

쿼리 문을 실행하기 전에 미리 준비하는 것으로 구문이나 데이터의 오류를 미리

체크하도록 한다. 이 방법을 사용하면 SQL injection 같은 공격을 미리 막을 수 있

다. 이렇게 미리 준비한 후에는 $query->execute(); 구문으로 쿼리를 실행하게 되

고, return $query->fetchAll(); 구문을 통해 모든 결과를 fetch하여 모든 행에 대한

추출결과를 반환한다.

public�function�getBoardView($idx)

{

$sql�=�"SELECT�*�FROM�board�where�idx={$idx}";

$query�=�$this->db->prepare($sql);

Page 239: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 239

$query->execute();

return�$query->fetch();

}

이 코드는 view.php 페이지에서 보게 될 게시글의 내용 보기를 위한 메서드이다.

이 메서드는 $idx 즉 글 번호를 기본적으로 받아오게 되어 있다. 물론 완벽하게 완

성되는 코드에는 만일 $idx가 전달되지 못한 경우와 $idx가 정수가 아닌 경우 등

을 모두 걸러내도록 해야겠지만 여기서는 일단 생략한다.

이 메서드는 getBoardList()메서드와 비슷하지만 마지막에 fetchAll 대신에 fetch를

사용한 것이 다르다. 이 것은 보통 반복문 속에서 다음의 레코드 한 줄을 반환하는

데 여기서는 하나의 행이 추출되었으므로 그 하나의 행을 배열로 변환하여 반환하

게 된다.

이 결과는 나중에 $row->title 과 같은 형식으로 받을 수 있다.

¡ board 콘트롤러 수정하기

이전 강좌에서 board 콘트롤러를 만든 적이 있다. 그러나 아직 DB 연결 전이라

model 부분은 생략되어 있었다. 이제 model 파일을 만들었으므로 이를 불러와 처

리하는 코드로 수정해보자.

Ÿ application\controller\board.php

<?php

class�Board�extends�Controller

{

public�function�index()

{

$board_model�=�$this->loadModel('BoardModel');

$board_list�=�$board_model->getBoardList();

Page 240: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 240

require�'application/views/_templates/header.php';

require�'application/views/board/index.php';

require�'application/views/_templates/footer.php';

}

public�function�write()

{

require�'application/views/_templates/header.php';

require�'application/views/board/write.php';

require�'application/views/_templates/footer.php';

}

public�function�view($idx)

{

$board_model�=�$this->loadModel('BoardModel');

$board_view�=�$board_model->getBoardView($idx);

require�'application/views/_templates/header.php';

require�'application/views/board/view.php';

require�'application/views/_templates/footer.php';

}

}

이전 강좌의 코드에 몇 줄이 추가된 것을 제외하고는 큰 변화는 없다. 먼저 index

메서드를 살펴보자. 다음의 코드가 추가되었다.

$board_model�=�$this->loadModel('BoardModel');

$board_model = $this->loadModel(‘BoardModel’); 코드는 모델을 불러와 클래스

를 생성하고 이를 $board_model에 저장하는 코드이다. loadModel 메서드는 앞에

서 만든 controller.php에 저장되어 있는데 어떻게 이 파일에서 호출할 수 있을까?

그것은 이 콘트롤러가 선언된 부분을 살펴보면 알 수 있다.

class�Board�extends�Controller

위 코드를 보면 이미 설명한 바 있듯이 Board 라는 클래스를 생성하면서

Controller 라는 클래스를 상속받도록 한 것이다. 이렇게 하면 controller.php에 있

는 Controller 클래스가 실행되고 그 클래스에 포함된 프라퍼티와 메서드가 Board

Page 241: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 241

에도 그대로 적용되는 것이다.

$board_list�=�$board_model->getBoardList();

이 코드는 클래스 BoardModel 안에 포함된 메서드 getBoardList()를 호출하여 반

환된 결과를 $board_list에 저장하도록 한다. boardmodel.php 파일을 살펴보면

board 테이블을 select 하여 그 결과를 반환(return)하게 되어 있는데 이를

$board_list가 받아서 저장하는 것이다. $board_list는 실제로 테이블을 select 한

전체 값들이 저장된 배열이고 이 배열은 뒤에서 볼 view 파일인 index.php에서 활

용하게 된다.

$board_model�=�$this->loadModel('BoardModel');

$board_view�=�$board_model->getBoardView($idx);

이 코드는 view 메서드에 추가된 코드이다. 역시 BoardModel 클래스 파일을 열어

model 객체를 생성한다. 그리고 나서 getBoardView($idx)와 같이 하여 하나의 글

내용을 배열로 추출하여 $board_view에 저장한다. 여기서 $idx가 어디서 왔는지

생각해보자. 이 부분은 application\libs\application.php 파일에서 찾아볼 수 있

다. application.php 파일에 보면 콘트롤러를 생성하고 메서드를 호출할 때 첫 번

째와 두 번째 값(주소 끝에 /로 구분되어 입력된 값)을 사용하고 나머지는 파라미

터로 넘기기로 했었다. 따라서 /board/view/3 을 브라우저 주소창에 입력하고 실

행하면 board 콘트롤러 객체를 생성하고 그 속의 view 메서를 실행하며 3은 괄호

() 안에 파라미터로 넘겨주게 된다. 이 첫 번째 파라미터를 $idx 라는 변수로 받은

것이다.

Page 242: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 242

¡ view 파일 수정하기

이전 강좌에서 board 콘트롤러를 위한 view 파일 세 개(index.php, write.php,

view.php)를 만들어 두었다. 그러나 이 view 파일들은 DB 연결 전이라 그냥 텍스

트로 처리하여 화면에 보이게만 하였다. 이제 실제 DB에 저장된 값들을 표시하고

활용하는 view 파일들로 만들어보자.

Ÿ application\views\board\index.php

<h2>여기는�게시판�목록�페이지(board/index)입니다.</h2>

<p>이� 페이지는� http://127.0.0.1/board� 또는� http://127.0.0.1/board/index� 로� 접근할� 수� 있습니

다.</p>

<ul�class="board-list">

<?php�foreach($board_list�as�$row){?>

<li><a� href="/board/view/<?php� echo� $row->idx;?>"><?php� echo� $row->title;?>� /� <?php� echo�

$row->writer;?>�/�<?php�echo�$row->wdate;?></a></li>

<?php�}�//end�foreach?>

</ul>

<button�onclick="location.href='/board/write'">글쓰기</button>

이전 강좌의 코드에서는 이 파일의 ul 태그 안에 여러 줄의 li 태그를 직접 입력하

여 글 내용을 표시하고 링크를 추가했었다.

그러나 여기에서는 앞의 board 콘트롤러가 boardmodel을 생성하고 index 메서드

를 호출하여 반환받은 배열 $board_list를 활용함으로써 실제 DB에 저장된 내용을

목록에 표시하도록 한다.

foreach($board_list�as�$row){//...}

foreach는 배열의 크기에 따라 처음부터 반복하며 값을 추출하여 사용할 수 있도

록 하는 구문이다. foreach($board_list as $row)와 같이 하면 $board_list 배열을

Page 243: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 243

한 줄 씩 추출하여 $row에 저장한다. 따라서 반복이 진행되는 동안 각 행의 값들

은 $row에 저장되므로 실제 출력할 때는 $row 배열을 활용하면 된다.

<li><a� href="/board/view/<?php� echo� $row->idx;?>"><?php� echo� $row->title;?>� /� <?php� echo�

$row->writer;?>�/�<?php�echo�$row->wdate;?></a></li>

이렇게 해서 반복되는 동안 글 번호와 제목, 글쓴이와 날짜가 표시되는 li를 화면

에 출력하게 된다. 나머지 코드는 크게 바뀐 것이 없다.

이제 실제 이 결과가 실행되는지 확인해보자. 예제의 메뉴에서 게시판을 클릭하거

나 주소창에서 http://127.0.0.1/board/ 또는 http://127.0.0.1/board/index 와 같이

입력해보자.

Page 244: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 244

화면에 정상적으로 글 목록이 표시된 것으 확인 할 수 있다. 각각의 리스트는

/board/view/번호 와 같은 링크를 가지고 있으므로 글 목록을 클릭하면 view 메서

드가 실행될 것이다. 물론 번호는 파라미터로 넘겨져 view 메서드가 $idx로 받아

처리하고 그 결과를 반환하게 되어 있다.

이제 글보기의 view인 view.php 파일을 수정해보자.

Ÿ application\views\board\view.php

<h2>여기는�게시판�글�보기(board/index)입니다.</h2>

<p>이�페이지는�http://127.0.0.1/board/view/글번호�와�같이�접근할�수�있습니다.</p>

<div�class="board-view">

<h2><?php�echo�$board_view->idx;?>.�<?php�echo�$board_view->title;?></h2>

<p><?php�echo�$board_view->content;?></p>

<p>글쓴이�:�<?php�echo�$board_view->writer;?></p>

<p>저장일�:�<?php�echo�$board_view->wdate;?></p>

</div>

<button�onclick="location.href='/board/index'">목록으로</button>

코드를 보면 board 콘트롤러에서 boardmodel을 통해 얻어온 데이터 결과

$board_view 배열을 화면에 표시해주는 것으로 변경했다. 이 결과는 어떻게 되는

지 실행해보자.

위 게시판 목록에서 한 줄을 클릭해보면 board view로 넘어간다. 결과를 확인하면

다음과 같다.

Page 245: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 245

이렇게 해서 데이터베이스의 내용을 화면에 목록과 보기로 표시해주는 mvc 프로

그램의 예제를 만들어 보았다. 아래에 전체 PHP MVC Part 2 소스와 온라인 데모

링크를 제공하였다.

다운로드 : http://webskills.kr/php-mvc/v2/php-mvc-simple-htdocs-2.zip

온라인데모 : http://webskills.kr/php-mvc/v2/

다음 글에는 글 쓰기, 삭제, 수정은 어떻게 처리하는지 살펴보기로 하자.

Page 246: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 246

PHP MVC Part 3이 강좌의 앞 두 글에서 mvc의 기본 구현방법과 데이터베이스에 연결하여 데이터

를 표시하는 방법에 대해 살펴보았다. 이제 마지막으로 데이터를 저장하고, 수정,

삭제하는 코드를 추가해보자. 주요 코드에 대한 설명은 이미 앞 두 강좌에서 했으

므로 여기서는 변경되고 추가된 부분만 설명할 것이다.

¡ application\views\board\index.php 수정

board 관련 링크들이 모두 리스트 페이지(index)에 표시되어야 하므로 리스트 페

이지를 수정한다. edit 링크와 delete 링크를 추가하고, 글쓰기 버튼은 이미 있었으

므로 그대로 활용한다. 그리고 delete 버튼은 직접 링크로 처리하기 보다는 자바스

크립트 함수로 만들어 확인후 링크로 이동하도록 처리하였다. 사실 write나 delete,

edit 같은 기능은 경우에 따라서는 보안을 요하는 부분이므로 로그인 관련 코드들

이 추가되거나 외부의 주소 입력에 의한 접근을 차단하기 위해 delete도 post로

값을 넘기거나 해야 하지만 여기서는 그 과정을 생략하고 간단히 처리하였다.

아래 코드는 board의 리스트 페이지의 view 파일인 index.php 파일을 수정한 코

드이다. 이 파일의 위치는 application\views\board 폴더이다.

<h2>여기는�게시판�목록�페이지(board/index)입니다.</h2>

<p>이�페이지는�<?php�echo�URL;�?>board�또는�<?php�echo�URL;�?>board/index�로�접근할�수�있습니

다.</p>

<ul�class="board-list">

<?php�foreach($board_list�as�$row){?>

<li>

�<a�href="<?php�echo�URL;�?>board/view/<?php�echo�$row->idx;?>"><?php�echo�$row->title;?>�/�<?php�

echo�$row->writer;?>�/�<?php�echo�$row->wdate;?></a>&nbsp;

�[<a�href="<?php�echo�URL;�?>board/edit/<?php�echo�$row->idx;?>">edit</a>]&nbsp;

�[<a� href="javascript:confirmDelete('<?php� echo� URL;� ?>board/del/<?php� echo�

$row->idx;?>')">delete</a>]

</li>

<?php�}�//end�foreach?>

Page 247: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 247

</ul>

<button�onclick="location.href='<?php�echo�URL;�?>board/write'">글쓰기</button>

<script>

�function�confirmDelete(url)�{

��if(�confirm('정말�삭제하시겠습니까?')�)�{

���location.href�=�url;

��}

�}

</script>

이렇게 수정한 화면은 다음과 같다.

Page 248: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 248

¡ application\controller\board.php 수정

글 쓰기가 가능혀려면 폼의 내용을 전송받을 링크가 있어야 한다. 이 예제는 mvc

를 위한 것이므로 board 콘트롤러에 폼을 전송받을 메서드가 있어야 한다. 즉

127.0.0.1/board/add 와 같은 주소로 값을 전송하려면 콘트롤러에 add 메서드가

있어야 한다는 것이다. 이런 식으로 글 추가, 수정, 삭제 관련 메스드들을 추가하였

다. 다음은 수정된 board 콘트롤러 board.php 파일의 내용이다.

Ÿ board controller 전체 수정 코드

<?php

class�Board�extends�Controller

{

�public�function�index()

�{

��$board_model�=�$this->loadModel('BoardModel');

��$board_list�=�$board_model->getBoardList();

��require�'application/views/_templates/header.php';

��require�'application/views/board/index.php';

��require�'application/views/_templates/footer.php';

�}

�public�function�write()

�{

��require�'application/views/_templates/header.php';

��require�'application/views/board/write.php';

��require�'application/views/_templates/footer.php';

�}

�public�function�view($idx)

�{

��$board_model�=�$this->loadModel('BoardModel');

��$board_view�=�$board_model->getBoardView($idx);

��require�'application/views/_templates/header.php';

��require�'application/views/board/view.php';

��require�'application/views/_templates/footer.php';

�}

�public�function�add()

�{

��if�(isset($_POST["submit_insert_board"]))�{

���$board_model�=�$this->loadModel('BoardModel');

���$board_model->addBoard($_POST["title"],�$_POST["content"],��$_POST["writer"]);

��}

��header('location:�'�.�URL�.�'board/index');

�}

�public�function�edit($idx)

Page 249: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 249

�{

��$board_model�=�$this->loadModel('BoardModel');

��$board_data�=�$board_model->getBoardView($idx);

��require�'application/views/_templates/header.php';

��require�'application/views/board/edit.php';

��require�'application/views/_templates/footer.php';

�}

�public�function�update()

�{

��if�(isset($_POST["submit_update_board"]))�{

���$board_model�=�$this->loadModel('BoardModel');

���$board_model->updateBoard($_POST["idx"],�$_POST["title"],�$_POST["content"],��

$_POST["writer"]);

��}

��header('location:�'�.�URL�.�'board/index');

�}

�public�function�del($idx)

�{

��$board_model�=�$this->loadModel('BoardModel');

��$board_model->deleteBoard($idx);

��header('location:�'�.�URL�.�'board/index');

�}

}

위에서 보면 add, edit, update, del 세 개의 메서드가 추가되었다. 각각에 대해 살

펴보자.

F add() 메서드

public�function�add()

{

�if�(isset($_POST["submit_insert_board"]))�{

��$board_model�=�$this->loadModel('BoardModel');

��$board_model->addBoard($_POST["title"],�$_POST["content"],��$_POST["writer"]);

�}

�header('location:�'�.�URL�.�'board/index');

}

이 메서드는 write.php 파일의 폼에서 내용을 입력하고 전송 버튼을 눌렀을 때 값

을 전달받을 페이지 역할을 한다. 즉 write.php의 폼에서 action 속성의 값을

127.0.0.1/board/add 와 같이 해주면 이 메서드가 값을 전달 받게 된다.

Page 250: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 250

if�(isset($_POST["submit_insert_board"]))�{�//...�}

이 부분은 뒤에 view 파일인 write.php를 수정하여 submit 버튼의 name을

submit_insert_board 로 하고, 전송 버튼을 눌렀을 대 submit_insert_board가 전송

되었는지를 확인하고 참이면 그 안의 코드를 실행하는 것이다. 이렇게 함으로써

폼의 submit 버튼이 클릭되었을 때만 db 관련 작업을 하도록 할 수 있다.

그리고 BoardModel 클래스를 생성한 후 모델의 addBoard 메서드를 호출하는 다

음 코드가 이어진다.

$board_model->addBoard($_POST["title"],�$_POST["content"],��$_POST["writer"]);

addBoard 메서드를 호출 할 때 세 개의 값을 파라미터로 넘겨주는데 폼으로 부터

전송받은 title, content, writer 의 값들이다.

나중에 boardmodel.php 파일을 수정할 때 addBoard 메서드를 추가하고 위 세 개

의 값을 받아 실제 데이터베이스에 추가(insert)해주도록 코딩을 하면 된다.

header('location:�'�.�URL�.�'board/index');

그리고 위 코드는 게시물 추가 작업 후에 board/index 페이지로 이동하도록 처리

한다.

Page 251: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 251

F edit() 메서드

public�function�edit($idx)

{

�$board_model�=�$this->loadModel('BoardModel');

�$board_data�=�$board_model->getBoardView($idx);

�require�'application/views/_templates/header.php';

�require�'application/views/board/edit.php';

�require�'application/views/_templates/footer.php';

}

이 메서드는 글을 수정하기 위한 페이지를 표시하는 메서드이다. 글 목록에 edit

링크가 있는데 이 링크는 127.0.0.1/board/edit/3 과 같은 url로 연결해준다. 그러

면 이 edit 메서드가 호출되면 파라미터로 $idx를 받아들인다.

코드 안에서는 역시 board 모델을 불러 객체를 생성하고, view 파일인 edit.php를

실행하도록 추가 되어 있다.

$board_data�=�$board_model->getBoardView($idx);

이 코드는 $board_data 에 getBoardView 메서드를 호출하여 얻어온 게시물의 정

보를 배열로 저장한다. 그런데 getBoardView는 이미 글 보기 메서드에서도 사용

한 적이 있다. 수정하기 위하여 데이터를 얻어오는 것이나 보기 위하여 얻어오는

것이나 전혀 다를 것이 없으므로 재활용한 경우이다.

$board_data는 지정된 레코드(줄)의 모든 데이터 값을 저장한 배열인데 이 배열은

edit.php 에서 사용할 수 있다.

F update 메서드

이 메서드는 edit 메서드에서 실행한 edit.php 파일의 수정 폼에서 수정된 값을 전

송할 위치(action)가 된다. 즉 edit.php 파일에서 action의 값을

127.0.0.1/board/update로 하면 이 메서드가 호출되는 것이다. 역시 post로 넘어온

Page 252: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 252

값을 받아 board 모델의 updateBoard 메서드 호출한다. $idx 값을 추가로 넘겨주

는 것은 실제 db에 update를 처리할 때 고유키가 되는 idx 칼럼의 값을 조건으로

처리해야 하기 때문이다.

public�function�update()

{

�if�(isset($_POST["submit_update_board"]))�{

��$board_model�=�$this->loadModel('BoardModel');

��$board_model->updateBoard($_POST["idx"],�$_POST["title"],�$_POST["content"],��

$_POST["writer"]);

�}

�header('location:�'�.�URL�.�'board/index');

}

F del 메서드

이 메서드는 글을 삭제할 때 호출되는 메서드이다.

public�function�del($idx)

{

�$board_model�=�$this->loadModel('BoardModel');

�$board_model->deleteBoard($idx);

�header('location:�'�.�URL�.�'board/index');

}

글번호 $idx를 파라미터로 받아들이고, board 모델의 deleteBoard 메서드를 호출

한 후 목록 페이지로 돌아가도록 코딩되어 있다.

이렇게 해서 콘트롤러 board.php 파일에 추가된 내용을 알아보았다.

Page 253: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 253

¡ view 파일들을 수정 및 추가

Ÿ application\views\board\write.php

이 파일은 글 쓰기 폼이 표시되는 페이지를 구성한다. 콘트롤러의 변경에 따라 일

부 변경하여 아래와 같이 수정해보자.

<h2>여기는�게시판�글�쓰기(board/write)입니다.</h2>

<p>이�페이지는�<?php�echo�URL;�?>board/write/�와�같이�접근할�수�있습니다.</p>

<div�class="board-write">

�<form�action="<?php�echo�URL;�?>board/add"�method="POST">

��<p>글제목�:�<input�type="text"�name="title"�id="title"�style="width:300px;"></p>

��<p>글쓴이�:�<input�type="text"�name="writer"�id="writer"�style="width:200px;"></p>

��<p>글내용�:�<textarea�name="content"�id="content"�

style="width:300px;height:80px;"></textarea></p>

��<p><input�type="submit"�name="submit_insert_board"�value="저장하기">�<button�

onclick="location.href='<?php�echo�URL;�?>board/index'">목록으로</button></p>

�</form>

</div>

크게 바뀐 것은 없지만 <form>문의 내용이 조금 변경되었다.

<form�action="<?php�echo�URL;�?>board/add"�method="POST">

이렇게 함으로써 입력된 데이터를 전송할 주소를 127.0.0.1/board/add 로 설정하

고 전송방식도 POST로 하였다.

<input�type="submit"�name="submit_insert_board"�value="저장하기">

그리고 위와 같이 이전에 일반 버튼이었던 것을 submit 버튼으로 만들어 추가하

였다. submit 버튼의 name이 submit_insert_board 인 것을 앞의 board 콘트롤러

코드에서 활용했던 것을 기억하자.

Page 254: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 254

Ÿ application\views\board\edit.php

이 파일은 전에 없던 것을 새로 추가하는 것이다. write와 거의 같다. value에 값이

입력되도록 한 것과 $idx를 hidden 으로 추가해 준 것 정도가 차이점이다.

<h2>여기는�게시판�글�수정(board/edit/글번호)입니다.</h2>

<p>이�페이지는�<?php�echo�URL;�?>board/edit/글번호와�같이�접근할�수�있습니다.</p>

<div�class="board-write">

�<form�action="<?php�echo�URL;�?>board/update"�method="POST">

��<input�type="hidden"�name="idx"�id="idx"�value="<?php�echo�$board_data->idx;?>">

��<p>글제목�:�<input�type="text"�name="title"�id="title"�style="width:300px;"�value="<?php�echo�

$board_data->title;?>"></p>

��<p>글쓴이�:�<input�type="text"�name="writer"�id="writer"�style="width:200px;"�value="<?php�

echo�$board_data->writer;?>"></p>

��<p>글내용�:�<textarea�name="content"�id="content"�style="width:300px;height:80px;"><?php�echo�

$board_data->content;?></textarea></p>

��<p><input�type="submit"�name="submit_update_board"�value="저장하기">�<button�

onclick="location.href='<?php�echo�URL;�?>board/index'">목록으로</button></p>

�</form>

</div>

목록에서 [edit]를 클릭하면 아래와 같이 화면이 표시된다. 물론 model까지 모두

수정했을 때 정상 작동하므로 여기서는 미리 보여주는 것이다.

Page 255: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 255

¡ model 파일 수정

Ÿ application\models\boardmodel.php

이제 실제 데이터를 저장하거나 업데이트 삭제처리를 위해 model 파일을 수정해

보자. 이전에 만들어 두었던 boardmodel.php 파일에 세 개의 메서드를 추가할 것

인데, 새로운 데이터를 추가하는 addBoard, 기존 데이터를 수정하는

updateBoard, 선택한 레코드를 삭제하는 deleteBoard 메서드이다. 이 메서드들은

모두 콘트롤러(\application\controller\board.php)에서 호출되어 실행되는 것들

이다.

Page 256: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 256

<?php

class�BoardModel

{

�function�__construct($db)�{

��try�{

���$this->db�=�$db;

��}�catch�(PDOException�$e)�{

���exit('데이터베이스�연결에�오류가�발생했습니다.');

��}

�}

�public�function�getBoardList()

�{

��$sql�=�"SELECT�idx,title,writer,wdate�FROM�board";

��$query�=�$this->db->prepare($sql);

��$query->execute();

��return�$query->fetchAll();

�}

�public�function�getBoardView($idx)

�{

��$sql�=�"SELECT�*�FROM�board�where�idx={$idx}";

��$query�=�$this->db->prepare($sql);

��$query->execute();

��return�$query->fetch();

�}

�public�function�addBoard($title,�$content,�$writer)

�{

��$title�=�strip_tags($title);

��$content�=�strip_tags($content);

��$writer�=�strip_tags($writer);

��$sql�=�"INSERT�INTO�board�(title,�content,�writer,�wdate)�VALUES�(:title,�:content,�:writer,�

:wdate)";

��$query�=�$this->db->prepare($sql);

��$query->execute(array(':title'�=>�$title,�':content'�=>�$content,�':writer'�=>�$writer,�

':wdate'�=>�date("Y-m-d�H:i:s")));

�}

�public�function�updateBoard($idx,�$title,�$content,�$writer)

�{

��$idx�=�(int)$idx;

��$title�=�strip_tags($title);

��$content�=�strip_tags($content);

��$writer�=�strip_tags($writer);

��$sql�=�"UPDATE�board�SET�title�=�:title,�content�=�:content,�writer�=�:writer�where�idx�=�:idx";

��$query�=�$this->db->prepare($sql);

��$query->execute(array(':idx'�=>�$idx,�':title'�=>�$title,�':content'�=>�$content,�':writer'�=>�

$writer));

�}

�public�function�deleteBoard($idx)

�{

Page 257: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 257

��$idx�=�(int)$idx;

��$sql�=�"DELETE�FROM�board�where�idx�=�:idx";

��$query�=�$this->db->prepare($sql);

��$query->execute(array(':idx'�=>�$idx));

�}

}

각각의 메서드들을 살펴보자.

F addBoard 메서드

public�function�addBoard($title,�$content,�$writer)

{

�$title�=�strip_tags($title);

�$content�=�strip_tags($content);

�$writer�=�strip_tags($writer);

�$sql�=�"INSERT�INTO�board�(title,�content,�writer,�wdate)�VALUES�(:title,�:content,�:writer,�

:wdate)";

�$query�=�$this->db->prepare($sql);

�$query->execute(array(':title'�=>�$title,�':content'�=>�$content,�':writer'�=>�$writer,�':wdate'�

=>�date("Y-m-d�H:i:s")));

}

이 메서드는 세 개의 값을 받아온다. 이 값을 이 메서드에 넘긴 것은 콘트롤러의

add 메서드이다. 이 메서드 안의 처음 세 줄은 입력받은 값들로부터 html 코드들

을 제거해주기 위해 strip_tags를 사용했다. 이런 부분은 개발자가 환경에 맞게 사

용하면 된다. 예를 들어 태그를 제거하지 않고 특수문자로 변환하거나 문자로 입

력된 값이라도 강제로 정수로 변환한다거나 하는 등등의 작업은 개발자가 결정할

문제이다.

특이한 것은 다음 부분이다.

$sql�=�"INSERT�INTO�board�(title,�content,�writer,�wdate)�VALUES�(:title,�:content,�:writer,�

:wdate)";

레코드 추가를 위한 INSERT 쿼리(Query)문인데 VALUES 부분에 실제 $title,

$content, $writer 등과 같이 받아온 변수를 쓰지 않고 :title, :content, :writer,

Page 258: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 258

:wdate 를 사용했다. 이들은 변수도 상수도 아니고 실제 값도 아니다. 이런 것들을

placeholder라고 하는데 나중에 값을 넣기 위해 우선 빈 공간을 만들어 둔 것이라

고 할 수 있다. 이렇게 하면 쿼리문을 조금 간단하게 할 수도 있고 데이터를 보다

안전하게 처리할 수 있는 장점이 있다. 이 placeholder는 나중에 쿼리문을 실행할

때 다음 코드처럼 배열로 입력된 값들로 순서대로 값을 치환하여 처리한다.

$query->execute(array(':title'�=>�$title,�':content'�=>�$content,�':writer'�=>�$writer,�':wdate'�

=>�date("Y-m-d�H:i:s")));

F updateBoard 메서드

이 메서드도 addBoard 메서드와 거의 같다. 입력받은 값들을 변환하고 UPDATE

구분을 만들고 placeholder와 실제 값들을 치환하여 쿼리문을 실행함으로써 업데

이트를 처리하는 것이다.

public�function�updateBoard($idx,�$title,�$content,�$writer)

{

�$idx�=�(int)$idx;

�$title�=�strip_tags($title);

�$content�=�strip_tags($content);

�$writer�=�strip_tags($writer);

�$sql�=�"UPDATE�board�SET�title�=�:title,�content�=�:content,�writer�=�:writer�where�idx�=�:idx";

�$query�=�$this->db->prepare($sql);

�$query->execute(array(':idx'�=>�$idx,�':title'�=>�$title,�':content'�=>�$content,�':writer'�=>�

$writer));

}

F deleteBoard 메서드

이 메서드는 선택된 레코드를 삭제하는 부분이다. 레코드를 삭제하는데는 다른 데

이터가 필요하지 않으므로 $idx 만을 변수로 받아 DELETE 구분을 생성하고 이를

실행한다. 실제 완성된 프로그램이라면 삭제 부분에 보다 복잡한 인증작업이 이루

어져 있어야 할 것이다. 로그인 되어 있는지, 권한은 있는지 등등이다. 여기서는 인

Page 259: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 259

증관련 코드가 없으니 생략하였다.

public�function�deleteBoard($idx)

{

$idx�=�(int)$idx;

$sql�=�"DELETE�FROM�board�where�idx�=�:idx";

$query�=�$this->db->prepare($sql);

$query->execute(array(':idx'�=>�$idx));

}

PHP MVC Part 3 소스코드 다운로드와 온라인 데모 링크가 아래에 있다.

소스 파일 다운로드 :

http://webskills.kr/php-mvc/v3/php-mvc-simple-htdocs-3.zip

온라인 데모 페이지 : http://webskills.kr/php-mvc/v3/

Page 260: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 260

[부록] Laravel 활용 Todo App 만들기

Page 261: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 261

What is Laravel?

¡ Laravel : PHP MVC Framework

¡ MVC : Model-View-Contorller softerware architectural pattern

Controller

Model

View

사용자

¡ PHP 사용 MVC Framework 중 점유율 가장 높음

https://i2.wp.com/zenofcoding.com/wp-content/uploads/2017/02/php_mvc_frameworks_2017.png

¡ 고급 기능들을 자동화하여 간단히 웹 어플리케이션 개발

Page 262: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 262

Laravel 설치

¡ Before Laravel Install

Ÿ XAMPP 7.1.11 portable 다운로드 및 설치

F https://www.apachefriends.org/ 에서 최신 XAMPP 다운로드 후 설치

Ÿ Composer 설치

Composer는 PHP에서 의존성 관리 도구라고 알려져 있는 소프트웨어로 여러 PHP

패키지를 설치되어 있는 PHP의 버전 또는 환경에 맞게 설치해주는 역할을 한다.

Laravel 설치를 위해서는 Composer가 설치되어 있어야 한다.

https://getcomposer.org/ 에 접속하여 Download 링크에서 Composer-Setup.exe

를 설치한다. https://getcomposer.org/Composer-Setup.exe

Page 263: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 263

설치 중에 PHP 실행 파일 위치를 묻는데 xampp가 설치되어 있다면 다음과 같이

표시될 것이다. 만일 XAMPP를 다른 경로에 설치되어 있다면 php.exe가 있는 경로

를 선택해주면 된다.

¡ Laravel Install

Ÿ Command 사용하여 폴더 이동

F 탐색기에서 cmd 실행

F Windows 탐색기 실행하여 C:\xanpp\htdocs로 이동

Page 264: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 264

F 주소 창 클릭하고 cmd 입력 후 엔터

Ÿ Windows 실행에서 cmd 실행하고 cd 명령어로 폴더 이동하기

F Window( ) + R 키 눌러서 실행 열고 cmd 입력 후 엔터

Page 265: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 265

F 명령 프롬프트에서 cd c:\xampp\htdocs 입력 후 엔터 눌러 이동

Ÿ Composer 설치 여부 확인

F cmd에서 composer 입력 후 엔터

F 아래와 같이 composer 도움말이 표시되면 composer가 설치되었다는 것을 알 수 있음.

Ÿ Composer로 Laravel 설치하기

F Laravel을 htdocs 폴더 아래 todo 폴더에 설치하기

F cmd 창에서 아래 명령 입력 후 엔터

composer�create-project�--prefer-dist�laravel/laravel�todo

아래와 같이 Laravel이 설치되었다. 설치된 버전은 5.4.30으로 xampp 7.1.11 환경

에 맞는 버전으로 자동으로 설치된 것이다.

Page 266: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 266

탐색기에서 todo 폴더가 생성되고 Laravel 파일이 설치된 것을 확인할 수 있다.

Ÿ Laravel 설치 확인하기

Laravel을 htdocs\todo 폴더에 설치하였다. 이제 웹 서버를 실행하고 Laravel이 정

상적으로 설치되었는지 확인하자.

xampp 폴더에서 xampp-control.exe를 실행하여 Apache와 MySql 서버를 Start 시

켜주자.

Page 267: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 267

이제 Apache 옆의 Admin 버튼을 클릭하여 웹 서버를 열어보자. 또는 웹 브라우저

의 주소 창에 http://localhost를 입력하고 엔터를 누르면 다음과 같이 웹 페이지가

열린다.

참고로, Laravel을 설치하기 전에 htdocs 폴더 안의 모든 파일을 미리 삭제해두었

다. 따라서 웹 페이지에 다른 파일이 없으므로 todo 폴더만 다음과 같이 표시될

것이다. todo 폴더를 클릭하면 Laravel 파일들이 보인다.

Page 268: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 268

User가 웹사이트를 방문했을 때 접근해야 하는 사이트는 이 중에 public 이다.

즉, http://localhost/todo/public 에 접근해야 Laravel의 첫 페이지를 열 수 있다.

현재 xampp의 기본 apache 설정에서는 htdocs가 document root이므로 위와 같

이 접근하지만 현실에서는 public 폴더를 document root로 설정하여 웹 서비스를

제공한다. 이와 같이 주소 처리 관련해서 복잡한 문제가 있는데 이는 나중에 다뤄

보기로 하자.

Page 269: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 269

public 폴더에 접근했을 때 표시되는 화면

Ÿ Laravel 설치 주소에서 todo/public 제거하기

F 주소를 http://localhost로 만들기

public 폴더 아래에 있는 .htaccess 파일을 htdocs로 복사해서 붙여 넣는다.

todo 폴더에 있는 server.php를 복사해서 htdocs에 붙여 넣고 index.php로 이름을

변경한 후 다음과 index.php 파일의 마지막 행의 코드를 다음과 같이 수정한다.

F 변경 전

변경�전:�require_once�__DIR__.'/public/index.php';

F 변경 후

변경�후:�require_once�__DIR__.'/todo/public/index.php';

위와 같이 변경 한 후 주소 창에 http://localhost를 입력해보자.

Page 270: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 270

¡ Laravel 환경설정

Ÿ .env 파일 수정

Laravel을 처음 설치하면 .env 파일을 수정하여 환경을 설정해야 한다.

.env 파일은 Laravel을 설치한 root 폴더에 있다. 여기서는 todo 폴더가 이에 해당

한다. 아래는 env 파일 전체이다. 이 중에서 우리는 DB_DATABASE,

DB_USERNAME, DB_PASSWORD 부분만 변경하게 될 것이다. 아래와 같이 내용을

변경하고 저장한다. XAMPP는 초기 설정에 DB 최고관라지인 root에 암호가 없으

므로 암호는 생략했다.

F .env 파일, 굵은 밑줄 빨간 부분이 변경된 내용임

APP_NAME=Laravel

APP_ENV=local

APP_KEY=base64:/p6sWgNlvvcXpfCcNzeSI/74NYRQwIWb4kEJItcq0po=

APP_DEBUG=true

APP_LOG_LEVEL=debug

APP_URL=http://localhost

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=todo

DB_USERNAME=root

DB_PASSWORD=

...

Page 271: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 271

¡ MySql DB 준비

Ÿ todo 데이터 베이스 만들기

앞서 .env 파일을 변경할 때 DB_DATABASE를 todo로 설정했으므로 todo 데이터

베이스가 존재해야 한다.

xampp가 실행된 상태에서 http://localhost/phpmyadmin 주소를 연다.

상단의 데이터베이스 메뉴를 클릭하고 새 데이터베이스 만들기에서 데이터베이스

명에 todo 정렬방식에 utf8_general_ci를 선택하고 만들기 버튼을 클릭한다.

이후에 표시되는 새 테이블 만들기에서는 추가로 할 일이 없으므로 창을 닫아도

된다.

Page 272: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 272

Page 273: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 273

첫 페이지 수정하기

¡ 첫 페이지는 어떻게 표시되는가?

Ÿ route 설정 열어 첫 페이지가 어떻게 표시되는지 확인하기

route는 Laravel에서 쉽게 말하면 주소를 처리해주는 부분이라 할 수 있다. 여기에

서 예를 들어 /home 이라고 주소를 입력했을 때 무엇을 열어서 사용자에게 보여

주어야 할지 설정하는 것이다.

F todo\routes\web.php 열기

Route::get('/',�function�()�{

����return�view('welcome');

});

위 코드는 /에 별다른 옵션 없이 접근했을 때, 즉 http://localhost/ 또는

http://localhost 에 접근했을 때 resources 폴더의 views 폴더에 저장되어 있는

welcome.blade.php 파일을 열어서 보여주도록 되어 있다고 이해하면 된다.

Page 274: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 274

Laravel은 blade라는 템플릿 엔진을 사용하므로 모든 view 파일은 xxx.blade.php와

같이 표시된다.

¡ 첫 페이지 내용 수정 연습

Ÿ 첫 페이지 화면 한 가운데 표시되는 Laravel 텍스트 수정하기

welcome.blade.php 파일을 열어 Laravel을 Todo로 변경해보자.

Page 275: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 275

변경 내용을 저장하고 브라우저에서 http://localhost 를 열어 바뀐 텍스트를 확인

하자.

¡ 새로운 view 파일 생성하여 연결하기

Ÿ home.blade.php 파일 생성하고 이 파일을 첫 페이지로 설정하기

resources\views 폴더에 home.blade.php 파일을 아래와 같이 만들어 저장한다.

<!DOCTYPE�html>

<html�lang="en">

<head>

Page 276: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 276

<meta�charset="UTF-8">

<title>HOME</title>

</head>

<body>

<h1>Hi�Laravel!!!</h1>

</body>

</html>

Ÿ routes 폴더에 아래에 있는 web.php 파일 열어 아래와 같이 수정하기.

Route::get('/',�function�()�{

����return�view('home');

});

변경 내용을 저장하고 브라우저에서 http://localhost 를 열어 새로운 view를 확인

하자.

Ÿ 다시 welcome.blade.php 사용하기

이 교재의 todo 프로젝트는 welcome.blade.php 파일을 수정하여 사용하고자 한

다. 따라서 앞의 home.blade.php 대신에 welcome.blade.php 파일을 view로 사용

하도록 설정하자.

routes 아래의 web.php 파일을 열어 다시 아래와 같이 고쳐준다.

Route::get('/',�function�()�{

����return�view('welcome');

});

Page 277: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 277

에러 방지용 설정 변경(5.4 버전 이상, MariaDB를 사용하는 환경에서)

¡ migration 실행 시 발생하는 에러

PHP 7.1.11 버전의 XAMPP에서 migrate 실행 시 발생하는 에러

PHP 7.1.11과 함께 배포되는 XAMPP 버전에 맞게 설치된 Laravel 5.4.30 버전에서

migration을 실시 하면 다음과 같은 에러가 발생한다.

C:\xampp\htdocs\todo>php artisan migrateMigration table created successfully.In Connection.php line 664: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long;

max key length is 767 bytes (SQ L: alter table `users` add unique `users_email_unique`(`email`))In Connection.php line 458: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long;

max key length is 767 bytesC:\xampp\htdocs\todo>

이 에러는 Laravel 5.4 버전부터 DB의 charset을 utf8mb4로 변경하여 발생하는 문

제로 MySql 5.7.7 또는 더 높은 버전을 사용하는 경우에는 나타나지 않는다. 다만

MariaDB나 낮은 버전의 MySql을 사용하는 경우에는 에러가 발생하므로 이에 대

Page 278: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 278

해 수정해주어야 한다. XAMPP는 MariaDB를 사용한다.

¡ 에러 해결 방법

이와 같은 에러를 해결하기 위해서는 이 에러는 Laravel 5.4 버전부터 DB의

charset을 utf8mb4로 변경하여 발생하는 문제는 Laravel 설치 폴더아래

app\Providers 폴더 아래에 있는 AppServiceProvider.php 파일에 약간의 설정을

해주어 해결할 수 있다.

Ÿ AppServiceProvider.php 원본

<?php

namespace�App\Providers;

use�Illuminate\Support\ServiceProvider;

class�AppServiceProvider�extends�ServiceProvider

{

����/**

�����*�Bootstrap�any�application�services.

�����*

�����*�@return�void

�����*/

����public�function�boot()

����{

��������//

����}

����/**

�����*�Register�any�application�services.

�����*

�����*�@return�void

�����*/

����public�function�register()

����{

��������//

����}

}

Page 279: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 279

Ÿ AppServiceProvider.php 수정본 – 빨간 색 코드가 추가되어 에러 방지

<?php

namespace�App\Providers;

use�Illuminate\Support\ServiceProvider;

use�Illuminate\Support\Facades\Schema;

class�AppServiceProvider�extends�ServiceProvider

{

����/**

�����*�Bootstrap�any�application�services.

�����*

�����*�@return�void

�����*/

����public�function�boot()

����{

��������Schema::defaultStringLength(191);

����}

����/**

�����*�Register�any�application�services.

�����*

�����*�@return�void

�����*/

����public�function�register()

����{

��������//

����}

}

위와 같이 수정하고 php artisan migrate를 실행하면 에러가 발생하지 않는다.

Page 280: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 280

¡ DB 초기화 하기

만일 위의 설명에 따라 AppServiceProvider.php 파일을 수정하기 전에 php

artisan migrate를 cmd에서 실행하여 에러가 발생하는 것을 보았다면 todo 데이

터베이스에 몇 가지 테이블이 만들어져 있을 것이다.

그러나 AppServiceProvider.php 파일을 수정하기 전에 php artisan migrate 명령

을 실행해서 생성된 위 데이터베이스 테이블은 정상적이지 않다. 따라서 todo 테

이블에 보이는 migrations, users 테이블은 삭제하고 새로 migrate 해주어야 한다.

다음과 같이 해서 테이블들을 제거하자.

Ÿ todo 테이블을 열고 migrations, users 테이블 앞의 체크박스를 체크한다.

Ÿ 하단의 [선택한 것을: ▼] 부분을 클릭해서 [삭제]를 클릭한다.

Ÿ “정말로 다음 쿼리를 실행하시겠습니까?” 대화 상자가 나타나면 “예”를 클릭한

다.

Ÿ 위와 같이 하면 todo 데이터베이스에는 테이블이 모두 삭제되었다.

Page 281: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 281

DB 테이블을 모두 삭제하고 초기화 했으며 AppServiceProvider.php 파일을 위 설

명에 따라 수정했다면 todo 폴더에서 cmd 창을 열고 다시 한 번 아래 명령을 입

력해서 마이그레이션을 시도해보자.

Page 282: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 282

php�artisan�migrate

Page 283: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 283

Todo App 만들기

¡ Todo App이란?

Ÿ Todo App이란 “할 일”을 등록하고 관리하는 Web 프로그램이다.

Ÿ 이 앱을 통해서 Laravel의 M-V-C 패턴 구성을 이해할 수 있다.

Ÿ 또한 Auth를 활용하여 간단히 회원 가입 및 로그인 작업을 처리할 수 있다.

¡ tasks 테이블 만들기

Ÿ migration 파일 생성하기

테이블을 만들기 위한 설계도 역할을 하는 migration 파일을 cmd에서 만들어 보

자.

php�artisan�make:migration�create_tasks_table�--create=tasks

위와 같이 하면 날짜와 시간이 앞에 붙은 migration 파일이 생성된다.

xxxx_xx_xx_xxxxxx_create_tasks_table.php

migration 파일이 생성되는 위치는 Laravel이 설치된 폴더 아래 database 폴더 안

에 있는 migrations이다.

예) c:\xampp\htdocs\todo\database\migrations 폴더

Page 284: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 284

Ÿ migration 파일 수정하기

make:migration 으로 생성한 migration 파일에는 가장 기본적인 내용만 포함되어

있다.

<?php

use�Illuminate\Support\Facades\Schema;

use�Illuminate\Database\Schema\Blueprint;

use�Illuminate\Database\Migrations\Migration;

class�CreateTasksTable�extends�Migration

{

����/**

�����*�Run�the�migrations.

�����*

�����*�@return�void

�����*/

����public�function�up()

����{

��������Schema::create('tasks',�function�(Blueprint�$table)�{

������������$table->increments('id');

������������$table->timestamps();

��������});

����}

����/**

�����*�Reverse�the�migrations.

�����*

�����*�@return�void

�����*/

����public�function�down()

����{

��������Schema::dropIfExists('tasks');

����}

}

위에서 public function up() { .... } method 부분이 테이블의 구조를 정의하고 생

성해주는 코드이다.

이제 여기에 할 일을 기록하는 task 라는 필드(칼럼)와 로그인한 사용자의 정보를

저장하는 user_id 필드를 생성하자.

Schema::create('tasks', function (Blueprint $table) { ... } 부분을 다음과 같이 수정

Page 285: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 285

하고 저장하자.

Schema::create('tasks',�function�(Blueprint�$table)�{

����$table->increments('id');

����$table->string('task');

����$table->integer('user_id')->unsigned()->index();

����$table->timestamps();

});

Ÿ migration 실행하여 테이블 생성하기

cmd에서 다음과 같이 입력하여 migration을 실행하면 테이블이 생성된다.

���php�artisan�migrate

Page 286: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 286

¡ Auth로 인증 만들기

Ÿ 로그인, 로그아웃, 패스워드 찾기, 회원가입 만들기

Laravel은 로그인, 로그아웃, 회원가입 및 패스워드 찾기 등과 같은 인증 처리를 쉽

게 만들 수 있다. cmd에서 다음의 명령을 실행하자.

�php�artisan�make:auth

auth를 처리하고 나면 app\resources\layouts\app.blade.php가 생성된다. 이 템

플릿은 기본적인 인증 관련 설정을 코딩한 예제코드이다. 여기서는 이 템플릿을

기본적으로 이용하게 될 것이다.

¡ Model 생성하기

Ÿ 데이터베이스 처리를 위한 Eloquent Model “Task” 만들기

Laravel은 데이터베이스 처리를 위한 방법으로 Eloquent ORM을 제공한다. 이는

데이터들의 관계를 연결하고 처리하는데 최적화되어 있고 매우 쉽게 DB에 접근하

고 작업을 처리할 수 있게 해준다.

make:model 명령 옵션으로 Task 모델 만들기 위해 아래와 같이 실행한다. 이 때

모델의 파일명 첫 글자는 대문자로 시작한다.

Page 287: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 287

���php�artisan�make:model�Task

Task 모델은 Laravel 설치 폴더의 app 폴더 아래에 Task.php로 저장된다.

<?php

namespace�App;

use�Illuminate\Database\Eloquent\Model;

class�Task�extends�Model

{

����//

}

Task 모델이 저장된 app 폴더 아래에는 이미 User.php가 저장되어 있는데 이는

사용자 관리를 위한 모델이다.

¡ Model들 간의 관계 설정하기

Ÿ One-to-Many 관계 설정하기 이해

F 한 사람의 사용자는 여러 개의 task(할일)을 가질 수 있다(hasMany).

F task들은 사용자에게 속해 있다(belongsTo).

F 위와 같은 관계를 설정해주면 개발자는 query를 실행할 필요도 없이 Eloquent가 알아서 데

이터들을 연결해준다.

Page 288: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 288

Ÿ Task에 user에 대한 관계 설정

Task.php 파일을 열고 다음과 같이 수정한다. 빨간색 코드가 추가된 부분이다.

<?php

namespace�App;

use�Illuminate\Database\Eloquent\Model;

class�Task�extends�Model

{

����public�function�user()

����{

���� return�$this->belongsTo(User::class);

����}

}

Ÿ User에 task에 대한 관계 설정

User.php 파일을 열고 다음과 같이 수정한다. 빨간색 코드가 추가된 부분이다.

<?php

namespace�App;

use�Illuminate\Notifications\Notifiable;

use�Illuminate\Foundation\Auth\User�as�Authenticatable;

class�User�extends�Authenticatable

{

����use�Notifiable;

����/**

�����*�The�attributes�that�are�mass�assignable.

�����*

�����*�@var�array

�����*/

����protected�$fillable�=�[

��������'name',�'email',�'password',

����];

����/**

�����*�The�attributes�that�should�be�hidden�for�arrays.

�����*

�����*�@var�array

Page 289: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 289

�����*/

����protected�$hidden�=�[

��������'password',�'remember_token',

����];

����public�function�tasks()

����{

��������return�$this->hasMany(Task::class);

����}

}

¡ Controller 생성하기

Ÿ View와 Model을 연결하는 콘트롤러

Controller는 Laravel과 같은 MVC Framework에서 View와 Model 사이에서 데이터

를 주고 받거나 작업을 처리해주는 일을 한다. 예를 들면 Controller에서 데이터를

읽거나 쓰거나 업데이트 또는 삭제 등과 같은 작업에 대한 명세를 가지고 있으며

이 때 Model과 연결하고 데이터를 View에 넘겨주기도 한다.

Ÿ TasksController 생성하기

아래와 같은 명령 옵션을 실행하여 TasksController를 생성하자.

Controller도 파일 규칙은 첫 글자를 대문자로 하고 Controller를 뒤에 붙이는 방식

으로 한다.

��php�artisan�make:controller�TasksController�--resource

Page 290: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 290

위와 같이 하면 Laravel이 설치된 폴더 아래 app 폴더의 Http 폴더 안에

Controllers 폴더에 TasksController.php가 생성된다.

위 명령어 끝에 추가로 붙은 resource는 있고 없고에 따라 다른 결과를 보여준다.

resource를 붙이지 않았을 때는 아래와 같은 코드가 생성된다.

<?php

namespace�App\Http\Controllers;

use�Illuminate\Http\Request;

class�TasksController�extends�Controller

{

����//

}

반면 resource를 붙인 경우에는 다음과 같이 생성된다. 이 경우 많은 메서드를 포

함하고 있는데 Laravel을 활용한 개발은 거의 이 resource들을 사용하므로 여기서

는 resource를 추가해서 아래와 같은 코드가 생성되도록 하자.

<?php

namespace�App\Http\Controllers;

use�Illuminate\Http\Request;

class�TasksController�extends�Controller

{

����/**

�����*�Display�a�listing�of�the�resource.

�����*

�����*�@return�\Illuminate\Http\Response

�����*/

����public�function�index()

����{

��������//

����}

����/**

�����*�Show�the�form�for�creating�a�new�resource.

Page 291: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 291

�����*

�����*�@return�\Illuminate\Http\Response

�����*/

����public�function�create()

����{

��������//

����}

����/**

�����*�Store�a�newly�created�resource�in�storage.

�����*

�����*�@param��\Illuminate\Http\Request��$request

�����*�@return�\Illuminate\Http\Response

�����*/

����public�function�store(Request�$request)

����{

��������//

����}

����/**

�����*�Display�the�specified�resource.

�����*

�����*�@param��int��$id

�����*�@return�\Illuminate\Http\Response

�����*/

����public�function�show($id)

����{

��������//

����}

����/**

�����*�Show�the�form�for�editing�the�specified�resource.

�����*

�����*�@param��int��$id

�����*�@return�\Illuminate\Http\Response

�����*/

����public�function�edit($id)

����{

��������//

����}

����/**

�����*�Update�the�specified�resource�in�storage.

�����*

�����*�@param��\Illuminate\Http\Request��$request

�����*�@param��int��$id

�����*�@return�\Illuminate\Http\Response

�����*/

����public�function�update(Request�$request,�$id)

����{

Page 292: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 292

��������//

����}

����/**

�����*�Remove�the�specified�resource�from�storage.

�����*

�����*�@param��int��$id

�����*�@return�\Illuminate\Http\Response

�����*/

����public�function�destroy($id)

����{

��������//

����}

}

TasksController에 대한 세부 설정은 뒤에 다루기로 한다.

¡ Routing 설정하기

Ÿ Routing이란?

Routing이란 요청을 받아들이고 요청에 대해 적절한 기능에 연결하는 기능을 말

한다.

Routing은 기본적으로 Laravel 설치 폴더 아래 routes 폴더에 있는 web.php에서

설정한다.

Ÿ Todo App에서 필요한 Route는?

① 회원로그인(Login)

② 회원가입(Register)

③ 할 일 목록(로그인 한 회원의 할 일)

④ 할 일 추가(로그인 한 회원만 가능)

⑤ 할 일 수정(로그인 한 회원만 가능)

⑥ 할 일 삭제(로그인 한 회원만 가능)

Page 293: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 293

Ÿ web.php에서 route 설정하기

회원로그인(Login) 및 가입(Register) route들은 make:auth를 실행함으로써 자동으

로 생성되고 해당 view 들도 자동 생성되었다. 따라서 여기에서는 나머지들에 대

한 route만 설정하면 된다.

F Route 설정 방법

route 설정방법에는 직접 view를 지정해서 view 파일을 설정하는 방법이 있다.

Route::get('/', function () { return view('welcome'); });

또 다른 방법은 콘트롤러의 메서드를 호출하는 방법이 있다.

Route::get('/home', 'HomeController@index')->name('home');

여기에서는 TasksController를 만들었으므로 두 번째 방법을 사용해서 설정할 것

이다.

F 수정 전의 web.php

<?php

/*

...

*/

Route::get('/',�function�()�{

����return�view('welcome');

});

Auth::routes();

Route::get('/home',�'HomeController@index')->name('home');

수정 전의 web.php에는 http://localhost와 같이 홈페이지 root에 접근했을 때

view welcome.blade.php를 보여주도록 되어 있다. 아래 코드가 그것이다.

Route::get('/',�function�()�{

����return�view('welcome');

});

Page 294: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 294

코드의 Auth::routes();는 로그인, 회원가입, 로그인 체크 등의 기능을 사용할 수 있

도록 해준다.

아래의 코드는 http://localhost/home과 같이 접근했을 때 HomeController의

index 메서드를 실행하도록 한다.

Route::get('/home',�'HomeController@index')->name('home');

실제 HomeController.php 내부의 index 메서드 내부에는 return view('home'); 가

포함되어 있어서 home.blade.php view를 보여주도록 하고 있다.

Laravel 5.4.30 버전의 Auth 관련 콘트롤러들을 보면 로그인, 로그아웃, 회원가입

등의 작업 후에 /home으로 redirect 되도록 되어 있는데, 여기서는

HomeController를 사용하지 않을 것이므로 route에서도 삭제한다. 따라서 Auth

관련 콘트롤러들에서 이 부분을 /로 redirect 되도록 바꿔야 한다. 이 작업은 뒤에

처리하도록 하자.

Ÿ web.php 수정하기

<?php

Route::get('/',�'TasksController@index');

Auth::routes();

//Route::get('/task','TasksController@create');

Route::post('/task','TasksController@store');

Route::get('/task/{task}','TasksController@edit');

Route::put('/task/{task}','TasksController@update');

Route::delete('/task/{task}','TasksController@destroy');

∙수정된 web.php를 보면 http://localhost에 접근했을 때 TasksController@index가

작동하는데 이는 TasksController 내부의 index 메서드를 실행하라는 의미이다.

Page 295: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 295

Route::post('/task','TasksController@store'); 코드는 http://localhost/task에 POST

데이터를 전송했을 때 TasksController 내부의 store 메서드를 실행하라는 의미이

다. 이 메서드는 할 일 내용을 실제 DB 테이블에 저장할 때 사용된다. 대개는

Route::get('/task','TasksController@create'); 와 같이 http://localhost/task에 get으

로 접근했을 때 create 메서드를 실행하고 이 메서드는 입력양식(form)을 표시하

고 POST 데이터 전송 주소를 http://localhost/task로 해서 데이터를 저장하도록

하지만 여기서는 폼을 첫 화면의 목록 페이지에 표시할 것이므로 주석 처리하여

실행하지 않도록 하였다.

Route::get('/task/{task}','TasksController@edit'); 은 할 일을 수정하기 위한 폼을 불

러오는 페이지이다. TasksController 내부의 edit 메서드를 실행한다.

Route::put('/task/{task}','TasksController@update'); 은 할 일을 수정폼에서 전송한

데이터를 실제로 저장하는 메서드 update를 TasksController에서 호출한다. 라우

팅 주소 끝에 /{task}는 이 자리에 할 일의 id 값이 전송된다는 것이다. 여기서 특이

한 것은 그동안 보았던 get이나 post 메서드가 아닌 put 메서드가 사용된 것이다.

put은 RESTful API 제작에서 patch와 함께 데이터 수정을 위해 전송하는 method

로 사용된다. 실제로 웹 브라우저에서는 이 데이터를 보낼 때 직접 put 메서드를

사용할 수 없어서 form의 method는 POST로 하고 form 내부에

<input type="hidden" name="_method" value="PUT">

과 같이 추가적인 값을 보내서 처리한다. 이와 같은 작업을 Method Spoofing(메

서드 위장하기)이라고 한다.

Route::delete('/task/{task}','TasksController@destroy'); 은 할 일을 삭제할 때

TasksController의 destroy 메서드를 호출한다. delete 메소드가 사용된 것은 위의

put과 같은 원리이다. 라우팅 주소 끝에 /{task}도 put 과 마찬가지로 이 자리에 할

일의 id 값이 전송된다는 것이다.

Page 296: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 296

Ÿ Auth 관련 Controller에서 /home으로 redirect하는 것을 방지

위에서 Laravel은 기본적으로 로그인 및 회원가입 관련 작업을 마치면 /home으로

redirect 되도록 설정되어 있다고 설명했는데 앞서 routing 설정을 변경하면서

home을 제거했으므로 해당 콘트롤러들에서 이 부분을 변경해야 한다.

변경해야 할 파일 목록은 다음과 같다.

① app\Http\Controllers\Auth\LoginController.php

② app\Http\Controllers\Auth\RegisterController.php

③ app\Http\Controllers\Auth\ResetPasswordController.php

F 변경해야 할 내용

위 세 파일에서 protected $redirectTo = '/home';를 찾아서 아래와 같이 바꾼다.

protected�$redirectTo�=�'/';

¡ 메인 페이지 설정

Ÿ 첫 페이지 View 설정

여기까지 설정하고 http://localhost/를 브라우저에서 열면 어떻게 될까? 화면에 아

무것도 보이지 않는다.

다시 한 번 View가 어떻게 해서 작동하는지 살펴보자.

http://localhost/ 를 브라우저에서 입력하면 routes 아래의 web.php 파일의 아래

코드가 어떤 Controller의 어떤 인덱스를 실행하는지 알려준다. 이 앱에서는 아래

와 같이 설정했다.

Route::get('/',�'TasksController@index');

Page 297: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 297

이 설정에 의해 이 앱은 TasksController 의 index 메서드를 실행한다.

그럼 app\Http\Controllers 아래의 TasksController.php에서 index 메서드를 찾아

보자.

����

public�function�index()

{

�//

}

위와 같이 index 메서드 안에는 어떤 코드도 입려되어 있지 않다. 간단히 테스트

해보기 위해 다음과 같이 고쳐보자. 그리고 웹 브라우저에서 http://localhost/를

열어보자.

public�function�index()

{

����return�"<h1>Hello�Todo!</h1>";

}

index 메서드에서 view 파일을 연결하려면 다음과 같이 하면 된다.

��������return�view(“tasks”);

Page 298: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 298

Ÿ tasks.blade.php 만들고 index 메서드에 연결하기

우선 먼저 tasks.blade.php 파일을 아래와 같이 만들고 resources\views 폴더에 저

장하자.

@extends("layouts.app")

@section("content")

<h1>tasks.blade.php�임시�페이지입니다.</h1>

@endsection

@extends("layouts.app")는 views 폴더의 layouts 폴더에 있는 app.blade.php를 템

플릿 파일로 사용하겠다는 의미이다. 이 템플릿 안에는 @yield('content') 라는 부

분이 있는데 그 부분에 view 파일의 content 섹션의 내용이 보여지는 것이다.

content 섹션은 @section("content") 와 @endsection 사이에 콘텐츠를 포함한 부

분이다.

다음으로 TasksController의 index 메서드를 아래와 같이 수정하고 저장하자.

public�function�index()

{

���return�view("tasks");

}

이제 웹 브라우저에서 http://localhost/를 열어 화면을 확인해보자.

Page 299: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 299

위 화면을 보면 내용은 모두 표시되었는데 CSS 파일의 연결에 문제가 있어 제대

로 표시되지 않았다. app.blade.php 파일을 살펴보면 코드 윗 부분에 아래와 같이

CSS 파일을 연결한 부분이 있다.

<link�href="{{�asset('css/app.css')�}}"�rel="stylesheet">

웹 페이지에서 소스코드 보기를 통해 보면 아래와 같이 바뀌어 있다.

<link�href="http://localhost/css/app.css"�rel="stylesheet">

그런데 실제 app.css의 위치는 /todo/public/css/app.css이다.

위 “{{ asset('css/app.css') }}"를 "/todo/public/css/app.css"로 바꾸고 웹 브라우저에

서 http://localhost/를 열어 화면을 확인해보자.

참고로 app.css에는 구글 폰트와 bootstrap v3.3.7이 포함되어 있다.

Page 300: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 300

app.blade.php 파일의 끝 부분에는 <script src="{{ asset('js/app.js') }}"></script>

와 같은 코드가 있다. 이 또한 나중에 app.js를 연결하는데 문제가 있으므로 다음

과 같이 수정하자.

<script�src="/todo/public/js/app.js"></script>

Ÿ tasks.blade.php 완성하기

이제 메인 페이지를 위한 view tasks.blade.php를 완성하자.

메인 페이지에서 할 일은 다음과 같은 것이다.

① 할 일 추가

② 등록된 나의 할 일 목록

③ 등록된 나의 할 일 목록 수정, 삭제

④ 에러가 있을 경우 에러 표시

F tasks.blade.php 코드

이 코드는 laravel 공식 사이트의 documents 5.2 버전의 예제를 일부 활용하였음

@extends("layouts.app")

@section('content')

<div�class="container">

�<!--�로그인�한�사용자인�경우에만�폼과�목록이�표시됨�-->

�@if�(Auth::check())

�<div>

��<!--�Validation�Error가�있는�경우�보여줌�-->

��@include('common.errors')

��<!--�새�할�일�추가�폼�-->

��<form�action="/task"�method="POST"�class="form-horizontal">

���{{�csrf_field()�}}

���<!--�할�일�입력�텍스트�상자�-->

Page 301: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 301

���<div�class="form-group">

����<label�for="task"�class="col-sm-3�control-label">할�일</label>

�����<div�class="col-sm-6">

�����<input�type="text"�name="task"�id="task"�class="form-control">

�����</div>

����</div>

����<!--�할�일�추가�버튼�-->

����<div�class="form-group">

�����<div�class="col-sm-offset-3�col-sm-6">

������<button�type="submit"�class="btn�btn-default">

�������<span�class="glyphicon�glyphicon-plus"></span>�할�일�추가

������</button>

�����</div>

���</div>

��</form>

�</div>

�<!--�내�할�일�목록�-->

�<div>

��<table�class="table">

���<!--�Table�Headings�-->

���<thead>

����<th>할�일</th>

����<th>&nbsp;</th>

���</thead>

���<!--�Table�Body�-->

���<tbody>

����@foreach($user->tasks�as�$task)

����<tr>

�����<!--�Task�Name�-->

�����<td�class="table-text">

������<div>{{�$task->task�}}</div>

�����</td>

�����<td>

������<!--�수정�삭제�버튼들�-->

������<form�action="/task/{{$task->id}}"�method="POST">

�������<a�href="/task/{{$task->id}}"�class="btn�btn-primary�btn-sm">수정</a>

�������<input�type="hidden"�name="_method"�value="DELETE">

�������<button�type="submit"�name="delete"�class="btn�btn-danger�btn-sm">삭제</button>

�������{{�csrf_field()�}}

������</form>�

�����</td>

����</tr>

����@endforeach

���</tbody>

Page 302: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 302

��</table>

�</div>

�@endif

</div>

@endsection

F 에러 처리에 대비 : errors.blade.php 생성

위와 같이 view: tasks.blade.php를 수정하고 http://localhost를 웹 브라우저에서

열면 어떻게 될까? 아래와 같은 에러 페이지를 만나게 된다.

발생한 첫 번째 에러는 “common.errors”를 찾을 수 없다는 것이다.

View [common.errors] not found....

이 에러는 tasks.blade.php 파일에 있는 @include('common.errors') 와 관련이 있

다. 이 코드는 views 폴더 아래 common 폴더에 errors.blade.php를 include하라는

코드인데 아직 이 파일을 만들지 않았기 때문에 에러가 발생한 것이다.

views 폴더 아래에 common 폴더를 생성하고 이곳에 다음과 같이 error.blade.php

파일을 저장하자.

<!--�resources/views/common/errors.blade.php�-->

@if�(count($errors)�>�0)

����<!--�Form�Error�List�-->

����<div�class="alert�alert-danger">

Page 303: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 303

��������<strong>에러가�있습니다!</strong>

��������<br><br>

��������<ul>

������������@foreach�($errors->all()�as�$error)

����������������<li>{{�$error�}}</li>

������������@endforeach

��������</ul>

����</div>

@endif

errors.blade.php 파일 안의 코드는 예를 들어 Validation 에러가 발생하면 에러 메

시지를 화면에 표시해주는 코드이다. Validation을 어떻게 하는지는 나중에 설명하

기로 한다.

Ÿ TasksController@index 메서드 설정

앞의 view 파일 두 개를 만들고 http://localhost를 열어보자. 여전히 에러가 표시

된다.

Undefined�variable:�user�(View:�C:\xampp\htdocs\todo\resources\views\tasks.blade.php)

위 에러는 user 변수를 찾을 수 없다는 것이다. 이 에러가 발생하는 이유는

@foreach($user->tasks as $task) 문의 $user 때문이다. 메인 페이지 view인

tasks.blade.php가 $user 라는 변수를 전달 받지 못해서 발생한 에러이다. 이 $user

Page 304: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 304

변수를 로그인한 사용자에 대한 정보를 담고 있다.

이 문제를 해결하기 위해서는 TasksController의 index 메서드에서 view에게 $user

변수를 전달해주도록 설정해야 한다.

TasksController의 index 메서드의 코드를 다음과 같이 수정하자.

public�function�index()

{

���$user�=�Auth::user();

���return�view("tasks",compact('user'));

}

$user = Auth::user(); 코드는 Auth 클래스에서 user 메서드를 실행한다는 것이다.

이와 같이 코드를 사용하기 위해서는 use 명령을 사용해서 Auth를 콘트롤러에서

사용하도록 설정해야 한다.

TaskController.php 파일 윗 부분의 use Illuminate\Http\Request; 다음 줄에 아래

와 같이 두 줄을 추가한다.

use�Illuminate\Http\Request;

use�Auth;

use�App\Task;

use App\Task;를 추가 한 것은 나중에 삭제 등의 작업을 처리할 때 Task 모델을

사용해야 하기 때문에 미리 추가하였다.

Ÿ 메인 화면 확인

http://localhost를 열어 보면 아래와 같이 에러 없이 화면이 표시된다. 아직은 로

그인이 되어 있지 않으므로 타이틀과 Login, Register 링크만 표시된다.

Page 305: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 305

¡ 사용자 추가하기

Ÿ register

할 일을 등록하고 관리하기 위해서는 로그인이 필요하다. 그러려면 먼저 사용자를

등록해야 한다. 화면 우측 상단의 Register 링크를 클릭하면 사용자 등록 폼이 표

시된다. 여기에 정보를 입력하고 사용자를 추가해보자.

Page 306: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 306

사용자를 등록하면 자동으로 로그인이 되어 화면에 등록폼이 표시된다.

¡ 할 일 추가 완성하기

Ÿ TasksController@store 메서드 설정

할 일을 저장하는 메서드는 TasksController의 store이다.

이 설정은 routes\web.php에서 아래와 같이 설정했기 때문에 정해진 것이다.

Route::post('/task','TasksController@store');�

☞ 이 router 설정에 따라 할 일을 전송하는 폼도 다음과 같이 설정되어 있다.

<form�action="/task"�method="POST"�class="form-horizontal">

...

<input�type="text"�name="task"�id="task"�class="form-control">

...

이 폼은 /task에 POST 방식으로 task 이름의 값을 전송한다. 콘트롤러의 store 메

서드는 이 값을 받아서 저장하도록 하면 된다.

Page 307: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 307

F TasksController@store 메서드 코드

TasksController.php 파일의 store 메서드 부분을 찾아서 아래와 같이 수정하고 저

장하자.

public�function�store(Request�$request)

{

��$this->validate($request,�[

�����'task'�=>�'required|max:150'

��]);

��$task�=�new�Task();

��$task->task�=�$request->task;

��$task->user_id�=�Auth::id();

��$task->save();

��return�redirect('/');�

}

$this->validate($request, ['task' => 'required|max:10']); 이 코드는 Validation 코드

로 task 항목(colum)은 필수(required)이며 최대 허용 글자 수는 150자이어야 한다

고 지정하는 것이다. 만일 이 조건에 부합하지 않으면 데이터를 전송한 페이지에

에러 메시지를 보내고 그 페이지에서 에러 메시지 표시를 위한 코드가 있으면 보

여준다. 이 예제에서는 common.errors를 include 하도록 해서 에러 메시지가 표시

될 것이다. 만일 다른 항목에 대해 Validation 조건을 추가하려면 task' =>

'required|max:10' 코드 뒤에 쉼표(,)를 추가하고 다음 줄에 같은 방법으로 조건을

추가하면 된다.

Validation 코드가 실제로 작동하는 지를 보기 위해 메인 화면의 폼에서 아무 내용

도 입력하지 않고 [할 일 추가] 버튼을 눌러보자. 다음과 같이 화면에 표시될 것이

다. 이 때 표시되는 내용은 views\common 폴더의 errors.blade.php 파일에 정의

되어 있다.

Page 308: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 308

$task = new Task(); 이 코드는 Task 모델을 상속받는 $task 객체를 생성한다. 이

객체를 사용하면 $task는 Task 모델에 접근한다.

$task->task = $request->task; 이 코드는 $task 객체에 task 항목의 값을 전송받

은 $request의 task 값으로 정해준다. $request는 public function store(Request

$request)에서 메서드가 전달 받은 값이다.

$task->user_id = Auth::id(); 이 코드는 $task 객체에 user_id 항목의 값을 로그인

한 사용자의 정보에서 id 값을 얻어 할당해준다.

$task->save(); 이 코드는 위 두 값을 tasks 테이블에 insert 시켜준다.

return redirect('/'); 등록을 마치고 첫 페이지로 돌아간다.

Ÿ 할 일 등록 테스트

메인 화면에서 할 일을 입력하고 [할 일 추가] 버튼을 클릭해보자.

Page 309: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 309

위와 같이 할 일을 추가해서 목록에 보여지는 것을 확인할 수 있다.

¡ 할 일 삭제 처리하기

Ÿ TasksController@destroy 메서드 설정

F 폼의 DELETE method 사용 이해

route 설정 파일인 web.php 파일에 삭제를 위한 설정은 다음과 같다.

Route::delete('/task/{task}','TasksController@destroy');

이는 DELETE method로 /task/1 과 같은 주소를 호출하면 TasksController의

destroy 메서드를 실행한다. 그런데 일반적으로 form은 POST, GET 두 개의 메서

드만 전송한다. 그래서 Laravel에서는 다음과 같이 해서 Method Spoofing(메서드

위장하기) 처리한다.

<input�type="hidden"�name="_method"�value="DELETE">

Page 310: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 310

F TasksController@destroy 메서드 코드

아래와 같이 TaskController.php 내의 destroy 메서드 코드를 작성한다.

public�function�destroy(Task�$task)

{

���if�(Auth::check()�&&�Auth::user()->id�==�$task->user_id)�{�

�����$task->delete();

���}

���return�redirect('/');

}

public function destroy(Task $task) 메서드는 주소에서 전송하는 task의 id를 Task

모델에서 받아서 $task로 내부에 전달한다.

if (Auth::check() && Auth::user()->id == $task->user_id) { ... } 이 조건문은 사용

자가 로그인 하였고 task의 user_id가 로그인한 user의 id와 일치하는지 여부를 확

인해서 조건이 참일 때만 $task->delete();가 실행되어 할 일을 삭제하도록 한다.

$task->delete(); 전송된 task의 id를 삭제한다.

return redirect('/'); 등록을 마치고 첫 페이지로 돌아간다.

Ÿ 삭제 테스트

메인 화면에서 삭제 버튼을 눌러 실제로 삭제되는지 확인해보자.

Page 311: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 311

¡ 수정 처리하기

Ÿ 수정을 위한 view 생성 및 콘트롤러 수정

F views 폴더에 edit.blade.php 생성

@extends('layouts.app')

@section('content')

<div�class="container">

<h1>할�일�수정</h1>

<form�method="POST"�action="/task/{{�$task->id�}}">

<div�class="form-group">

���<input�type="hidden"�name="_method"�value="PUT">

<textarea�name="task"�class="form-control">{{$task->task}}</textarea>

</div>

<div�class="form-group">

<button�type="submit"�name="update"�class="btn�btn-primary">수정하기</button>

</div>

{{�csrf_field()�}}

</form>

</div>

@endsection

F TasksController@edit 메서드 변경

public�function�edit(Task�$task)

{

����if�(Auth::check()�&&�Auth::user()->id�==�$task->user_id)�{������������

��������return�view('edit',�compact('task'));

����}�else�{�

��������return�redirect('/');

����}�

}

public function edit(Task $task) 메서드는 주소에서 전송하는 task의 id를 Task 모

델에서 받아서 $task로 내부에 전달한다.

Page 312: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 312

if (Auth::check() && Auth::user()->id == $task->user_id) { ... } else { ... } 이 조건

문 코드는 사용자가 로그인 하였고 task의 user_id가 로그인한 user의 id와 일치하

는지 여부를 확인해서 이 조건이 참일 때만 수정을 위한 view를 보여주고 그렇지

않으면 return redirect('/'); 코드를 통해서 메인 페이지로 돌아가게 한다. 이는 주

소 끝에 번호만 바꿔서 다른 사람의 할 일 정보를 수정할 수 없도록 하기 위한 조

건이다.

return view('edit', compact('task')); 이 코드는 views\edit.blade.php를 열어 보여

주며, 동시에 Task $task 로 전달 받은 task 값을 전달한다.

F edit 화면 확인

위와 같이 하였다면 이제 메인 화면에서 수정 버튼을 누르고 edit 화면을 확인해

보자.

Page 313: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 313

Ÿ update 메서드 수정하여 수정 내용 저장하기

edit view의 폼에서 action="/task/{{ $task->id }}" 와 같이 하여 서버에 값을

전송하면 Route::put('/task/{task}','TasksController@update');에 의해서

TasksController의 update 메서드가 실행된다. 실제 수정내용을 등록하려면

update 메서드를 다음과 같이 수정한다.

public�function�update(Request�$request,�Task�$task)

{

����if�(Auth::check()�&&�Auth::user()->id�==�$task->user_id)�{�

������$task->task�=�$request->task;

������$task->save();

����}

����return�redirect('/');

}

public function update(Request $request, Task $task) 폼에서 전송한 값을

$request로 받고, task/1 과 같이 주소 끝에 전송된 값을 Task 모델에서 처리하여

$task로 메서드 내부에 전달한다.

이 코드도 edit view와 마찬가지로 사용자가 로그인 했는지, 전송된 task의 user_id

가 사용자의 id와 같은지 체크하여 update 처리한다.

$task->task = $request->task; 전송받은 task의 값을 모델의 task 값에 할당한다.

$task->save(); 테이블을 update 한다.

Ÿ update 확인하기

☞ 수정 페이지에서 할 일의 내용을 수정하고 실제 update 해보자.

Page 314: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 314

Ÿ

Ÿ - Todo 프로그램 완료

위와 같이 하여 Laravel을 활용한 Todo 프로그램을 완료하였다. 상당한 부분의 코

드에 대한 설명이 누락되었고 완벽하지 않은 상태로 남겨둔 부분이 많다. 나머지

는 여러분이 Laravel을 공부해가면서 수정 또는 추가할 수 있을 것이다.

Page 315: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 315

¡ 추가 설명 : {{ csrf_field() }}

Ÿ {{ csrf_field() }}란?

CSRF(Cross Site Request Forgery)는 인증되지 않은 사용자가 인증되지 않은 명령

을 수행하도록 하는 웹 공격의 하나이다.

Laravel은 이를 막기 위해 모든 폼 전송에 반드시 CSRF 토큰을 전송하여 서버에서

이를 검증하도록 하고 있다.

Ÿ {{ csrf_field() }} 사용법

Laravel에서 모든 폼에 아래와 같이 {{ csrf_field() }}만 삽입하면 된다.

<form�action="/task/{{$task->id}}"�method="POST">

���<input�type="hidden"�name="_method"�value="DELETE">

���<button�type="submit"�name="delete">삭제</button>

���{{�csrf_field()�}}

</form>�

CSRF 토큰 확인하기 : 위와 같은 코드가 포함된 문서에서 소스보기를 하면 아래와

같이 토큰이 생성된 것을 볼 수 있다.

<input�type="hidden"�name="_token"�value="LN5qx1M9Qai2Wkr79SAwjaGdfapk1yqYrRZDGlYm">

Page 316: Modern Web Designwebskills.kr/2018/data/PHP_Web_Programming.pdf¡ application\views\board\index.php 수정 246 ¡ application\controller\board.php 수정 248 ¡ view 파일들을 수정

PHP_Web_Programming(유승열).hwp 316

[참고사이트]

- http://phplens.com/adodb/supported.databases.html

- http://php.net/

- https://www.apachefriends.org

- http://www.wampserver.com/en/

- http://kvz.io/blog/2012/10/09/reverse-a-multibyte-string-in-php/

- https://www.w3schools.com/php

- https://www.generatedata.com/

- https://dev.mysql.com/doc/refman/5.5/en/insert.html

- http://packetcode.com/article/preventing-sql-injection-php-security

- https://www.netmarketshare.com/browser-market-share.aspx

- https://ko.wikipedia.org/wiki/RSS

- http://commons.wikimedia.org/wiki/File:MVC-Process.svg#mediaviewer/File:MV

C-Process.svg

- https://i2.wp.com/zenofcoding.com/wp-content/uploads/2017/02/php_mvc_fra

meworks_2017.png

- https://getcomposer.org/

- https://laravel.com/