프로그래밍.../PostgreSQL | Posted by 고기킬러 2010. 1. 8. 15:57

PostgreSQL with PHP

PostgreSQL with PHP

HOWTO PostgreSQL
김준석 저

시작하며

컴퓨터에서 데이터베이스란 정보의 저장소를 의미한다. 각종업무에서 데이터베이스가 필
요하고, 워드에서 게임까지 수많은 프로그램에서 데이터베이스가 존재한다. 리눅스에는 이
러한 일을 처리해 줄 데이터베이스가 많다. 그들은 무료일 뿐만 아니라 성능면에서도 탁월
함을 보여준다. 필자는 PostgreSQL을 PHP와 연동해서 사용하는 것을 설명하겠다.
PostgreSQL을 다른 용도로 사용하실 분은 아쉽지만 설치에 대한 정보만 필요할 것이다.

PostgreSQL은 리눅스(유닉스?)용으로 개발된 무료(자유) 데이터베이스이다. 리눅스에서
사용할 수 있는 데이터베이스라면 infomix,mSQL,oracle등이 있을 것이다. 중소규모에서
가장 많이 쓰인다면 MySQL을 들수 있을 것이다. 아쉽지만 PostgreSQL은 속도 면에서는
MySQL보다 떨어지는 것 같다.(보든 분야에서 확실치는 않다.) 하지만 안정성에서는
MySQL보다 앞서는 것 같다.(이 또한 확신 할 수는 없다.)

필자는 국내에 PostgreSQL에 대한 문서가 너무 적은 듯 싶어서 이 문서를 쓰기 시작했다.
쓰면서도 다른 곳에서 정보를 얻기란 정말 어려웠다. www.postgresql.org에 있는 영문
PDF문서를 많이 참고했다. 지금은 많은 부분이 생략된 상태에서 문서를 배포하게 되었다.
설치과정도 소스로 설치하는 부분이 생략되었고, rpm으로 설치하는 부분또한 레드헷에 치
중되어 있다. 또한 PHP, PostgreSQL을 이용하여 게시판을 만드는 부분도 빠졌고, 많은 팁
이나 PostgreSQL관리에 대한 것들 또한 빠져 있다. 이들은 조만간 후에 다시 문서를 배포
할 때 함께 있을 것이다.

본 문서는 PDF로만 배포될 것이며 필자의 허락없이 재배포 할 수 없다. 또한 필자의 문서
를 이용해서 다른 문서를 작성하는 것도 허락하지 않겠다. 다만 PostgreSQL에 지식이 있
고, 좋은 문서를 배포할 수 있게 도와줄 사람이라면 개인적으로 파일을 주겠다. 이 글과
PostgreSQL에 대한 질문은 tozigy.com으로 오셔서하기 바란다.

필자는 본 문서를 작성하면서 윈도우를 사용했다. 따라서 각종 예시 그림들도 윈도우 어플
리케이션일 것이다. 다른 오해가 없기를 바란다.

PostgreSQL with PHP

1 장 PostgreSQL 설치하기

본 문서에는 rpm으로 PostgreSQL을 설치하는 법만 나와있다. 나중에 다시 나올 문서에는
소스를 이용해 설치하거나, 윈도우에서 설치하는 법이 있을 것이다. (필자는 아직까지도
윈도우에서 PostgreSQL설치에 성공한 적이 없다. 아시는 분은 알려주기 바란다.)

rpm으로 설치하기

