[MySQL & PHP] 16장 PHP의 기초 지식
MySQL & PHP 학습/정리 그리고 체크! 2016. 3. 1. 20:01
정리
1. PHP의 변수 사용법
1. 변수
1.1 PHP의 변수란?
먼저 변수를 설명하겠습니다. MySQL에서도 등장했지만, 변수는 값을 담는 '상자'와 같은 것입니다. PHP와 MySQL을 연계할 때, 변수는 없어서는 안 될 중요한 역할을 합니다.
그럼, 실제로 변수를 사용해 보겠습니다. 먼저 예제 16-1의 스킙트를 15장에서 print 를 이용했듯, 같은 요령으로 입력합니다.
예제 16-1 variable.php
<?php
$a = "Hello";
print $a;
?>
잘못 입력한 부분이 없는지 다시 한번 확인하고, variable.php라는 파일 이름으로 웹 서버의 공유 폴더에 저장합니다. 웹 서버의 공유 폴더는 환경에 따라 다르지만, 여기서 설명한 대로 XAMPP를 설치했다면 C:\xampp\htdocs입니다. 또한, Apache가 실행 중인지 확인했다면 웹 브라우저의 주소창에 다음과 같이 입력합니다.
http://localhost/variable.php
만일, 표시되지 않는다면 15장의 '7.3 실행 결과가 표시되지 않을 때 대처 방법'을 참고해 점검해 보기 바랍니다.
그럼 이제 스크립트의 내용을 확인해 보겠습니다. 먼저, PHP에서는 변수 이름 앞에 $를 붙입니다. 앞의 예에서는 변수 $a로 표시했습니다. 그리고 다음 구문이 포인트입니다.
$a = "Hello";
프로그램 언어를 처음 접하는 분은 앞의 식이 낯설게 느껴질 수 있습니다. 앞의 식에서는 변수 $a에 'Hello'라는 문자열을 '대입'하고 있습니다.
프로그램 세계에서 등호(=)는 '우변에 있는 값을 좌변에 대입한다.'라는 의미입니다. 이제 변수 $a의 값의 'Hello'가 되었습니다.
참고로, MySQL의 비교 연산자에서 소개한 '같다'를 나타내는 등호(=)는 PHP에서는 ==로 표시합니다.
print는 문자열을 출력하는 명령입니다. 다음 명령은 변수 $a의 값, 즉, 문자열 'Hello'를 출력합니다.
print $a;
15장의 예를 변수를 사용해서 나타냈습니다. 이처럼 '값을 넣는 상자'와 같은 역할을 하는 것이 변수입니다. 또한, 값을 계속 넣어 두기만 하는 것이 아니라, 넣고 빼고를 자유롭게 할 수 있는 편리한 상자입니다.
1.2 변수 이름의 규칙
변수 이름을 설정하는 데에는 여러 규칙이 있습니다. PHP에서는 다음과 같은 규칙이 있습니다.
■ 맨 앞에 $를 붙인다.
■ 대문자와 소문자를 구별한다.
■ 문자와 숫자, 밑줄(_)로 구성된다.
■ $의 바로 뒤에는 숫자를 사용할 수 없다.
$ 사용하기
PHP의 변수는 변수의 맨 앞에 $를 붙이는 것이 특징입니다. 예를 들어, $age나 $TEL과 같이 작성합니다.
문자와 숫자, 밑줄(_)로 구성되지만, 숫자로 시작할 수 없다.
변수의 첫 글자는 문자 또는 밑줄(_)입니다. $19years는 안되지만, $_19years는 허용됩니다.
대문자와 소문자를 구별한다.
대문자와 소문자를 구별합니다. 예를 들어, $tel과 $Tel, $TEL은 각각 다른 변수로 취급됩니다. 여기서는 모든 변수 이름에 소문자를 사용하겠습니다.
1.3 미리 정의된 상수
PHP에는 사용자가 설정하지 않아도 이미 정의된 값이 있습니다. 예를 들어, 다음과 같이 원주율이나 PHP의 버전을 나타내는 상수는 그대로 사용할 수 있습니다.
▶ PHP 상수의 예
M_PI |
원주율 |
PHP_VERSION |
PHP의 버전 |
PHP_OS |
실행 중인 운영체제 |
예를 들어, 예제 16-2와 같이 입력하면 원주율이 표시됩니다.
예제 16-2 pi.php
<?php
print M_PI;
?>
1.4 변수의 자료형
다음은 변수의 자료형입니다. PHP에서는 자료형을 정의하지 않아도 변수를 사용할 수 있다는 특징이 있습니다. '문자열을 대입하면 문자열 자료형', '정수를 대입하면 정수형'과 같이 번거로운 정의를 하지 않아도 데이터를 대입했을 때 PHP에 의해 자동으로 자료형이 결정됩니다.
MySQL에서 테이블을 만들 때에는 처음부터 필드의 자료형을 결정해야 합니다. 숫자 자료형의 칼럼에 문자열을 저장할 수 없고, 저장 함수에서 사용하는 변수는 사용하기 전에 DECLARE로 자료형을 선언해야 합니다.
이에 비해 PHP는 '일단 대입하고 나서 자료형을 맞추는 구조'입니다. 다음은 PHP에서 사용할 수 있는 주요 자료형 입니다.
PHP에서 사용할 수 있는 주요 자료형
내용 |
자료형 |
정수 |
integer |
부동소수점 |
float |
부동소수점 |
double |
문자열 |
string |
논리값 |
boolean |
객체 |
object |
배열 |
array |
널(빈 값) |
NULL |
데이터를 대입하면 알아서 자료형을 설정해 주기 때문에, 개발자 입장에서는 특별히 신경 쓸 필요가 없습니다.
2. PHP의 문자열 사용법
2. 문자열
이번에는 PHP의 문자열에 대해 설명하겠습니다.
2.1 문자열 결합
먼저, 문자열을 연결하는 방법입니다. 익숙해지기 전까지는 번거롭게 느낄 수도 있지만, PHP에서는 문자열을 결합할 때 온점(.)을 사용합니다. 문자열 데이터는 큰따옴표(")나 작은 따옴표(')로 감싸야 하기 때문에 '박'과 '문수'를 결합해서 표시할 때에는 "박"."문수"라고 작성합니다.
다음의 예제 16-3은 변수 $a 에 'Hello', 변수 $b에 'SQL 블로그에 오신 걸 환영합니다!'라는 문자열을 대입하고 나서, 이 두 문자열을 결합해서 표시하는 예입니다.
예제 16-3 join.php
<?php
$a = "Hello";
$b = "SQL 블로그에 오신 걸 환영합니다!";
print $a.$b;
?>
$a.$b에서 각각의 변수에 들어있는 문자열을 결합하고 있습니다.
2.2 큰따옴표와 작은따옴표의 사용법
문자열은 큰따옴표(")나 작은따옴표(')로 감싸서 표현합니다.
단, 큰따옴표(")로 감싼 문자열 중에 큰따옴표 문자가 포함되어 있거나, 작은따옴표(')로 감싼 문자열 중에 작은 따옴표 문자가 포함되어 있으면 안 됩니다. PHP에서는 큰따옴표나 작은따옴표를 문자열의 시작 지점이나 종료 지점으로판단하기 때문에, 오류가 발생하게 됩니다. 이것은 MySQL의 SQL 문과 같습니다.
예를 들어, 다음 예에서는 오류가 발생합니다.
print "문자열은 ""으로 감쌉니다.";
// 큰따옴표로 감싼 내부에 큰따옴표가 또 있다.
이스케이프 처리
앞서와 같은 경우, 큰따옴표나 작은따옴표 앞에 역슬래시(\)를 입력하면 오류를 피할 수 있습니다. 이런 방법을 이스케이프 처리라고 합니다.
print "문자열은 \"\"으로 감쌉니다.";
// 문자열 안의 큰따옴표(") 앞에 \를 입력한다(이스케이프처리).
큰따옴표와 작은따옴표 사용하기
따옴표를 사용할 때 오류를 피하는 또 다른 방법은 큰따옴표를 문자로 취급할 때에는 작은따옴표로 감싸고, 작은따옴표를 문자로 취급할 때에는 큰따옴표로 감싸는 방법입니다. 예를 들어, 다음 예에서는 오류가 발생하기 않습니다.
print "문자열은 ' '으로 감쌉니다";
다음 장부터는 MySQL을 이용하는 웹 응용프로그램을 만들 때, PHP 스크립트를 사용해서 SQL 문을 작성할 것입니다. 이렇게 하려면 mysql_query()라는 함수의 인수에 SQL문을 문자열 형태로 대입합니다.
mysql_query() 함수에 대해서는 뒤에서 좀 더 자세하게 설명하기로 하고, 일단 mysql_query(역에 SQL 문을 작성)이라는 작성법만 기억합니다.
예를 들어, INSERT INTO tb1 VALUES('A101', ...)이라는 SQL 문을 작성하려면 어떻게 하면 될까요? SQL 문은 문자열 데이터이기 때문에 따옴표로 감싸야 합니다. 하지만 작은 따옴표(")를 사용하는 SQL 문에 작은따옴표(')를 감싸면 오류가 발생합니다.
mysql_query('INSERT INTO tb1 VALUES('A101',...)')
// 작은따옴표(')를 작은따옴표(')로 감싸면 오류 발생
이럴 때 \으로 이스케이프 하거나, 작은따옴표(')를 문자 취급하기 위해 큰따옴표(")로 감싸야 합니다.
mysql_query("INSERT INTO tb1 VALUES('A101',...)")
// 작은따옴표(')를 큰따옴표(")로 감싸면 OK
또한, 반대로 안쪽의 큰따옴표(")를 문자 취급하려면 작은따옴표(')로 감싸면 됩니다.
PHP와 MySQL를 이용할 때 처음에 가장 많이 당황하는 이유가 큰따옴표와 작은따옴표의 사용법 때문입니다. mysql_query() 함수에 대해서는 차차 설명하겠지만, 일단 여기에서는 작은따옴표(')에는 작은따옴표(')를, 큰따옴표(")에는 큰따옴표(")를 사용할 수 없다는 것만 기억하기 바랍니다.
2.3 변수에 사용하는 큰따옴표와 작은따옴표의 차이
문자열 데이터에는 큰따옴표(")와 작은따옴표(')중 어느 것을 사용해도 상관없지만, 변수에 사용할 때는 처리 결과가 다릅니다.
예제 16-4처럼 $a = 123이라고 입력한 경우, print "$a"는 큰따옴표(") 안의 변숫값 123을 표시합니다.
예제 16-4 double_quotation.php
<?php
$a = 123;
print "$a";
?>
그러나 예제 16-5에서처럼 print '$a'라고 입력하면 작은따옴표(') 안의 변수는 문자열로 인식됩니다. 즉, $a라는 문자열이 그대로 출력됩니다.
예제 16-5 single_quotation.php
<?php
$a = 123;
print '$a';
?>
이처럼 PHP에서 생성하는 SQL 문에 문자열 데이터로 된 변수가 있을 때에는 주의해야 합니다.
3. PHP 함수의 개요와 자주 사용하는 몇가지 함수
3. 함수
3.1 여기서 사용하는 PHP 함수
PHP에는 1,000개 이상의 함수가 있습니다. 이블로그 에서는 여기서 등장하는 함수를 소개하겠습니다.
여기서 등장하는 함수(뒤에 소개하는 date()는 제외)
함수명 |
내용 |
die() |
스크립트의 실행을 중지한다. |
exec() |
명령을 실행한다. |
phpinfo() |
PHP의 정보를 표시한다. |
mysql_connect() |
MySQL 서버에 접속한다. |
mysql_close() |
MySQL 서버의 연결을 종료한다. |
mysql_select_db() |
사용할 데이터베이스를 지정한다. |
mysql_query() |
SQL 문을 실행한다. |
mysql_fetch_array() |
MySQL의 실행 결과에서 결과 행을 추출한다. |
mysql_error() |
마지막에 일어난 오류를 반환한다. |
getenv() |
환경 변수를 반환한다. |
gethostbyname() |
호스트 이름에서 IP주소를 가져온다. |
gethostbyaddr() |
IP 주소에서 호스트 이름을 가져온다. |
mysql_로 시작하는 것은 MySQL 데이터베이스를 다루는 함수입니다(참고로, PostgreSQL을 다루는 함수는 pg_로 시작하고, SQLite를 다루는 함수는 sqlite_로 시작합니다). MySQL 데이터베이스를 다루는 함수에 대해서는 18장에서 자세히 설명하겠습니다.
여기에서는 date()와 getenv(), gethostbyaddr() 함수를 소개하겠습니다.
3.2 date() 함수로 날짜와 시간 표시하기
먼저, 날짜와 시간을 처리하는 date() 함수를 소개하겠습니다. 단, 날짜와 시간을 나타내는 함수를 사용할 때에는 사전에 표준 시간대(Time zone)를 바르게 설정해 두어야 합니다.
date() 함수
date(날짜와_시간_서식_문자열)
date()는 날짜와 시간을 반환하는 함수입니다. 인수에 다음과 같은 문자열을 입력하면 각 문자열에 대응하는 날짜와 시간을 반환합니다.
date() 함수에 지정할 수 있는 문자열
날짜와 시간 서식 문자열 |
반환값 |
g |
12시간제 형식으로 시간을 표시(1자릿수) |
h |
12시간제 형식으로 시간을 표시(2자릿수) |
G |
24시간제 형식으로 시간을 표시(1자릿수) |
H |
24시간제 형식으로 시간을 표시(2자릿수) |
j |
일을 표시 |
I |
요일을 영문자로 표시(Saturday 등의 문자를 반환) |
F |
월을 영문자로 표시(January 등의 문자를 반환) |
n |
월을 1자릿수로 표시 |
m |
월을 2자릿수로 표시 |
s |
초를 2자릿수로 표시 |
Y |
연도를 4자릿수로 표시 |
y |
연도를 2자릿수로 표시 |
예를 들어, 다음 함수를 실행하면 February와 같이 현재의 월을 영문으로 표시합니다.
date("F")
그리고 다음 함수를 실행하면 현재의 월과 일을 반환합니다.
date("n")
date("j")
웹 페이지에 날짜를 자동으로 표시할 때 유용한 함수입니다. 또한, date() 함수의 2번째 인수에는 타임스탬프(timestamp)를 설정하여 지정한 날짜를 표시할 수 있습니다. 참고로, PHP에서는 날짜와 시간 정보를 '타임스탬프'라는 형식으로 처리합니다. 타임스탬프는 1970년 1월 1일 0시부터 경과한 시간을 초로 나타낸 정수입니다.
date() 함수 이용하기
그럼, 현재 날짜를 표시하는 스크립트를 만들어 보겠습니다. 예제 16-6에서처럼 현재의 날짜를 '오늘은 ХХХХ년 Х월 Х일입니다.'라고 표시하는 스크립트를 작성합니다. 이때, 문자열을 결합하기 위해 온점(.)을 사용하겠습니다.
예제 16-6 today.php
<?php
print "오늘은 ".date("Y")."년 ".date("m")."월 ".date("j")."일입니다.";
?>
3.3 환경 정보
printinfo() 함수로 환경 정보 표시하기
사용하는 PHP에 관한 다양한 정보를 제공하는 함수로 phpinfo() 함수가 있습니다. 다음 스크립트를 실행하면 정보가 표시됩니다.
<?php
phpinfo();
?>
함수에는 인수를 설정하지 않더라도 괄호를 입력해야 합니다. 이 phpinfo();라는 단 한줄의 함수로 15장의 '8.4 phpinfo()'와 같이 많은 환경 정보가 표시됩니다.
phpinfo() 함수가 반환하는 정보 중에 환경 변수가 있습니다. 이는 phpinfo() 함수에 의해 표시되는 내용 중 Apache Environment 부분에 기술되어 있습니다. 환경 변수에는 '웹 서버의 소프트웨어'와 '클라이언트의 IP 주소'등 중요한 정보가 저장되어 있습니다.
또한, REMOTE_ADDR이라는 항목에는 현재 사용하는 컴퓨터의 IP 주소가 표시되어 있으니 확인해 보기 바랍니다(localhost의 경우, IPv4에서는 127.0.0.1, IPv6에서는 ::1).
getenv() 함수
다음은 getenv() 함수를 사용해서 접속 중인 클라이언트의 정보를 표시하는 PHP 스크립트를 작성해 보겠습니다.
getenv() 함수는 '환경 변수'를 반환하는 함수로서 특정 인수를 지정한면 해당하는 정보를 얻을 수 있습니다.
getenv() 함수
getenv(얻고자 하는 정보)
getenv 함수에 설정하는 인수와 반환되는 정보
인수(얻고자 하는 정보) |
얻을 수 있는 정보 |
SERVER_SOFTWARE |
웹 서버의 소프트 웨어 |
SERVER_PORT |
사용 중인 포트 |
PATH |
서버에 설정되어 있는 PATH |
REMOTE_ADDR |
클라이언트의 IP 주소 |
HTTP_USER_AGENT |
클라이언트의 브라우저 정보 |
예를 들어, '웹 서버의 소프트웨어'는 getenv("SERVER_SOFTWARE")로 확인할 수 있습니다. 예제 16-7의 스크립트를 실행해 보겠습니다.
예제 16-7 serv_disp.php
<?php
print getenv("SERVER_SOFTWARE");
?>
마찬가지로, getenv("REMOTE_ADDR")를 이용하면 클라이언트의 IP 주소를 알 수 있습니다.
예제 16-8 ip.php
<?php
print getenv("REMOTE_ADDR");
?>
3.4 gethostbyaddr() 함수로 호스트 이름 확인하기
이번에는 gethostbyaddr() 함수를 사용해 보겠습니다. gethostbyaddr() 함수는 IP주소에서 호스트 이름을 가져오는 함수입니다. 참고로 'get-host-by-addr'이라고 풀어쓰면 '주소에서(by address) 호스트(host)를 얻다(get).'라는 의미인 것을 알 수 있습니다.
gethostbyaddr() 함수
gethostbyaddr(얻고자 하는 호스트의 IP 주소)
앞에서 getenv("REMOTE_ADDR")로 알아낸 IP 주소를 getostbyaddr() 함수의 인수로 설정하면 클라ㅣ언트의 호스트 이름을 알 수 있습니다.
예제 16-9는 클라이언트의 호스트 이름을 표시하는 스크립트 입니다.
예제 16-9 host_disp.php
<?php
print gethostbyaddr(getenv("REMOTE_ADDR"));
?>
gethostbyaddr() 함수 활용하기
그럼, gethostbyaddr() 함수를 사용해서 클라이언트의 정보를 반환하는 PHP 스크립트를 만들어 보겠습니다.
앞의 getenv() 함수와 인수를 사용해서 접속한 '클라이언트의 IP 주소'와 '클라이언트의 호스트 이름', '클라이언트의 브라우저 정보'를 표시하는 PHP 스크립트를 작성해 보겠습니다.
예제 16-10 client.php
<?php
print "당신의 IP 주소는 : ";
print getenv("REMOTE_ADDR");
print "<BR>";
print "당신의 호스트 이름은 : ";
print gethostbyaddr(getenv("REMOTE_ADDR"));
print "<BR>";
print "당신의 브라우저는 : ";
print getenv("HTTP_USER_AGENT");
print "<BR>입니다.";
?>
4. 비교 연산자 사용법
4. 비교 연산자
앞으로 설명할 '반복 처리'와 '조건 분기'에는 설정한 조건에 일치하는지를 판단하는 부분이 있습니다. 이때 사용하는 기호를 비교 연산자라고 합니다. PHP에서는 다음과 같은 비교 연산자를 사용합니다.
비교 연산자
비교 연산자 |
내용 |
a==b |
a와 b는 같다 |
a>b |
a는 b보다 크다 |
a>=b |
a는 b이상 |
a<b |
a는 b미만 |
a<=b |
a는 b이하 |
a<>b |
a는 b와 같지 않다 |
조건이 참이면 TRUE, 거짓이면 FALSE라고 합니다. '같다'를 나타내는 ==는 등호(=)를 2번 입력합니다. =가 아니니 주의하기 바랍니다.
예를 들어, 2>1은 어느 쪽일까요? 물론 이 조건은 참이기 때문에 TRUE입니다.
5. 반복 처리 프로그래밍
5. 반복 처리
반복 처리의 장점 중 하나는 같은 내용을 수백 번이건 수천 번이건 반복해서 실행할 수 있다는 점입니다. 여기에서는 그런 반복 처리를 하는 for와 while을 소개하겠습니다.
5.1 for를 이용한 반복 처리
for란?
for는 카운터 변수(수를 세기 위한 변수)를 준비하고, 이 변수를 하나, 둘, 셋... 처럼 증가 시킴으로써 조건 범위 내에 있는 처리를 반복하는 함수입니다. for에는 '카운터 변수가 10 이하인 경우에 반복 처리를 한다.'와 같은 '조건'을 미리 설정해 둡니다. 그리고 그 조건에 충족하기 않으면(조건의 결과가 FALSE가 되면) 반복 처리를 종료하는 구조입니다.
for의 구문은 다음과 같습니다.
for구문
for(초깃값: 반복_조건 ; 변화){
반복해서 실행할 내용
}
중괄호{} 안에 작성한 '반복해서 실행할 내용'부분의 처리를 반복합니다. 이 부분은 몇 행에 걸쳐서 작성해도 상관없습니다. for 뒤의 괄호() 안에는 어떻게 반복할 것인지 조건을 설정합니다.
for 사용하기
설명만으로는 이미지가 잘 떠오르지 않을 것입니다. 그럼, 실제로 사용해 보겠습니다. 예제 16-11의 스크립트를 입력해서 실행합니다. 예제 16-11은 별표(*) 문자를 15번 반복해서 표시하는 예입니다.
예제 16-11 for.php
<?php
for($i=1;$i<=15;$i=$i+1){
print "*";
}
?>
만일, 제대로 실행되지 않는다면 쌍반점(;)이나 중괄호 등의 기호를 잘못 입력하지는 않았는지 입력 내용을 꼼꼼히 확인하기 바랍니다.
for 문의 흐름
그럼, 예제 16-11의 내용을 살펴보겠습니다.
● $i=1 -> 변수 $i의 처음 값은 1이다(초깃값).
● $i<=15 -> 변수 $i가 15 이하면 반복한다(반복 조건).
● $i=$i+1 -> 반복하는 동안은 1씩 증가시킨다(변화).
이 예에서는 $i를 카운터 변수로 사용하고 있습니다. 카운터 변수는 $loopv 또는 $p 등 무엇을 사용해도 상관없지만, 옛날부터 묵시적 약속처럼 '카운터 변수는 $i'가 사용되고 있습니다.
카운터 변수의 초깃값으로 $i=1이 설정되어 있습니다. 즉, '카운트는 1부터 시작한다.'라는 의미입니다. 그리고 반복 조건이 $i<=15라고 되어 있는데, 이는 '카운터 변수 $i가 15이하이면 이 처리를 반복하시오.'라는 의미입니다. 15 이하라는 것은 당연히 15도 포함됩니다.
변화는 $i=$i+1이라고 되어 있습니다. 이는 '카운터 변수 $i를 1씩 증가시킨다.'라는 의미입니다.
프로그램의 세계에서 등호(=)는 우변의 값($i+1)을 좌변($i)에 대입한다는 의미입니다. 변수 $i에 1을 더하고 그 결괏값을 변수 $i에 대입합니다. 즉, 변수 $i를 1씩 증가시키는 꼴이 됩니다.
초깃값은 $i=1에 의해 1이 됩니다. 여기에 $+1에 의해 1이 더해져서 2가된 값을 등호로 왼쪽의 변수 $i에 대입해서 $i는 다시 2가 됩니다. 계속해서 $+1에 의해 1이 더해져서 3이 된 값을 변수 $i에 대입해서 변수 $i는 3이 되고... 이런식으로 1씩 증가하게 됩니다.
$i=$i+1을 생략하고 $i++라고 작성할 수도 있습니다. 이를 인크리먼트(increment)라고 합니다. 즉, 예제 16-11을 다음과 같이 작성해도 결과는 같습니다. $i=1는 1부터, $<=15는 15 이하일 때, $i++는 1을 더한다라는 처리를 하고 있습니다.
예제 16-12 for_variation.php
<?php
for($i=1;$i<=15;$i++){
print "*";
}
?>
5.2 while을 이용한 반복 처리
다음은 while을 이용한 반복 처리입니다. 이번에는 '반복 조건'이 참(TRUE)이면 '반복 처리'부분을 반복합니다. while의 구문은 다음과 같습니다.
while 구문
while(반복_조건){
반복 처리
}
while에는 별도로 카운터 변수의 초깃값을 설정하는 부분이 없기 때문에, 스스로 초깃값을 설정해야 합니다. 또한, 반복 중에 반드시 '반복 조건'이 거짓(FALSE)이 되도록 해야 합니다. 만일, 계속해서 '반복 조건'이 참이면, 반복 처리는 영원히 계속되니 주의해야 합니다.
while 사용하기
앞선 예에서는 for를 사용해서 별표(*)를 15회 출력했는데 이번에는 while을 사용해서 같은 내용을 실행해 보겠습니다.
예제 16-13에서는 먼저 카운터 변수 $i에 1을 대입합니다. 그리고 print "*";를 실행할 때마다 변수 $i를 1씩 증가시키는데 이 작업을 while로 반복합니다. 반복 조건은 '변수 $i가 15 이하'입니다.
예제 16-13 while.php
<?php
$i=1;
while($i<=15){
print "*";
$i++;
}
?>
$i=1;에서 $i에 1을 대입하고 조건을 확인합니다. 처음의 변수 $i는 1이기 때문에 <=15(15 이하)라는 조건에 참(TRUE)을 반환하므로 print "*"가 실행되어 *가 출력됩니다.
다음은 $i++;에서 변수 $i가 1 증가해서 2가 됩니다. 그리고 다시 while로 돌아가서 while($i<=15) 조건이 참인지 확인합니다.
이 작업을 반복해서 $i++;로 변수 $i를 증가시킨 값이 16이 되면, 조건을 만족하지 않으므로(FALSE) 16번째는 출력하지 않고 처리가 종료됩니다.
5.3 do~while을 이용한 반복 처리
while과 비슷한 구문으로 do~while이 있습니다. while과 다른 점은 조건을 검사하는 처리를 나중에 한다는 것입니다.
do~while 구문
do{
반복 처리
}while(반복_조건)
다음을 실행하면 예제 16-13과 같은 결과를 얻을 수 있습니다.
예제 16-14 do_while.php
<?php
$i=1;
do{
print "*";
$i++;
}while($i<=15)
?>
먼저, $i=1에서 1을 대입하고, $i++에서 1을 증가시키고, while($i<=15) 에서 15 이하일 때 라는 처리를 하고 있습니다.
주의할 점은 while의 경우에는 조건을 먼저 검사하기 때문에, 만일 조건에 일치하지 않으면 단 한번의 처리도 이루어지지 않고 종료한다는 것입니다. 그러나 do~while의 경우에는 조건을 마지막에 검사하기 때문에 적어도 1번은 실행됩니다.
6. 조건 분기 프로그래밍
6. 조건 분기
6.1 if를 이용한 조건 분기
if는 조건에 따라 실행할 내용을 변화시킵니다. PHP 스크립트에서는 다음과 같이 사용합니다.
if 구문
if(조건){
조건이 참일 때 실행하는 처리
}else{
조건이 거짓일 때 실행하는 처리
}
괄호() 안의 조건이 참(TRUE) '조건이 참일 때 실행하는 처리'를 실행하고, 그렇지 않으면 '조건이 거짓일 때 실행하는 처리'를 실행합니다.
if 문의 흐름
예제 16-15의 예를 실행해 보겠습니다.
예제 16-15 condition.php
<?php
if(200>100){
print "큽니다.";
}else{
print "작습니다.";
}
?>
'A>B'는 'A는 B보다 크다.'라는 의미 입니다. '200과 100 중에 어느 쪽이 큰가?'라고 했을 때, 당연히 200이 큽니다. 즉, '만일 200이 100보다 크다면'(200>100)이라는 조건을 검사합니다. 이 조건은 참이기 때문에 구문중 '조건이 참일 때 실행하는 처리'가 실행됩니다.
만일, 조건이 거짓인 경우에는 else 안의 내용을 실행합니다. 참고로, 이번에는 이 구문은 실행되지 않습니다.
물론, 실제 스크립트에서는 '200>100'과 같은 당연한 조건을 설정할 일은 없습니다. 예를 들어, '데이터베이스에 접속했다면'이나, '지정한 문자가 포함되어 있다면'과 같이 데이터 처리에 필요한 판단을 할 때 이용됩니다. 또한, 구문 중의 else(조건이 거짓일 때~)의 부분은 필요없다면 생략해도 됩니다. 생략하면 조건이 참일 때에만 해당 처리가 실행되고, 그렇지 않으면 아무것도 실행되지 않습니다.
6.3 여러 개의 조건을 설정한 if 구문
if에는 조건식을 몇개라도 설정할 수 있습니다. 다음은 여러 개의 조건을 설정한 구문입니다.
여러 개의 조건을 설정한 if 구문
if(조건1){
조건1 이 참일 떄 실행하는 처리
}else if(조건2){
조건2 가 참일 떄 실행하는 처리
}else if(조건3){
조건3 이 참일 떄 실행하는 처리
....
}else{
모든 조건이 참이 아닐 때 실행하는 처리
}
여러 개의 조건을 설정한 if 문의 처리는 다음과 같습니다.
조건1이 참(TRUE)이면 조건1이 참일 때 실행하는 처리 부분을 실행하고, 그렇지 않으면
▽
조건2가 참(TRUE)이면 조건2가 참일 때 실행하는 처리 부분을 실행하고, 그렇지 않으면
▽
....
모든 조건이 참이 아니면 모든 조건이 참이 아닐 때 실행하는 부분을 실행하다.
저장 프로시저에서 조건 분기 사용하기
여기서는 사용하고 있지 않지만, MySQL의 저장 프로시저에서도 if를 사용해서 조건 분기를 할 수 있습니다.
여러개의 조건을 설정한 if 문의 흐름
그럼, 약간 복잡한 처리를 해보겠습니다. 접속한 시간에 따라 변화하는 인사 메시지를 만들어 보겠습니다. 현재 시각은 date("G")로 구할 수 있습니다. 즉, date("G")의 값이 18 이상과 date("G")의 값이 9 이상... 이라는 조건을 설정하고 if로 분기 처리를 합니다.
구체적으로, 0시부터는 '졸리지 않나요?', 6시 부터는 '일어나세요.', 9시 부터는 '좋은 아침 입니다.', 18시 부터는 '퇴근할 시간이네요.'라고 표시되는 예제 16-6을 만들어 보겠습니다.
예제 16-16 if.php
<?php
if (date("G")>=18) {
print "퇴근할 시간이네요.";
}elseif (date("G")>=9) {
print "좋은 아침입니다.";
}elseif (date("G")>=6) {
print "일어나세요.";
}else{
print "졸리지 않나요?";
}
?>
실행한 시간에 따라 해당하는 문자열이 표시됩니다.
6.3 switch를 이용한 분기
변숫값에 따라 각각 다른 처리를 실행할 때에는 switch를 사용합니다. 예를 들어, 변수 $i가 1일 때에는 ХХ, 변수 $i가 2일 때에는 △△, 변수 $i가 3일 떄에는 ◯◯...을 실행하는 처리를 할 수 있습니다.
이 처리는 if문을 사용해서 똑같이 실행할 수 있습니다. 그러나 switch를 사용하면 좀 더 알기 쉽게 표현할 수 있습니다.
switch 구문은 다음과 같습니다.
switch 구문
switch(변수){
case 변숫값 1:
처리 1
break;
case 변숫값 2:
처리 2
break;
...
default;
모든 조건이 참이 아닐 때 실행하는 처리
}
switch에 설정한 변수의 값이 case에 설정한 값과 일치하면, 해당하는 처리가 실행됩니다. 각각의 처리 뒤에는 반드시 break를 기술합니다. break는 처리를 종료하는 명령입니다.
일치하는 값이 없으면 default;에 설정한 처리가 실행됩니다.
switch 문의 흐름
예제 16-7은 10시에는 '10시 간식입니다.', 15시에는 '3시 간식입니다.', 10시와 15시 외에는 '간식 시간이 아닙니다.'라고 표시되는 예입니다.
예제 16-17 snack.php
<?php
switch (date("G")) {
case 10:
print "10시 간식입니다.";
break;
case 15:
print "3시 간식입니다.";
break;
default:
print "간식 시간이 아닙니다.";
break;
}
?>
각각의 처리 뒤에 break를 기술하는 것을 잊지 않도록 합니다. 만일, break를 기술하지 않으면 그 뒤의 처리는 실행되지 않습니다. 그리고 case 변숫값1:과 같이 쌍점(:)에도 주의하기 바랍니다.
이번에는 switch를 사용해서 다음과 같은 연결 모양을 출력해 보겠습니다.
◎★◯▽▲◎★◯▽▲◎★◯▽▲◎★◯▽▲◎★◯▽▲.....
for를 이용해서 1~5까지의 값을 변수에 대입하고, switch를 이용해서 CASE에 설정한 각각의 처리를 합니다. 그리고 이를 다시 for를 이용해 반복하는 방법입니다.
예제 16-18은 변수 $y가 1이면, ◎, 2면 ★, 3이면 ◯, 4이면 ▽, 5이면 ▲를 출력하는 처리를 8번 반복해서 앞의 '◎★◯▽▲'를 8연속 출력합니다.
예제 16-18 switch.php
<?php
for ($x=1; $x <= 8; $x++) {
for ($y=1; $y <= 5; $y++) {
switch ($y) {
case 1:
print "◎";
break;
case 2:
print "★";
break;
case 3:
print "◯";
break;
case 4:
print "▽";
break;
case 5:
print "▲";
break;
}
}
}
?>
처리 내용을 살펴보겠습니다.
먼저, 다음과 같이 변수 $y가 1이면 ◎, 2이면 ★와 같이 분기 처리를 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php switch ($y) { case 1: print "◎"; break; case 2: print "★"; break; ~ 중간 생략 ~ case 5: print "▲"; break; } ?> | cs |
그리고 이 switch문을 다음과 같이 for 문으로 반복합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php for ($y=1; $y <= 5; $y++) { switch ($y) { case 1: print "◎"; break; case 2: print "★"; break; case 3: print "◯"; break; case 4: print "▽"; break; case 5: print "▲"; break; } } ?> | cs |
변수 $y는 1, 2, 3, 4, 5로 증가하기 때문에, ◎★◯▽▲가 각각 출력됩니다.
이 카운터 변수 $y를 이용한 for 문을 카운터 변수 $x를 이용한 for 문으로 8번 반복합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php for ($x=1; $x <= 8; $x++) { for ($y=1; $y <= 5; $y++) { switch ($y) { case 1: print "◎"; break; case 2: print "★"; break; case 3: print "◯"; break; case 4: print "▽"; break; case 5: print "▲"; break; } } } ?> | cs |
참고로, 여는 중괄호 {와 닫는 중괄호 }는 1대 1이어야 합니다.
7. 배열 사용법
7. 배열
7.1 배열이란 무엇인가?
지금까지 사용하 변수는 $i=100과 같이 1개의 값만 저장했습니다. 사실은 1개의 값처럼 보이지만, 더욱 많은 값을 저장할 수 있는 편리한 변수가 있습니다. 이를 배열이라고 합니다.
'일반 변수가 아닌 배열 변수'로 선언하는 방법은 몇 가지가 있지만, 가장 먼저 array()라는 함수를 소개하겠습니다. 그리고 배열 변수의 이름에도 16장 1.2 변수 이름의 규칙 에서 다룬 규칙중 하나가 적용됩니다.
예를 들어, $m이라는 변수를 배열로 선언해서 그 안에 많은 값을 저장하려면 다음과 같이 선언합니다.
$m = array("쥐", "소", "호랑이", "토끼", "Dragon");
이렇게 하면 $m이라는 하나의 변수에 '쥐', '소', '호랑이', 'Dragon'이라는 5개의 문자열이 저장됩니다. PHP에서는 '데이터를 대입하면 자료형이 알아서 설정된다.'라고 했기 때문에 $m은 문자열 자료형의 배열 변수가 됩니다.
다음은 배열에서 각각의 값을 추출하는 방법입니다. 예를 들어, 앞의 값(문자열)은 왼쪽부터 각각 1번째는 $m[0], 2번째는 $m[1], 3번째는 $m[2]... 이라는 이름으로 저장됩니다. 값을 꺼낼 때에도 그 이름을 사용합니다. 즉, print $m[2]; 를 실행하면 '호랑이'가 출력됩니다. '소'가 아니니 주의하기 바랍니다.
저장된 값과 배열 변수
배열 변수 |
저장된 값 |
$m[0] |
쥐 |
$m[1] |
소 |
$m[2] |
호랑이 |
$m[3] |
토끼 |
$m[4] |
Dragon |
대괄호 [] 안의 숫자로 '몇 번째 값'인지를 판단합니다. 이 [] 안의 숫자를 첨자라고 합니다. 첨자는 0부터 시작합니다. 그렇기 때문에, 배열의 마지막 첨자는 배열의 전체 수보다 1 작다는 점에 주의하기 바랍니다.
참고로, 앞의 예에서 5번째의 'Dragon'은 $m[5]가 아닌 $m[4]입니다.
7.2 배열의 값을 대입하는 방법
다음은 array() 하수를 사용하지 않고 배열 변수에 값을 대입하는 방법입니다.
직접 대입하기
$m[4] = "Dragon";
$m[0] = "쥐";
$m[2] = "호랑이";
$m[1] = "소";
$m[3] = "토끼";
이때는 순서에 관계없이 대입할 수가 있습니다. 또한, $m[777] = "학문"과 같이 첨자를 순서대로 사용하지 않아도 상관없습니다.
순서대로 대입하기
$m[] = "쥐";
$m[] = "소";
$m[] = "호랑이";
$m[] = "토끼";
$m[] = "Dragon";
이렇게 하면 가장 먼저 대입한 값부터 $m[0], $m[1]... 이 됩니다. for나 while을 사용해서 반복해서 값을 대입하면 편리합니다.
첨자를 사용하는 방법은 익숙하지 않으면 틀리기 쉬우니, 세심한 주의가 필요합니다.
배열을 사용한 예
예제 16-19는 예제 16-16을 배열을 사용해서 수정한 예입니다. 배열 변수 $m에 '졸리지 않나요?'와 '좋은 아침입니다.', '일어나세요.', '퇴근할 시간이네요.'를 대입해서, 0시부터 '졸리지 않나요?', 6시부터 '일어나세요.', 9시부터 '좋은 아침입니다.', 18시부터 '퇴그날 시간이네요.'라고 표시합니다.
예제 16-19 squence.php
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $m = array("졸리지 않나요?", "일어나세요.", "좋은 아침입니다.", "퇴근할 시간이네요."); if (date("G")>=18) { print $m[3]; }elseif (date("G")>=9) { print $m[2]; }elseif (date("G")>=6) { print $m[1]; }else{ print $m[0]; } ?> | cs |
2번 라인의 "졸리지 않나요?"sms $m[0], "좋은 아침입니다."는 $m[1], "일어나세요."는 $m[2], "퇴근할 시간이네요."는 $m[3]에 대입됩니다.
첨자의 숫자 설정은 적당하게...
첨자를 몇 개 사용하지도 않으면서 $m[777]="학문"과 같이 너무 동떨어진 숫자를 설정하면 쓸데없이 메모리를 소비하게 됩니다. 될 수 있으면 필요한 만큼만 첨자를 설정하도록 합니다.
7.3 연관 배열
첨자는 순서를 나타내는 숫자 외에도 사용자가 정한 문자를 사용할 수 있습니다. 이를 연관 배열이라고 합니다.
예를 들어, 시험 점수를 저장하는 배열 변수에서 영어는 $t["eng"], 국어는 $t["kor"]...과 같이 직관적으로 알기 쉬운 첨자를 설정할 수가 있습니다.
예제 16-20은 연관 배열을 사용한 예입니다. '합계 점수는:225'라고 표시됩니다.
예제 16-20 relation.php
1 2 3 4 5 6 7 | <?php $t["eng"] = 73; $t["math"] = 84; $t["kor"] = 68; print "합계 점수는 "; print $t["eng"] + $t["math"] + $t["kor"]; ?> | cs |
연관 배열의 첨자나 큰따옴표(")나 작은따옴표(')를 사용하지 않아도 동작한다!?
연관 배열의 첨자에는 큰따옴표(") 또는 작은따옴표(')를 사용하는 것이 정석입니다. 그러나 $m[eng]와 같이 연관 배열에 큰따옴표(")나 작은 따옴표(')를 사용하지 않아도 대개 아무런 문제 없이 동작합니다.
▶ 동작은 하지만 정석이 아닌 예
1 2 3 4 5 6 7 | <?php $m[kim] = 100; $m[lee] = 200; print $m[lee]; print "<BR>"; print $m[kim]; ?> | cs |
앞의 예는 정상적으로 실행됩니다. 하지만 엄밀히 말하면 잘못된 작성법으로 본래는 $m["kim"], $m["lee"] 라고 작성해야 합니다. $m[kim] 이나 $m[lee] 라고 작성해도 눈에 보이는 오류는 표시되지 않지만, 사실은 작은 오류가 발생한 상태입니다. 그러나 PHP에는 가능한 한 최선을 다해 스크립트를 해석하는 기능이 있습니다. 눈앞에 오류가 표시되지 않는다고해도 오류가 없는 것은 아니니 연관 배열의 첨자는 반드시 큰따옴표(")나 작은따옴표(')를 사용하도록 합니다.
※ 근데 저는 위의 저 코드는 오류를 발생하고 있습니다. 버전이 올라가서 그런듯 합니다.
이 장의 내용은 모두 MySQL과 연계하는 데 필요한 내용입니다. 특히, 프로그램 언어를 처음 접하는 분이라면 for나 while, switch 등은 프로그램 언어의 기본이니 사용 방법에 익숙해지도록 합시다.
체크!
★ PHP의 변수 이름 규칙을 이해하고 있다.
★ PHP에서 문자열을 결합하는 방법을 이해하고 있다.
★ 변수에 사용하는 큰따옴표(")와 작은 따옴표(')의 차이점을 이해하고 있다.
★ 날짜와 시간을 표시할 수 있다.
★ 클라이언트의 IP 주소와 웹 서버의 정보를 표시할 수 있다.
★ for를 이용한 반복 처리를 이해하고 있다.
★ while을 이용한 반복 처리를 이해하고 있다.
'MySQL & PHP 학습 > 정리 그리고 체크!' 카테고리의 다른 글
[MySQL & PHP] 18장 PHP 스크립트를 이용해서 MySQL 조작하기 (2) | 2016.03.09 |
---|---|
[MySQL & PHP] 17장 PHP 스크립트와 HTML (5) | 2016.03.06 |
[MySQL & PHP] 15장 MySQL을 이용하는 데 필요한 PHP (2) | 2016.02.22 |
[MySQL & PHP] 14장 파일 사용하기 (0) | 2016.02.13 |
[MySQL & PHP] 13장 트랜잭션 활용하기 (8) | 2016.02.04 |