태그는 클래스 속성을 가지고 있다.
결과
페이지에 작성된 텍스트와 마크업은 작은따옴표로 묶여 있기 때문에,
HTML 속성은 큰따옴표를 사용할 수 있다. echo 명령 뒤에 작은따옴표나 큰따옴표를 사용할 수 있지만, 하나를 골라 그것만 사용하는 것이 좋다. 이 책에서는 콘텐츠가 HTML 속성을 포함할 수 있도록 작은따옴표를 주로 사용한다.
노트: echo 명령 뒤에 큰따옴표를 사용했다면, PHP 인터프리터는 텍스트에
실험: 1번에서 Ivy라는 이름을 자신의
변수명이 포함되어 있는지를 확인한다. 만약에 변수명이 있다면 변수가 가지고
이름으로 변경하고 파일을 저장한다.
있는 값을 출력한다.
페이지를 새로고침하면 인사말에
작은따옴표로는 이 동작을 수행하지 않는다. 이에 대한 예제는 52페이지를
여러분의 이름이 표시될 것이다.
참고하자.
PART I 기본 프로그래밍 명령
25
함수 작성에 대한 접근방법 다음의 네 단계를 따르면 함수를 작성하는 데 도움이 될 것이다.
1: 작업을 간략하게 설명하기 무슨 작업을 하는지(예, get, calculate, update, save) 다음으로 작업하는 데이터 타입을 조합하여 사용한다. 이것은 함수의 이름이 될 것이다. 함수명은 절대로 변경되지 않는다.
2: 작업을 수행하는 데 필요한 데이터는 무엇인가? 필요한 데이터는 매개변수가 된다. 매개변수로 전달된 값(인수)은 함수가 호출될 때마다 변경될 수 있다.
3: 작업을 수행하는 데 반드시 따라야 할 명령 문은 무엇인가? 명령문은 중괄호 안에 구문을 사용하여 표현될 것이다. 따라야 할 명령문은 함수가 호출될 때마다 동일하다.
4: 기대하는 결과는 무엇인가? 이것은 함수로부터 반환되는 값이다. 함수가 값을 반환하도록 하는 것은 좋은 방법이다. 만약에 새로운 값을 계산하지 않거나 정보를 가져오는 작업을 하지 않는 작업을 한다면, 그 작업이 수행되었는지를 가리키는 true 또는 false를 반환하곤 한다. 반환되는 값은 함수가 작업하기 위한 값이 새롭게 제공될 때마다 변경될 수 있다.
134
PART I 기본 프로그래밍 명령
함수를 왜 사용하나? 작업을 수행하는 코드를 함수로 작성하면 여러 이점이 있다.
재사용성 이번 장에서 여러 번 보았듯이, 페이지가 동일한 작업을 여러 번 수행해야 하는 경우(예를 들어, 제품 가격 계산하기), 그 작업을 수행하는 코드를 한 번만 작성하면
된다. 페이지에서 그 작업을 수행해야 할 때마다 함수를 호출하면서 작업에 필요한 값을 제공하면 된다.
유지보수 만약에 작업을 수행하는 명령문을 변경해야 할 경우, 함수 정의의 코드만 변경하면 된다(작업이 수행될 때마다 변경할 필요는 없다). 함수 정의가 업데이트되면 함수가 호출될
때마다 업데이트된 코드가 사용될 것이다.
구조화 각 작업을 수행하는 코드를 함수에 두면, 그 작업을 수행하는 데 필요한 모든 구문을 더 쉽게 찾을 수 있다.
테스트 용이성 여러분의 코드를 개별 작업으로 나누면 각 개별 작업을 자체적으로 테스트할 수 있으므로 문제를 더 쉽게 분리할 수 있다.
3장 함수
135
이미지 자르기 이미지 자르기는 정확하게 동일한 크기의 이미지를 만들 수 있게 해주며, 새로운 이미지가 컨테이너(바운딩 박스) 크기에 맞게 해준다. 이미지를 자르면 원본 이미지의 일부는 제거된다.
이미지를 자르려면 원본 이미지에서 유지하고자 하는
Y-오프셋
부분을 선택해야 한다. 일련의 이미지를 일관된 모양으로 만들려면 각 이미지의 잘린 부분의 비율이 동일해야 한다.
X-오프셋
자를 영역을 선택했다면 모든 이미지가 동일한 크기가
선택 높이
되도록 조절할 수 있다. 자르고자 하는 이미지 영역을 선택하려면 다음의 네 가지 데이터가 필요하다. 선택 너비
• 선택 너비: X-오프셋에서부터 원하는 이미지 영역의 너비 • 선택 높이: Y-오프셋에서부터 원하는 이미지 영역의 높이 • X-오프셋: 이미지의 왼쪽 끝에서 선택 영역이 시작되는 위치까지의 거리 • Y-오프셋: 이미지의 위쪽 끝에서 선택 영역이 시작되는 위치까지의 거리 이미지가 업로드되기 전에 사용자가 브라우저에서
업로드된 이미지가 모두 동일한 크기가 되도록 하려면,
이미지를 자를 수 있도록 하는 자바스크립트 도구가 있다.
원하는 너비와 높이를 지정해야 한다. 그 값은 새로운
자세한 내용은 다음을 참고하자.
이미지 비율(너비 ÷ 높이)을 계산하는 데 사용될 것이다.
http://notes.re/php/images/crop-javascript 100
RATIO 1 100
300
PART II 동적 웹 페이지
1
1600
2000
비율: 1.25
RATIO 0.8
업로드된 이미지의 너비와 높이를 1600
구하고 업로드된 이미지의 비율(너비
2000
÷ 높이)을 계산한다.
2 유지할 이미지 영역을 선택한다.
X-오프셋
이 선택은 새로운 이미지처럼 비율이
선택 영역과 오프셋에 대한 계산은
같아야 한다.
다음 그림과 같다.
선택 너비
선택 너비
1600
1600
Y-오프셋
1600
1600
선택 높이
선택 높이
새로운 이미지 비율이 업로드된 이미지 비율보다 작다면
그렇지 않다면 다음 계산을 사용하자.
• 선택 너비 = 원본 높이 x 새로운 비율 • 선택 높이 = 원본 높이 • X-오프셋 = (원본 너비 - 선택 너비) / 2
• 선택 너비 = 원본 너비 • 선택 높이 = 원본 너비 x 새로운 비율 • X-오프셋 = 0 • Y-오프셋 = (원본 높이 - 선택 높이) / 2
• Y-오프셋 = 0
100
100
잘린 영역은 크기가 조절되어 새로운 100
100
이미지의 크기(이전 페이지에 정의됨)로 된다.
7장 이미지 & 파일
301
확장 프로그램을 사용하여 이미지 편집하기 확장 프로그램은 PHP 인터프리터에 기능을 추가하여 추가적인 작업을 할 수 있도록 해준다. GD와 Imagick은 PHP 인터프리터가 이미지 크기를 조절하고 자르도록 하는 인기 있는 확장 프로그램이다.
확장 프로그램extension이 웹 서버에 설치되면 일반적으로
이번 장의 나머지 부분에서는 GD를 사용하여 이미지
PHP 페이지에서 사용할 수 있는 추가 함수나 클래스가
크기를 조절하는 방법과 Imagick을 사용하여 이미지
주어진다(코드에서 PHP의 내장 함수와 클래스를 사용하는
크기를 조절하고 자르는 방법을 설명한다(GD를 사용하여
것과 같은 방식).
이미지를 자르는 예제는 http://notes.re/php/gd-crop을
GD와 Imagick 확장 프로그램은 포토샵의 기본 기능과 비슷한 작업을 수행하지만, 그래픽 사용자 인터페이스를 이용하여 이미지를 조작하는 게 아니라 PHP 코드로 이미지를 편집할 수 있다.
참고하자).
GD는 Imagick보다 사용하기 더 복잡하지만 PHP 4.3부터 PHP 인터프리터와 함께 디폴트로 설치되어 있는 반면에 Imagick은 사용하기 전에 웹 서버에 설치해야 한다.
GD 사용하기 만약에 여러분이 맥에서 MAMP를 사용하고 있다면, GD는 디폴트로 활성화되어 있다. 만약에 여러분이 PC에서 XAMPP를 사용하고 있다면,
GD를 사용하기 전에 GD 확장 프로그램을 활성화해야 한다. http://notes.re/php/enable-gd를 참고하자.
GD를 사용하여 이미지 크기를 조절하고 자르려면 다섯 개의 GD 함수(다음 표 참고)를 호출해야 한다. GD는 다양한 미디어 타입(GIF, JPEG, PNG, WEBP 등)을 여는 함수와 저장하는 함수가 있다(다음의 표에서 mediatype은 파일의 타입으로 대체된다 - 다음 페이지 참고).
함수
설명
getimagesize()
이미지의 크기와 미디어 타입을 가져온다.
imagecreatefrom mediatype() 이미지를 연다(mediatype을 이미지의 미디어 타입으로 교체한다). imagecreatetruecolor()
크기가 조절되거나 잘라낸 이미지 크기를 사용하여 새로운 빈 이미지를 생성한다.
imagecopyresampled()
원본 이미지에서 선택된 부분을 가져와서 크기를 조절하고, 이전 단계에서 만든 새로운 이미지에 붙여 넣는다.
imagemediatype()
이미지를 저장한다(mediatype을 이미지의 미디어 타입으로 교체한다).
302
PART II 동적 웹 페이지
미디어 타입 결정하기 이미지를 열거나 저장하기 위해 올바른 함수를 선택하려면, 이미지의 미디어 타입을 알아야 한다.
키
설명
0
이미지의 너비(픽셀)
1
이미지의 높이(픽셀)
GD의 getimagesize() 함수는 인수로 이미지에 대한 경로가 필요하다. 이 함수는 미디어 타입을 포함하여 이미지에 대한 데이터가 포함된 배열을 반환한다. 오른쪽의
2
이미지 타입을 설명하는 상수
3
태그에 사용할 크기를 가진 문자열: height="yyy" width="xxx"
표는 그 배열에 포함된 데이터를 보여준다(키는 숫자와
mime
이미지의 미디어 타입
단어가 혼합되어 있다).
channels 이미지가 RGB이면 3, CMYK이면 4
각 색상에 사용된 비트 수
bits
이미지 열기 & 저장하기
포맷
열기
저장
GIF
imagecreatefromgif()
imagegif()
있으므로(다음 페이지 참고) 이미지를 열거나 저장하기 위해
JPEG
imagecreatefromjpeg() imagejpeg()
올바른 함수를 호출한다.
PNG
imagecreatefrompng()
오른쪽 표는 GD가 이미지 포맷을 열고 저장하기 위해
WEBP
imagecreatefromwebp() imagewebp()
이미지의 미디어 타입은 switch 문에서 사용할 수
imagepng()
제공하는 일부 함수를 보여준다.
이미지 크기 조절하기 그리고 자르기 imagecopyrempled() 함수는 이미지의 일부나 전체를 새로운 빈 이미지로 복사한다.
$orig $orig_Y $orig_x
$orig_height
이를 위해 이 함수에는 10개의 매개변수가 있지만 5개의 매개변수 쌍으로 생각하는 게 더 쉬울 수 있다. • $new, $orig 새 이미지와 원본 이미지(함수가 호출되기 전에 변수에 저장됨 - 304쪽 참고)
$orig_width
• $new_x, $new_y 새로운 이미지에서 복사된 영역을 배치해야 하는
$new
X-오프셋과 Y-오프셋
$orig_Y
$new_height
• $orig_x, $orig_y 원본 이미지에서 선택된 영역을 가져와야 하는 X-오프셋과
$new_x
Y-오프셋 • $new_width, $new_height 새 이미지에서 선택 영역의 너비와 높이 • $orig_width, $orig_height
$new_width
원본 이미지에서 선택 영역의 너비와 높이
imagecopyresampled($new, $orig, $new_x, $new_y, $orig_x, $orig_y, $new_width, $new_height, $orig_width, $orig_height);
7장 이미지 & 파일
303
MySQL 작업을 위해 phpMyAdmin 사용하기 데이터베이스 기반의 웹사이트에서 데이터베이스는 일반적으로 사이트의 페이지와 상호작용하는 사용자에 의해 업데이트된다. 하지만 phpMyAdmin을 사용하여 추가적인 작업을 수행해야 할 경우가 있다.
데이터베이스 기반의 웹사이트를 실행할 때 수행해야 하는 어드민administration 작업이라는 것이 있다. 여기에는 다음이 포함된다. • 새로운 데이터베이스 만들기 • 기존의 데이터베이스 백업하기 • 데이터베이스에 새로운 테이블과 열 추가하기 • 새로운 기능이 추가될 때 데이터가 사이트에 올바르게 추가되거나 업데이트되는지 확인하기 • 데이터베이스의 콘텐츠에 접근하고 편집할 수 있는 사용자를 제어하는 사용자 계정 생성하기
MySQL은 이러한 어드민 작업을 수행하는 데 사용할 수 있는 자체적인 시각적 인터페이스를 제공하지는 않지만, 이러한 작업을 수행하는 데 도움을 주는
phpMyAdmin이라는 무료 오픈소스 도구가 있다. phpMyAdmin은 PHP로 작성되었으며 웹 서버에서 실행된다. 이것은 데이터베이스를 관리하는 데 사용할 수 있는 웹사이트와 같다. 이후의 몇 페이지에서는 일부 어드민 작업을 수행하기 위해 어떻게 사용되는지 보여준다.
390
PART III 데이터베이스 기반의 웹사이트
PHPMYADMIN을 찾는 방법 MAMP 또는 XAMPP를 설치하면 컴퓨터에 phpMyAdmin이 설치된다. 브라우저에서 다음의 URL을 입력하면 접근할 수 있다. http://localhost/phpmyadmin/ 만약에 여러분이 코드 샘플을 실행하기 위해 URL에 포트 번호를 추가했다면 phpMyAdmin에 접근하기 위해 동일한 포트 번호를 추가해야 할 것이다. 예를 들어 다음과 같다. http://localhost:8888/phpmyadmin/
MySQL을 지원하는 호스팅 회사에는 다양한 방법으로 어드민 작업을 수행할 수 있게 하므로 호스팅 회사에 확인하도록 하자. phpMyAdmin의 전체 버전에 대한 접근 권한 대신에 다음을 사용하는 경우가 종종 있다. • 데이터베이스/사용자 계정을 생성하는 자체 도구 • 데이터베이스의 콘텐츠를 백업, 검사, 업데이트하는 제한된 버전의 phpMyAdmin • phpMyAdmin에 접근하기 위한 자체 URL
데이터베이스를 관리하기 위해 phpMyAdmin 사용하기 phpMyAdmin 화면은 세 가지 주요 영역이 있다. phpMyAdmin 버전마다 약간씩 다르게 보일 수 있지만 페이지 항목의 기능과 위치는 동일하다.
2 1
3
1
데이터베이스 & 테이블
2
탭
3
메인 창
웹 서버가 여러 사이트를 호스팅할 수
이것은 인터페이스로 할 수 있는 일을
여기서 어드민 작업을 수행한다(예를
있는 것처럼, 하나의 MySQL은 여러
나타낸다.
들어, 데이터베이스의 콘텐츠가
데이터베이스를 보유할 수 있다.
• phpMyAdmin을 열면, MySQL
데이터베이스의 이름은 왼쪽 메뉴에
소프트웨어로 수행할 수 있는
표시된다. 데이터베이스 이름을
작업이 탭에 표시된다.
클릭하면 목록에 + 기호가 확장되어
• 왼쪽 메뉴에서 데이터베이스를
표시되며, 열을 업데이트하거나 행을 추가할 수 있다).
MySQL은 information_schema, mysql, performance_schema,
그 데이터베이스에 있는 테이블의
클릭하면, 탭은 해당
이름이 표시된다.
데이터베이스에서 수행할 수 있는
sys와 같은 자체 데이터베이스를 생성한다. 여러분이 초보자라면
작업으로 변경된다.
이것을 수정하지 말자.
PART III 데이터베이스 기반의 웹사이트
391
몇 개의 PHP 파일로 전체 사이트를 운영하는 방법 다음의 12페이지는 네 개의 PHP 파일을 사용하여 샘플 웹사이트의 50페이지 이상을 어떻게 표시하는지 보여준다.
이 네 개의 PHP 파일은 각각 두 부분으로 나뉜다.
각 페이지는 네 개의 인클루드 파일을 사용한다.
• 먼저 데이터베이스에서 데이터를 수집하여 변수에
• database-connection.php는 데이터베이스 연결을 관리하는 PDO 객체를 생성한다. • functions.php에는 데이터베이스에서 데이터를
저장하는 코드가 있다. • 다음으로 이 변수의 데이터는 방문자에게 다시 전송되는 HTML 페이지를 만드는 데 사용된다. 이러한 파일은 템플릿처럼 동작한다고 생각할 수 있다. 파일 중 하나가 요청될 때마다 데이터베이스에서 다른 데이터를 수집하여 HTML 페이지에서 관련된 부분에 데이터를 넣고 방문자의 브라우저에 HTML을 보낼 수 있다.
index.php 홈페이지에는 사이트에 게시된 최신 기사 6개의 요약이 표시된다. 새로운 기사가 데이터베이스에 저장되면, 이 페이지는 새로운 기사의 세부 정보를 표시하기 위해 자동으로 업데이트될 것이다(그리고 여섯 개의 기사 중 가장 오래된 기사는 더 이상 표시되지 않을 것이다).
HTML 페이지의 구조는 항상 동일하게 유지되지만, 데이터베이스에서 가져와 표시하는 콘텐츠는 변경될 수 있다.
460
PART III 데이터베이스 기반의 웹사이트
가져와서 그 데이터를 형식화하는 함수가 있다. • header.php는 각 페이지에 사용되는 헤더를 포함하며 내비게이션을 생성한다. • footer.php는 각 페이지에서 사용되는 푸터를 포함한다.
category.php 이 파일은 카테고리의 제목과 설명을 표시하고 다음으로 해당 카테고리에 게시된 각 기사의 요약이 표시된다.
HTML 페이지의 구조는 동일하게 유지되지만 표시되는 데이터는 변경될 수 있다.
URL 뒤의 쿼리 문자열은 데이터베이스에서 수집되어 페이지에 표시되어야 하는 카테고리의 아이디를 가진다. 예를 들면 다음과 같다. category.php?id=1
member.php 이 파일은 사이트의 모든 회원의 프로필을 표시할 수 있다. 그다음으로 회원이 작성한 기사의 요약이 온다.
URL 뒤의 쿼리 문자열은 데이터베이스에서 수집되어 페이지에 표시되어야 하는 회원의 아이디를 가진다. 예를 들면 다음과 같다. member.php?id=1
article.php 이 파일은 모든 기사를 표시할 수 있다. 이미지, 카테고리, 제목, 날짜, 콘텐츠, 그리고 작성자는 각 기사마다 동일한 위치에 오지만 표시되는 데이터는 변경될 수 있다.
URL 뒤의 쿼리 문자열은 데이터베이스에서 수집되어 페이지에 표시되어야 하는 기사의 아이디를 가진다. 예를 들면 다음과 같다. article.php?id=1
12장 데이터베이스에서 데이터 가져오기 & 표시하기
461
검색 기능 만들기 검색 페이지는 데이터베이스에서 데이터를 검색하는 SQL을 어떻게 사용하는지와 데이터베이스 쿼리가 많은 행을 반환할 수 있는 경우에 여러 페이지에 걸쳐 결과를 표시하는 페이징 처리 방법을 보여준다.
방문자가 검색 상자에 용어를 입력하고 폼을 제출하면,
데이터베이스가 일치하는 결과를 많이 찾았을 때, 검색
데이터베이스는 article 테이블의 title, summary,
결과를 페이징하여 표시할 수 있다.
description 열에서 해당 용어를 찾는다. 이 열에서 검색어가 발견되면 기사의 요약이 결과 세트에 추가되어 방문자가 쿼리와 일치하는 기사를 보게 된다. 검색 페이지는 두 개의 SQL 쿼리를 실행한다.
• 페이지마다 해당 결과의 하위 집합을 표시한다. • 방문자가 다음(또는 이전)의 결과 세트를 요청할 수 .
있도록 결과 아래에 링크를 추가한다.
결과를 여러 페이지로 나누기 때문에 이것을 페이징
• 하나는 일치하는 결과의 총 수를 카운팅한다.
처리pagination라고 한다. 검색 결과를 나타내는 각
• 다른 하나는 해당 기사의 세부 정보를 가져온다.
페이지에 대한 링크는 쿼리 문자열에 세 개의 이름/값 쌍이
다음은 검색어를 포함하는 기사의 숫자를 카운팅하는 SQL 쿼리다. 검색어는 쿼리 안에서 세 번 반복된다. 먼저 title 열을 확인하는 데 쓰이고, 다음으로 summary 열을 확인하는 데 쓰이며, 마지막으로 content 열을 확인하는 데 쓰인다.
SQL 쿼리에서 플레이스홀더를 재사용할 수 없으므로 각
필요하다. 이것은 어떤 기사를 데이터베이스에서 가져와서 표시해야 하는지 검색 페이지가 알 수 있도록 한다. • term 검색어를 담는다. • show 얼마나 많은 결과를 페이지에 표시할지 나타낸다. • from 이미 표시된 항목 수를 나타낸다.
열을 검색하기 위한 서로 다른 플레이스홀더 이름(:term1,
show 값은 SQL의 LIMIT 절과 함께 사용되므로
:term2, :term3)을 사용한다.
데이터베이스는 해당 페이지에 표시될 올바른 수의 기사를 반환한다.
SELECT COUNT(title) FROM article WHERE title
LIKE :term1
from 값은 SQL의 OFFSET 절과 함께 사용되어 지정된 수만큼의 일치하는 결과가 나온 다음에 결과 세트에 결과를 추가하기 시작해야 한다고 데이터베이스에 알린다.
OR summary LIKE :term2 OR content LIKE :term3 AND published = 1;
472
PART III 데이터베이스 기반의 웹사이트
LIMIT :show OFFSET :from
FROM
search.php?term=design search.php?term=design&show=3&from=3 search.php?term=design&show=3&from=6 search.php?term=design&show=3&from=9
SHOW
PAGE
( 0
÷
3 )
+
1
=
1
( 3
÷
3 )
+
1
=
2
( 6
÷
3 )
+
1
=
3
( 9
÷
3 )
+
1
=
4
페이징 처리 링크를 생성하려면 검색 페이지에 세 가지
현재 페이지를 결정하기 위해, $from(건너뛸 결과의 수)을
데이터가 필요하다. 각 값은 변수에 저장된다.
$show(페이지당 결과의 수)로 나누고 1을 더한다. 현재 페이지를 결정하기 위한 계산은 앞에 표시되었다.
• $count 쿼리와 일치하는 결과의 수 • $show 페이지당 표시할 결과의 수 • $from 결과 세트에 일치하는 항목을 추가하기 전에 건너뛰어야 하는 결과의 수
$current_page = ceil($from / $show) + 1;
for 루프는 페이징 링크를 만들기 위해 사용된다. 카운터를 1로 설정하고 카운터가 전체 페이지의 수보다
결과를 표시하는 데 필요한 페이지 수를 계산하기 위해,
적은지 확인한다. 만약에 그렇다면 페이지에 대한 링크를
$count(일치하는 수)를 $show(페이지당 표시되는 결과의 10이고 페이지당
추가하고 카운터를 증가시킨다. for 루프는 결과를
수)로 나눈다. 앞의 경우, 일치하는 수가
표시하는 데 필요한 전체 페이지 수에 카운터가 도달할
표시되는 수는 3이다. 10 ÷ 3 = 3.3333이고 결과를
때까지 실행된다.
표시하는 데 필요한 페이지 수를 구하기 위해 PHP의 ceil() 함수를 사용하여 반올림을 한다. $total_pages = ceil($count / $show);
for ($i = 1; $i
© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.