리눅스에서 프로그램을 설치한다면 크게 두개로 생각할 수 있다. 예전부터 사용된 소스를
이용한 방법과 레드헷 6.1부터 제공된 rpm(Redhat Pakage Manager)을 이용한 설치 방법
이 있다. 여기서는 rpm으로 설치하는 방법으로 하겠다. rpm으로 설치하면 소스를 이용하
여 설치하는 것 보다 편하게 설치,관리 할 수 있다.
www.postgresql.org로 들어와서 FTP미러 사이트에 들어오면 각 배포판에 알맞은 rpm을
구할 수 있다. 국내 유저가 많이 이용하는 ‘와우리눅스’, ‘한컴리눅스’등은 레드헷 기반 rpm
을 받으면 된다. 한국미러는 ftp.kr.postgresql.org로 익명 접속하면 된다.

 
위의 그림과 같이 자신의 배포판에 맞고 원하는 버전의 PostgreSQL을 다운 받으면 된다.
많은 파일 중에서 다음과 같은 파일만 받으면 된다.

postgresql-*-*.*.rpm
PostgreSQL 클라이언트 프로그램과 라이브러리를 포함하는 패키지
postgresql-server-*-*.*.rpm
PostgreSQL Datebase를 형석 작동하기 위한 패키지
postgresql-libs-*-*.*.rpm
PostgreSQL 클라이언트 프로그램과 인터페이스를 위한 라이브러리를 제공하는 패키지

N O T E rpm 파일에 대해서
postgresql-7.2-1PGDG.i386.rpm보통 rpm파일은 위와 같은 형태를 가지고 있다.
postgresql은 프로그램 이름이며 그 뒤에 붙은 것은 각종 정보를 가지고 있다.postgresql -
> 프로그램 이름7.2 -> 버전 이름1PGDG -> 패치 정보i386 -> 하드웨어 플랫폼
(i386,i586,i686)
 
F.A.Q. i386 i486 i586 i686의 차이점
위 NOTE에서 나왔듯이 rpm 패키지 파일에는 i***이라는 것이 붙는다. 이는 rpm을 설치하
기 적합한 하드웨어(CPU)를 알려줍니다. 우리가 흔히 보는 i*86은 인텔 계열이며 sparc은
스팍 리눅스용, alpha는 알파리눅스용을 나타냅니다. i*86에서도 i386 i486등으로 나뉩니
다. i386은 인텔 CPU 386이상의 컴퓨터에 적합합니다. i486은 486에 i586은 펜티엄 초기 중
기, i686은 펜티엄3 이상의 CPU가 적합함을 의미합니다. i386인 rpm은 386이상의 컴퓨터
에 설치가 됩니다. 하지만 i586인 rpm을 386컴퓨터에 설치할려면 예기치 않은 오류가 있을
수 있습니다. 이는 윈도우98용 소프트웨어가 윈도우2000에 설치가 되며 윈도우2000용 소프
트웨어는 윈도우98에 설치가 되지않는것과 비슷한의 의미입니다.

받은 파일을 이용하여 다음과 같이 설치하면 된다. 당연히 root 계정에서 해야한다.

# rpm –Uvh postgresql-*또는#rpm –Uvh postgresql-server-*#rpm –Uvh postgresql-
*#rpm –Uvh posrgresql-libs-*따로 설치할 경우에는 의존성 문제 때문에 순서를 맞추어
야 한다.

다음과 같이 나오면 설치에 성공한 것이다.

 


T.I.P. rpm –q 옵션
rpm 명령어와 q로 시작한 옵션을 이용하여 설치된 패키지의 정보를 알 수 있다. 주로 –qi
와 –ql 옵션을 이용한다.-qi을 이용할 경우 패키지에 대한 자세한 정보가 나온다.-qa을 이
용할 경우 설치된 패키지의 파일들의 경로명이 나온다.


PostgreSQL 서비스 시작하기

 

PostgreSQL 데이터베이스에 접속하고 작업을 시작하기 위해서는 우선 PostgreSQL 데몬
을 시작해야 한다. 다른 데몬과 마찬가지로 PostgreSQL도 rpm으로 설치했을 경우에
는 /etc/init.d/ 폴더 내에 PostgreSQL 데몬을 다루는 스크립트 파일이 생긴다.
따라서 위와 같이 PostgreSQL 서비스를 시작, 중지 할 수 있다. 물론 root일 때만 가능하
다.

서비스 시작하기# /etc/init.d/postgresql start서비스 중지하기# /etc/init.d/postgresql
stop서비스 재시작하기# /etc/init.d/postgresql restart

새 사용자 만들기

처음으로 사용자를 등록하도록 하자. PostgreSQL의 사용자는 리눅스 유저와는 다른 유저
이다. 또한 root가 사용자를 등록할 수는 없다. 새로운 사용자를 등록할려면 우선 사용자
를 Postgres 바꾸어야 한다. (처음에는 비밀번호가 없다.)

 

createuser 유저명 으로 새 사용자를 등록한다. 패스워드까지 같이 등록하는 것은 다음에
다루도록 하겠다. 새 사용자를 등록할 때에는 두가지의 질문이 오른다. 첫번째는 새 사용자
가 앞으로 새 데이터베이스를 만들 수 있게 할지 묻는 것이고, 두번째는 새 사용자가 새 유
저를 만들 수 있게 할지 묻는 것이다. 각자 판단에 의해서 y와 n을 기입하기 바란다. 보통
일반 유저라면 이러한 권한이 필요가 없다.

다음에는 데이터베이스를 만들도록 하자. 간단히 createdb 디비명 으로 만들 수 있다.

PostgreSQL 접속하기

PostgreSQL에 접속한다는 것은 클라이언트 프로그램으로 데이터베이스에 접속한다는 뜻
이다. psql 명령어를 통해서 접속 할 수 있다. 주로 –U 와 –d 옵션을 이용한다. 더 많은 옵
션을 알려면 psql --help 를 참고하면 된다. –U 다음에는 접속할 사용자 아이디를 –d 다음
에는 접속할 데이터베이스를 쓴다. 앞에서 만든 test 데이터 베이스를 tozigy 유저로 접속
할려면 다음과 같이 한다.
 

접속과 동시에 몇가지 단축기능에 대해 설명해 준다. 다음은 그에대한 간략한 설명이다.

copyright postgreSQL의 저작권을 간략히 보여준다.
h SQL명령어에 대한 도움말을 보여준다.
? 로 시작하는 명령어에 대한 도움말을 보여준다.
g 입력한 SQL문을 실행시킨다.
q 데이터베이스에서 빠져 나온다.

?과 h 명령으로 PostgreSQL에서 쓰이는 많은 명령어에 대한 정보를 알 수 있다.

 

T.I.P. h 명령어
PostgreSQL을 쓰면서 따로 정보를 구할 필요 없이 도움말을 통해서도 많은 정보를 얻을
수 있다. 다음은 그림은 h 으로 ALTER TABLE에 대한 정보를 얻는 것을 보여준다. 다음
과 같이 h 이후에 알고싶은 명령어를 붙여주면 그에대한 정보가 나온다.


PostgreSQL with PHP

2 장 PostgreSQL, PHP, Apache 연동하기

아파치,PHP,Mysql(APM)을 연동하여 사용할 수 있듯이 아파치,PHP,PostgreSQL을 연동
하여 웹 서비스를 할 수 있다. 앞에서 먼저 말했듯이 이 문서에서는 리눅스에서 rpm으로 패
키지를 설치하고 새팅하는 것만 다룬다. 윈도우에서 구현하거나, 소스로 설치하는 것들은
앞으로 다시 나올 문서에 포함되어있을 것이다.

F.A.Q. MySQL이 설치되어있는데 PostgreSQL을 설치 할수 있나요?
설치할수 있습니다. 사실 데이터베이스가 한 플랫폼내에 몇 개가 되어도 상관없습니다.(약
간은 과장입니다.) 데이터베이스라는 개념이 많은 정보들을 한곳에 규칙에 따라서 저장하
는 것이기 때문입니다. 웹서버도 윈도우에서 IIS와 APACHE를 같이 돌릴 수 있습니다. 하
지만 디폴트로 시도하면 둘다 포트 80번을 사용하기 때문에 에러가 날 뿐이죠.

아파치와 PHP에서 설치하는 순서는 아파치 à PHP입니다. PostgreSQL은 아무 때에 설치
해도 됩니다. 중요한 것은 PHP스크립트로 웹에서 PostgreSQL에서 접속하고 SQL문을 실
행할 수 있도록 모듈을 잡아주는 것입니다.

아파치 설치하기

먼저 아파치를 설치합니다. 쉽게 rpm으로 설치하도록 하죠. 필요한 rpm은 설치하신 배포
판 CD에서 찾거나 ftp.bora.net에서 자신에게 맞는 배포판의 rpm을 찾으시면 된다.
apache-*-*.*.rpm 과 apacheconf-*-*.*.rpm 파일이 필요한다.

설치

아파치 시작하기

아파치 데몬을 시작할려면 다음과 같이 하면 된다.

[root@tozigy /]# /etc/init.d/httpd start

/etc/init.d/httpd 파일은 아파치 실행에 대한 스크립트 파일이며 start 데몬을 시작하라는
는 옵션이다. 하지만 분명 다음과 같은 오류가 날것이다.
 

위 그림과 같이 에러가 날것이다. 이는 웹서버의 이름이 설정되어있지 않기 때문이다. 웹서
버는 실행되고 있다. ([확인]이라는 메시지가 떴다.) 아파치 데몬 실행시 이 메시지를 띄우
지 않기 위해서는 아파치 설정파일을 수정해야 한다. 다음과 같은 명령어로 수정할 수 있
다.

[root@tozigy /]# /etc/httpd/conf/httpd.conf

설치한 아파치의 패키지에 따라서 httpd.conf파일의 위치가 다를 수 있다. 위의 것은 레드
헷 계열을 예로 한 것이다. 만약 httpd.conf파일을 찾을 수가 없다면 다음과 같이하면 찾을
수 있다.

[root@tozigy /]# rpm -ql apache | grep conf

 
위의 그림에서 #ServerName localhost라는 부분이 있다. 주석을 제거(#를 제거)하고
localhost부분을 바꾸면 된다. localhost를 그냥 놔두어도 된다. 고정아이피가 있다면 아이
피 주소를 도메인이 있다면 도메인 명을 적어주면 된다. 수정 후 아파치 데몬을 재시작하
면 다음과 같이 에러문 없이 시작된다.

 

N O T E #ntsysv
ntsysv명령어로 리눅스 서버가 부팅 될 때 자동으로 실행될 데몬을 설정할 수 있다. 앞에
서 설치한 아파치 데몬이 부팅시 바로 실행되게 하려면 다음 그림과 같이 httpd 앞에 체크
를 하고 [확인]을 눌러주면 된다.  직접 보면 여러가지의 서비스가 있는 것을 확인할 수 있
다. 잘 모르는 서비스라면 F1를 누르면 그림과 같이 그 서비스에 대한 설명이 나온다.

웹서버가 실재로 잘 돌아가는지 확인해 보자. 웹브라우저로 서버에 접속해 본다.

 

다음과 같은 페이지가 출력되면(설치한 아파치 패키지에 따라 다를 수 있다.) 성공적으로
웹서버를 구축한 것이다. 페이지 내용을 자세히 보면 여러가지 정보를 얻을 수 있다.

PHP 설치하기

다음에는 PHP를 설치해 보죠. 필요한 rpm은 위에서 아파치관련 패키지를 구했던 방법으
로 구한다. 필요한 파일은 php-*-*.*.rpm 이며 중요한 것은 php-pgsql-*-*.*.rpm 파일이
필요하다. php-pgsql-*-*.*.rpm 파일은 PHP스크립트를 이용하여 PostgreSQL에 접속,
SQL 쿼리문등을 실행 할수 있게 해준다. 파일을 받은 이후에 php-*-*.*.rpm à php-pgsql-
*-*.*.rpm 순서로 패키지를 설치한다. PHP는 설치한 이후에는 위의 아파치와 같이 따로 데
몬을 실행시킬 필요가 없다. 단지 PHP가 잘 설치되어 있는지는 다음과 같이 알아 볼수 있
다.

php파일 하나를 다음과 같이 작성한다. (/var/www/html 디렉토리 내에 간단히 test.php
라고 만들자.)

<?phpinfo();?>

그리고 웹 브라우저로 확인한다. 다음과 같은 결과가 나올 것이다.

 

중간에 다음과 같은 메시지가 있으면 Apache, PHP, PostgreSQL 연동 준비가 끝난 것이
다. 이제 본격적으로 PHP과 PostgreSQL을 다루는 법을 알아보자.

 

F.A.Q. MySQL도 서비스 할려면?
위에서 한번 언급했듯이 PostgreSQL과 MySQL을 동시에 운영할 수 있다. 우선 MySQL서
버를 설치하고 위에서 했듯이 데몬을 시작한다. 그리고 PHP스크립트로 PostgreSQL에 접
속하기 위해서 php-pgsql-*-*.*.rpm 파일을 설치했듯이 php-mysql-*-*.*.rpm 파일을 받
아서 설치하면 된다.

F.A.Q. 그림 #@$와 같은 결과가 안나옵니다.
PHP가 PostgreSQL을 지원하도록 설정을 해야 합니다. 우선 /etc/php.ini파일을 수정합니
다. 파일에 다음과 같은 부분이 있으면 주석(;)을 제거하도록 합니다.;extension=pgsql.so
그리고 아파치 데몬을 다시 시작해 봅니다.

PostgreSQL with PHP

3 장 PostgreSQL지원 PHP 함수

본 문서에서는 PHP의 PostgreSQL지원 함수에 대한 설명만 있다. 이 함수들을 이용하여
게시판을 만드는 과정은 이후에 나올 새 문서에 포함되어 있을 것이다.

pg_connect()

pg_connect()함수를 이용하여 PostgreSQL에 접속할 수 있다. PHP와 PostgreSQL 이용
하여 작업을 하려면 우선적으로 pg_connect()함수를 이용하여 해당 데이터베이스에 접속
을 해야한다.

예시 1-1
1234 <?$dbconn = mysql_connect (“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);?>

예시 1-2
12345 <?$dbconn = pg_connect (“dbname=test”);$dbconn1=pg_connect
(“user=tozigy password=security dbname=test”);$dbconn2=pg_connect
(“dbname=test”) or die (“not connected!”);?>

mysql_connect(예시 1-1)와 pg_connect(예시 1-2)는 사용법이 조금 다르다.
mysql_connect는 서버명,사용자이름,패스워드를 따옴표를 구분해서 나열한다. 하지만
pg_connect는 각각 따로 인수에 값을 대입해 주는 형식을 취한다. 또한 mysql에서는 원하
는 데이터베이스에 접속하기 위해서 mysql_connect() 다음에 mysql_select_db를 써야한
다. 하지만 PostgreSQL에서는 pg_connect하나로 해결 할 수 있다. 예시 1-2를 보자. 2번
라인은 가장 간단한 접속법이다. 디비이름만 지정해 주었다. 보통은 3번 라인을 쓴다. 사용
자이름, 패스워드, 디비이름을 지정해 준다. 각각 인수는 한칸씩 띄워서 구분한다. 4번 라
인은 접속에 실패 했을 경우 “not connected!”라는 에러메시지를 출력하게 한다.

T.I.P. config.inc.php
일반적으로 데이터베이스 연결 부분은 따로 파일은 만들어 관리한다. 이유는 보안상 안전
해 질수 있고 작업도 좀더 효율적으로 할 수 있기 때문이다. config.inc.php 파일은 그러한
파일의 대표적인 이름이다(바꾸어도 상관없다). config.inc라고도 쓰지만 서버에서 확장자
가 inc인 파일이 PHP스크립트로 지정되지 않은 경우 웹상에서 직접 config.inc파일을 불러
오면 스크립트 내용을 전부 출력하는 문제가 있다. 따로 파일을 만들고 후에 불러들일 때
는 include를 사용하면 된다.

N O T E pg_connet와 사용가능한 인수
dbname : 데이터베이스 , port : 포트번호 , host : 호스트명 , tty :  , options :  , user : 유
저명 , password : 비밀번호

pg_close()

pg_close()함수는 pg_connect로 연결된 PostgreSQL의 연결을 끊는 것이다. 불필요한 연
결이 계속 지속된다면 그만큼 서버 시스템에 부하를 많이 주는 것이다. pg_close()로 연결
을 끊는 습관을 가지는 것이 좋다.

예시 2-1
123456 <?$dbconn = mysql_connect (“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);mysql_close($dbconn); // mysql_close()
만 써도 된다.?>

예시 2-2
12345 <?$dbconn = pg_connect (“dbname=test”);pg_close($dbconn); //
pg_close() 만 써도 된다.?>

위의 예제와 같이 mysql_close()와 pg_close()는 사용법이 같다. 물론 postgreSQL에 연
결되지 않은 상태에서 위 함수를 사용하면 에러가 출력된다. 함수내 서버 연결 인자를 써야
하나 쓰지 않더라도 작동한다. 만약 데이터베이스 연결이 여러 개라면 한번에 접속을 종료
하게 된다.

F.A.Q. pg_close()를 반듯이 써야 하나요?
일반적으로 PHP 스크립트가 끝이나면 PHP 스스로 데이터베이스 연결을 종료한다. 따라
서 pg_close()를 사용하지 않아도 상관이 없다. 하지만 습관적으로 사용하는 것이 좋다.

pg_exec()

PHP스크립트로 PostgreSQL의 SQL문을 실행시킬려면 pg_exec()함수를 사용한다.
pg_exec()함수에 인자로 들어갈수 있는 SQL문은 PostgreSQL에서 사용가능한 거의 모든
SQL문이 해당된다. MySQL에서 유사 함수는 mysql_query()이다.

예제 3-1
123456 <?$dbconn = mysql_connect (“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);$sql = “select * from test”;$query =
mysql_query($sql,$dbconn);?>

예제 3-2
12345 <?$dbconn = pg_connect(“dbname=test”);$sql = “select * from
test”;$query = pg_exec($dbconn,$sql);?>

mysql_query와 pg_exec의 사용법은 같다. 하지만 주의해야 할점은 접속지시자의 위치가
다르다는 것이다. mysql_connect와 같은 경우에는 접속 지시자가 SQL문 다음에 오지만
pg_connect에서는 SQL문 전에 위치한다. 이는 MySQL을 다루다가 처음으로
PostgreSQL을 접하는 사람이 하기 쉬운 실수 중 하나이다. 앞으로 pg_exec함수를 가장
많이 보게될 것이다. 하지만 이 함수는 독자적으론 아무것도 할 수 없다. 다음에 나오는 다
른 함수와 잘 조합을 해야한다.

T.I.P. SQL쿼리문은 따로 작성하자.
예제 3-1의 2번 라인을 보자. sql쿼리문을 따로 변수로 만들어 두었다. 물론 2,3번 라인을
같이 붙여서 $query = mysql_query(“select * from test”); 라고 해도 된다. 하지만 위의 예
제와 같이 따로 만드는 습관을 가지는 것이 좋다. 나중에 다시 작업할 때나 공동작업을 할
때 훨씬 효율적이기 때문이다.


pg_numrows()

pg_numrows()함수를 이용해서 구하고자하는 열의 숫자를 알아낼 수 있다. 즉, 테이블에
서 SELECT문을 이용해서 추려낸 자료들의 수를 구할 수 있다는 것이다. MySQL에서의 유
사 함수는 mysql_num_rows()이다. pg_numrows()와는 달리 num과 row사이에 언더바(_)
가 더 있다.

예제 4-1
1234567 <?// 데이터 베이스 연결 생략$sql = “select * from test”;$result =
mysql_query($sql,$dbconn);$num = mysql_num_rows($result);echo $num;?>

예제 4-2
1234567 <?// 데이터 베이스 연결 생략$sql = “select * from test”;$result = pg_exec
($dbconn,$sql);ㄴ$num = pg_numrows($result);echo $num;?>

mysql_num_rows함수와 pg_numrows함수의 사용법은 같다. 이 함수를 통해서 회원수, 등
록된 게시물 수를 구할 수 있다. SELECT문의 조건절만 잘 이용한다면 원하는 수의 값을
구할 수 있다.

T.I.P. SQL쿼리문을 이용한 열의 수 구하기
pg_numrows()함수를 SQL 쿼리문을 이용하여 구현할 수 있다. SELECT COUNT()를 이용
하는 것이다. psql> SELECT COUNT(*) from table; 이라고 하면 등록된 자료의 수를 알아
낼수 있다. 조건 절만 잘 이용하면 원하는 데이터를 구할 수 있다. 이 수를 뒤에서 나올 함
수를 통해서 변수에 값을 넣으면 된다. SELECT문에서 COUNT말고 MAX와 같은 다른 것
들도 있다. 이는 h SELECT 로 알수 있다.

pg_fetch_row()

pg_fetch_row()함수를 이용해서 테이블에서 특정한 데이터를 구할 수 있다. 이 함수는 유
사한 다른 함수와 달리 숫자를 인덱스로 하는 배열로 가져온다. 아마 그냥 이해하기는 힘들
것이다. 다음의 예시를 통해 알아보자. MySQL에서 유사함수는 mysql_fetch_row()이다.

예시 5
test=# select * from class; class  | female | male ------+------+----- A    |  13  | 
20 B    |  12  |  25(2 rows)
앞에서 만든 다음과 같은 테이블 값을 이용하도록 하자.

예시 5-1
12345678 <?$dbconn = mysql_connect(“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);$sql = "select * from class";$result =
mysql_query($sql,$dbconn);$row = mysql_fetch_row($result,0);echo $row[0];?>

예시 5-2
1234567 <?$dbconn = pg_connect ("dbname=test user=tozigy");$sql = "select *
from class";$result = pg_exec($dbconn,$sql);$row = pg_fetch_row($result,0);echo
$row[0];?>

mysql_fetch_row()와 pg_fetch_row()함수의 사용법은 같다. 위의 소스의 결과물은 문자 A
이다. 예시 5-2을 기준으로 살펴보자. 5번 라인에서 마지막에 0이라는 숫자가 있다. select
할때 위에서 첫번째 행을 의미하는 것이다. (예시 5을 참고) 6번째 라인에도 0이라는 숫자
가 있다. 여기서는 0번째 열을 의미한다.

0(class) 1(female) 2(male)
0 A 13 20
1 B 12 25
다음과 같은 도표로 이해할 수 있다. 숫자의 시작은 1이 아니라 0이다. B반의 남자 수를 구
할려면 2번째 열, 3번째 행이므로 위의 예시 1-2(5-6번 라인)는 다음과 같이 바뀌어야 한
다.
$row = pg_fetch_row($result,0);echo $row[0];

실재로는 숫자를 인덱스로하는 pg_fetch_row()보다 필드명을 인덱스로 하는
pg_fetch_array()를 더 많이 이용한다.

pg_fetch_array()

위의 pg_fetch_row()함수와 비슷한 역할을 한다. 테이블의 행을 배열로 가져온다. 다은 점
은 pg_fetch_row()에서 배열의 인덱스가 숫자인 반면에 pg_fetch_array()에서는 필드명이
인덱스가 된다는 것이다. 즉, 위에서 $row[0]가 pg_fetch_array()에서는 $row[“class”]
가 된다. MySQL에서 유사함수는 mysql_fetch_array()이다.

예시 6-0
test=# select * from class; class | female |  male -----+------+------ A    |    13 | 
20 B    |    12 |  25(2 rows)

예시 6-1
12345678 <?$dbconn = mysql_connect(“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);$sql = "select * from class";$result =
mysql_query($sql,$dbconn);$row = mysql_fetch_row($result,0);echo $row[class];?>

예시 6-2
1234567 <?$dbconn = pg_connect ("dbname=test user=tozigy");$sql = "select *
from class";$result = pg_exec($dbconn,$sql);$row = pg_fetch_array($result,0);echo
$row[“class”];?>

mysql_fetch_array()와 pg_fetch_array()함수의 사용법은 비슷하지만 주의해야 할 점이 있
다. 예시 6-1의 7번 라인과 예시 6-2의 각 6번라인을 비교해 보자. pg_fetch_array() 함수
를 쓸 경우에는 ‘[ ]’안에 해당 필드명을 썼을 때 따옴표 안에 넣어야 한다.

N O T E pg_fetch_array()에서도 숫자를 배열의 인덱스로 사용할 수 있다.
pg_fetch_array()에서는 pg_fetch_row()와 같이 숫자를 인덱스 값으로 넣어도 된다. 예시
6-2 6번 라인에서 $row[“class”]대신에 $row[0]을 써도 된다는 것이다.


pg_fetch_object()

위에서 다룬 pg_fetch_row(), pg_fetch_array()와 같은 역할을 한다. 하지만 다른점은
pg_fetch_object()에서는 함수 이름에서도 알 수 있듯이 오브젝트로 데이터를 가져온다는
것이다. pg_fetch_row(), pg_fetch_array()가 행의 값들을 배열로 가져오는 반면에
pg_fetch_object()는 오브젝트로 가져온다. MySQL에서 관련 함수는 mysql_fetch_object
()이다.

예시 7-1
12345678 <?$dbconn = mysql_connect ("localhost",”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);$sql = "select * from class";$result =
mysql_query($sql,$dbconn);$row = mysql_fetch_object($result,0);echo $row->class;?
>


예시 7-2
1234567 <?$dbconn = pg_connect ("dbname=test user=tozigy");$sql = "select *
from class";$result = pg_exec($dbconn,$sql);$row = pg_fetch_object($result,0);echo
$row->class;?>

mysql_fetch_object와 pg_fetch_object 두 함수의 사용법은 같다. 위의 결과물도 “A”로 같
다. 이전의 pg_fetch_row, pg_fetch_array와 다른점은 구하고자하는 행의 값을 오브젝트
의 형태로 가져온다는 것이다. 따라서 예시 7-2의 6번 라인 처럼 $row->class라는 방식으
로 값을 출력할 수 있다. 이때 class자리에는 원하는 값의 필드명을 적어야 하며 숫자로 해
서는 안된다. 즉 pg_fetch_row()에서 $row[0]와 같이 $row->0 이런 식으로 하면 에러가
난다는 것이다.
pg_fetch_array(), pg_fetch_row(), pg_fetch_object()는 서로 비슷한 역할을 한다. 그리고
속도의 차이도 미미하다. 이 세가지 중 어떤걸 택해서 사용하는가는 여러분에게 달려있다.
[이 게시물은 관리자님에 의해 2007-01-04 18:41:36 팁앤테크에서 복사 됨]

'프로그래밍... > PostgreSQL' 카테고리의 다른 글

PostgreSQL 설치 및 기본 사용법  (0) 2010.01.08
PostgreSQL 설치및 기본 사용법  (0) 2010.01.08
트리거 (Trigger) 예제  (1) 2009.12.31
PL/pgSQL이란?  (0) 2009.12.22
PostgreSQL의 PL/PgSQL 사용법  (0) 2009.12.22