PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


Web Programming >> PHP Programming
[목차]
제6장 PHP와 웹 데이터베이스의 연동

    5. PHP에서 지원하는 MySQL API 함수

mysql_connect 함수

mysql_connect() 함수는 다음과 같이 정의된다.

 

int mysql_connect(string [hostname][:port], string [username], string [password]);

   인자로 지정한 사용자 계정(username)과 패스워드(password)로 MySQL 서버(hostname)에 연결한다.

   서버에 연결이 성공적으로 이루어지면 양수의 정수 값을 갖는 연결 식별자(link identifier)를 반환하고 실패할 경우에는

   false를 반환한다.

mysql_connect() 함수의 첫 번째 인자는 연결하고자 하는 MySQL 서버의 호스트명이고 두 번째와 세 번째 인자는 사용자 계정과 패스워드로 이는 해당 서버의 mysql 데이터베이스 내 user 테이블에 등록되어 있어야 하는 값이다.

 

mysql_connect() 함수를 통해 MySQL 서버에 성공적으로 연결되면 이 연결된 것을 식별 할 수 있는 연결 식별자가 반환된다. 즉, 데이터베이스 서버는 여러 곳으로부터 각각의 개별적인 연결이 이루어질 수 있으므로 이 함수를 통해서 연결된 링크를 유일하게 식별할 수 있도록 연결 식별자를 실행 결과로 반환하는 것이다. 이 식별자를 통해서 특정 데이터베이스에 대한 조작을 수행할 수 있으므로 PHP를 연동하여 수행하는 웹상에서의 모든 데이터베이스 작업은 이 연결 식별자를 필요로 한다.

 

mysql_close 함수

mysql_close () 함수는 다음과 같이 정의된다.

 

int mysql_close(int [link_identifier]);

   mysql_connect 함수에 의해 설정된 서버 연결을 종료한다.

mysql_close() 함수는 연결 식별자, 즉 mysql_connect() 함수의 실행 결과로 반환되는 연결 식별자를 인자로 받아 해당 연결을 닫는 역할을 한다. 인자는 생략될 수 있으며 만일 인자가 생략되면 가장 최근에 설정된 연결을 종료한다.

mysql_connect() 함수에 의한 연결은 함수를 호출하는 해당 PHP 스크립트가 실행 종료되면 자동적으로 연결이 해제되므로 서버에 대한 연결을 종료하기 위해 mysql_close() 함수를 반드시 호출해야 하는 것은 아니다

 

다음의 코드는 mysql_connect() 와 mysql_close() 함수를 호출하여 MySQL 서버에 연결 및 해당 연결을 종료하는 예이다.

 

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

echo("$dbconn");

 

mysql_close($dbconn);

?>

 

[예제5.2] MySQL 서버에 대한 연결 및 종료

 

위 예제 2행에서는 5.3절에서 mysql 데이터베이스의 user 테이블에 등록했던 "php"라는 사용자로 localhost 즉, 현재의 MySQL 서버가 설치된 호스트로 연결을 시도한다. 그 결과 연결이 성공적으로 이루어진 경우에는 g마수의 실행 결과로 반환되는 연결 식별자를 $dbconn 이라는 변수에 저장한다.

 

그리고 연결을 닫을 때에는 이 $dbconn을 mysql_close() 함수의 인자로 전달하여 해당 연결을 종료한다. 만일 잘못된 호스트명이나 user 테이블에 등록되어 있지 않은 사용자, 또는 잘못된 패스워드를 입력했을 경우에는 $dbconn 이 false 가 되므로 뒤의 die() 함수가 호출되어 해당 메시지를 출력하면서 스크립트의 실행이 중단된다.

 

mysql_select_db 함수

mysql_select_db() 함수는 다음과 같이 정의된다.

 

int mysql_select_db(string database_name, int [link_identifier]);

   MySQL 서버에 있는 여러 개의 데이터베이스 중 인자로 전달한 데이터베이스를 선택한다. 성공하면 true를 실패하면

   false를 반환한다.

mysql_select_db() 함수는 연결 식별자에 의해 연결이 확인된 MySQL 서버에 인자로 지정한 데이터베이스가 존재하는지 검사하고 존재하면 이 데이터베이스를 앞으로 작업할 대상 데이터베이스로 선택한다.

 

mysql_errno 함수

mysql_errno() 함수는 다음과 같이 정의된다.

 

int mysql_errno(int [link_identifier]);

   가장 최근에 수행했던 MySQL 작업에서 에러가 발생했을 경우 그 에러 메시지의 고유 번호를 반환한다.

mysql_errno() 함수는 연결 식별자에 의해 확인된 서버 상에서 mysql_errno() 함수를 호출하기 바로 전에 수행된 데이터베이스 작업에서 에러가 발생했을 경우 발생한 에러 메시지의 고유 번호를 반환한다.

예를 들면, mysql 클라이언트 프로그램을 이용하여 sample 데이터베이스에 연결을 시도할 때 데이터베이스 이름을 잘못 적어주었거나 INSERT와 같은 SQL 문을 문법에 맞지 않게 입력하는 경우 에러 메시지와 함께 고유 번호도 같이 출력되는데 mysql_errno() 함수는 바로 이 번호를 출력하여 준다.

 

mysql_error 함수

mysql_error() 함수는 다음과 같이 정의된다.

 

string mysql_error(int [link_identifier]);

   mysql_error 함수 이전에 실행된 MySQL 작업에 에러가 발생했을 경우 해당 에러의 에러 메시지를 반환한다.

mysql_errno() 함수가 에러의 고유 번호를 반환하는 것에 비해 mysql_error() 함수는 에러의 문자열 베시지를 반환한다.

 

다음의 예를 보자

 

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$status = mysql_select_db("semple",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

   

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

} else {

   echo("sample 데이터베이스에 연결되었습니다!<br>");

}

 

mysql_close($dbconn);

?>

 

[예제5.3] 데이터베이스 연결 및 에러 처리

 

위 예제는 MySQL 서버에 연결하여 작업 데이터베이스로 sample 데이터베이스를 선택하는 코드이다.

대상 데이터베이스를 선택하려면 4행에서 mysql_select_db() 함수의 첫 번째 인자로 "sample"을 설정해야 한다.

그러나 4행에서와 같이 대상 데이터베이스 이름을 "semple"로 잘못 입력하였을 경우 함수의 실행 결과는 false가 되므로 6~11행이 실행된다.

6,7행은 mysql_errno() 함수와 mysql_error() 함수 호출 전에 실행된 작업, 즉 4행의 실행 결과에러가 발생했을 경우 해당 에러의 고유 번호와 메시지를 변수 $errNO과 $errMSG에 저장하여 10행에서 출력하고 스크립트의 실행을 종료한다. 위의 예제와 같이 데이터베이스 이름을 잘못 입력하였을 경우의 실행 결과는 다음과 같다.

 

서버의 sample 데이터베이스연결에 실패하였습니다!

에러코드 1049 : Unknown database 'semple'

위에서 에러 번호 1049와 에러 메시지 "Unknown database 'semple' "는 실제 mysql 클라이언트 프로그램을 이용하다 발생하는 에러 메시지와 동일하다. 게시판의 작동 오류 등 웹상에서의 작업 중에 발생하는 에러는 해당 메시지를 출력해보면 대부분 그 원인을 파악 할 수 있으므로 테이블의 작성이나 변경, 삭제시 그리고 SQL문의 실행 시에는 항상 위의 예제와 같이 mysql_errno() 함수와 mysql_error() 함수를 호출하여 에러 처리 코드를 작성 해두는 것이 좋다.

mysql_create_db 함수

mysql_create_db() 함수는 다음과 같이 정의된다.

 

int mysql_create_db(string database name, int [link_identifier]);

   연결 식별자에 의해 연결이 확인된 서버에 인자로 지정한 이름을 갖는 데이터베이스를 생성한다. 데이터베이스를 성공

   적으로 생성하면 true를 , 실패하면 false를 반환한다.

mysql_create_db() 함수는 인자로 지정한 이름을 갖는 새로운 데이터베이스를 서버 내에 생성한다.

예제를 보자

 

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$createDB = mysql_create_db("sample2",$dbconn);

if(!$createDB) {

   echo("sample2 데이터베이스 생성에 실패하였습니다!<br>");               

   echo("에러코드" . mysql_errno() . " : " .  mysql_error() . "<br>");

   exit;

} else {

   echo("sample2 데이터베이스가 성공적으로 생성되었습니다!");                      

}

 

mysql_close($dbconn);

?>

 

[예제5.4] mysql_create_db() 함수를 이용한 데이터베이스 생성

 

위 예제는 "php"라는 사용자로 MySQL 서버에 연결하여 서버 내에 "sample2"라는 새로운 데이터베이스를 생성하는 코드이다.

2행에서는 제3절에서 설정한 데이터베이스 사용자 "php"와 사용자의 패스워드 "php99"를 mysql_connect() 함수에 전달하여 MySQL 서버에 연결을 시도하고 연결에 성공하면 4행에서 mysql_create_db() 함수로 "sample2"라는 데이터베이스를 생성한다.

4행에서 mysql_create_db() 함수의 실행 결과 데이터베이스 생성에 실패할 경우 변수 $createDB는 false 가 되므로 6,7행에서 에러 번호와 에러 메시지를 출력하고 스크립트의 실행을 종료한다.

 

만일 제3절에서 설명한 대로 sample라는 데이터베이스를 생성하고 데이터베이스의 소유자로 php라는 사용자를 mysql 데이터베이스 내에 등록했다면 [예제5.4]의 실행 결과는 다음과 같을 것이다.

 

sample2 데이터베이스 생성에 실패하였습니다!

에러코드1044 : Access denied for user: 'php@localhost' to database 'sample2'

예제를 실행한 결과 위와 같이 "Access denied...."라는 에러 메시지가 출력된다. 그 이유는 무엇일까?

제3절의 "새로운 사용자 등록"에서 "php"라는 사용자를 user 테이블에 등록할 때 host와 user, password만 값을 입력하고 나머지 권한 설정 항목은 기본 값으로 설정하였던 것을 기억할 것이다. user 테이블의 구조를 포함한 권한 설정 항목은 "Create_priv"라는 항목이 데이터베이스를 생성할 수 있는 권한에 대한 값을 갖는 필드이다. 따라서 제3절에서 "php"라는 사용자를 등록했을 때 이 항목이 기본 값인 'N'의 값을 가지므로 사용자 "php"는 데이터베이스를 생성할 수 있는 권한이 없다. 그렇기 때문에 위 예제에서 "sample2"라는 데이터베이스를 생성하지 못하고 위와 같은 에러가 발생한 것이다.

마찬가지로 "Drop_priv"라는 항목은 생성되어 있는 데이터베이스를 삭제할 수 있는 권한에 대한 값을 갖는 필드로 이 값이 'N'이면 "php"사용자는 생성되어있는 데이터베이스를 삭제할 수 없게 된다.

따라서 mysql 클라이언트를 이용하여 user 테이블에서 "php" 사용자의 "Create_priv" 항목을 'Y'로 바꾼 후 MySQL 서버를 reload 하면 실행 결과 "sample2"라는 데이터베이스가 생성된다.

 

mysql> update user set create_priv = 'Y' where user = 'php' ;

mysql_drop_db 함수

mysql_drop_db() 함수는 다음과 같이 정의된다.

 

int mysql_drop_db(string database_name, int [link_identifier]);

   연결 식별자에 의해 연결이 확인된 서버에 인자로 지정한 이름을 갖는 데이터베이스를 삭제한다. 데이터베이스를

   성공적으로 삭제하면 true를, 실패하면 false를 반환한다.

mysql_drop_db() 함수는 인자로 지정한 이름을 갖는 데이터베이스를 MySQL 서버에서 삭제한다. 함수의 사용법은 mysql_create_db() 함수와 동일하다.

 

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$dropDB = mysql_drop_db("sample2",$dbconn);

if(!$dropDB) {

   echo("sample2 데이터베이스 삭제에 실패하였습니다!<br>");               

   echo("에러코드" . mysql_errno() . " : " .  mysql_error() . "<br>");

   exit;

} else {

   echo("sample2 데이터베이스가 삭제되었습니다!");

}

 

mysql_close($dbconn);

?>

 

[예제5.5] mysql_drop_db() 함수를 이용한 데이터베이스 삭제

 

위 예제는 mysql_drop_db() 함수를 이용하여 [예제5.4]에서 생성했던 "sample2" 데이터베이스를 삭제하는 예제이다. [예제5.4]의 경우와 마찬가지로 mysql_drop_db() 함수로 "sample2" 데이터베이스를 삭제하려면 "php" 사용자의 "drop_priv" 필드의 값을 'Y'로 수정해야 한다.

 

mysql_query 함수

mysql_query() 함수의 정의는 다음과 같다.

 

int mysql_query(string query, int [link_identifier]);

   연결 식별자에 의해 연결이 확인된 서버에 SQL 쿼리문을 전송한다.

mysql_query() 함수는 현재 연결된 MySQL 서버에 SQL 쿼리문을 전송한다. 제3절의 mysql 클라이언트 프로그램 상에서 INSERT, UPDATE, DELETE, SELECT 등의 SQL 명령문을 내리면 그 결과가 출력되는 것을 볼 수 있었다. mysql_query() 함수는 그러한 SQL 쿼리문을 담음 문자열을 첫 번째 인자로 받아 서버에 전송하는 역할을 한다.

 

INSERT, UPDATE, DELETE 쿼리문의 경우 명령문이 성공적으로 수행될 경우에는 true를, 그렇지 않을 경우에는 false를 반환한다. 한편 SELECT 쿼리문을 전송하는 경우에는 대상 테이블의 모든 레코드 중에서 SELECT SQL 명령문의 실행 결과로 검색된 레코드 세트만을 가리키는 새로운 식별자)result identifier)를 반환한다. 그래서 이 식별자를 통해 검색된 레코드 각각의 필드값에 접근할 수 있게 된다.

 

mysql_query() 함수의 쿼리문 수행에 의해 사용된 자원은 mysql_free_result() 함수를 호출함으로써 반환할 수 있다.

 

mysql_num_rows 함수

mysql_num_rows() 함수의 정의는 다음과 같다.

 

int mysql_num_rows(int result);

   결과 레코드 세트에서 행의 수를 반환한다.

mysql_num_rows() 함수는 쿼리문의 실행 결과 검색된 결과 레코드 세트가 가진 행의 수 즉, 쿼리문의 실행 결과 검색된 레코드의 개수를 반환한다. 여기서 인자인 result는 mysql_query() 함수의 실행 후 반환되는 결과 레코드 세트를 가리키는 식별자이다.

예를 들어, [예제5.1]의 userdb 테이블에서 여자의 이름과 아이디, 이메일, 성별, 마일리지, 사용자 레벨을 검색하는 과정을 살펴보자. 먼저 코드는 다음과 같다.

 

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

   

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

} else {

   echo("sample 데이터베이스에 연결되었습니다!<br>");

}

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE sex = 'F'";

 

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

      

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$rows = mysql_num_rows($result);

echo("검색된 레코드의 수 : $rows<br>");

 

$fields = mysql_num_fields($result);

echo("레코드의 필드수 : $fields<br>");

 

mysql_close($dbconn);

?>

 

[예제5.6] mysql_query() 함수로 검색 결과 얻기

2~14행은 MySQL 서버에 연결하여 "sample"이라는 데이터베이스를 작업할 대상 데이터베이스로 선택하는 코드이다.

16행의 변수 $query는 userdb 테이블에서 sex 필드값이 'F'인 레코드 즉, 성별이 여자인 레코드의 이름과 아이다, 이메일 등의 필드를 검색하는 SQL 문으로 18행의 mysql_query() 함수의 첫 번째 인자로 서버에 전송된다. 이때 쿼리문의 문장이 SQL문법에 어긋난다거나 하는 문제에 의해 에러가 발생할 경우 함수의 실행 결과인 변수 $result는 false가 되므로 20~24행의 에러 처리 코드가 실행된다.

 

16,18행의 결과 [예제5.1]의 여섯 개의 레코드 중에서 sex가 'F'인 네 개의 레코드가 검색된다. 그리고 mysql_query() 함수의 결과인 변수 $result는 이 네 개의 레코드 세트를 가리키는 결과 레코드 식별자가 된다.

27행의 mysql_num_rows() 함수는 결과 레코드 식별자를 인자로 받아 이 결과 레코드가 모두 몇 개의 레코드를 갖는지를 반환한다. 위에서 SQL 명령문의 수행 결과로 모두 네 개의 레코드가 검색되므로 변수 $rows는 4가 된다.

동일한 방식으로 30행의 mysql_num_fields() 함수는 결과 레코드 식별자를 인자로 받아 이 겨로가 레코드가 몇 개의 필드를 갖는지 검사하여 그 필드의 개수를 반환한다. [예제5.6]에서는 검색 결과 각 레코드가 name, id, email, sex, milage, level 의 여섯 개의 필드를 가지므로 $fields는 6이 된다.

 

[예제5.6]의 실행 결과는 다음과 같다.

 

sample 데이터베이스에 연결되었습니다!

검색된 레코드의 수 : 4

레코드의 필드수 : 6

즉, mysql_query() 함수는 SQL 명령문을 서버에 전송하고 그 결과 검색된 레코드 세트를 대표하는 식별자를 반환함으로써 이 식별자를 통해 검색된 레코드의 개수나 필드의 개수 등을 알 수 있다.

 

mysql_num_fields 함수

mysql_num_fields() 함수의 정의는 다음과 같다.

 

int mysql_nun_fields(int result);

   결과 레코드 세트에서 열의 수, 즉 필드의 수를 반환한다.

mysql_num_rows() 함수와 동일한 개념으로 mysql_num_rows() 함수가 행(레코드)의 개수를 반환하는 대신 mysql_num_fields() 함수는 열(필드)의 개수를 반환한다.

 

mysql_field_name 함수

mysql_field_name() 함수의 정의는 다음과 같다.

 

string mysql_field_name(int result, int field_index);

   검색된 결과 레코드 세트에서 특정 필드의 이름을 반환한다.

mysql_field_name() 함수는 결과 레코드 식별자가 가리키는 결과 레코드 세트에서 두 번째 인자인 field_index가 가리키는 위치에 있는 필드의 이름을 반환한다. mysql_field_name() 함수의 두 번째 인자는 이름을 반환할 필드의 위치를 가리킨다. 예를 들면, 앞의 네 개의 결과 레코드 세트에서 순서대로 첫 번째 필드인 name의 field_index는 0이고 다음의 id는 1, email은 2가 된다.

 

필드명

name

id

email

sex

milage

level

field_index

0

1

2

3

4

5

따라서 mysql_field_name($result, 4)는 field_index가 4인 필드의 이름, "milage"라는 문자열을 반환한다.

 

mysql_field_type 함수

mysql_field_type() 함수의 정의는 다음과 같다.

 

string mysql_field_type(int result, int field_offset);

   검색된 결과 레코드 세트에서 특정 필드의 타입을 반환한다.

mysql_field_type() 함수는 결과 레코드 식별자가 가리키는 결과 레코드 세트에서 해당 위치의 필드 타입을 반환한다. 호출 방식은 mysql_field_name() 함수와 동일하며 다만 이름 대신 필드의 타입을 반환한다는 점이 다르다.

 

mysql_field_len 함수

mysql_field_len() 함수의 정의는 다음과 같다.

 

int mysql_field_len(int result, int field_offset);

   검색된 결과 레코드 세트에서 특정 필드의 길이를 반환한다.

mysql_field_len() 함수 역시 mysql_field_name() 이나 mysql_field_type() 함수와 호출 방식은 동일하며 다만 이름이나 필드 타입 대신 해당 필드의 길이를 반환한다는 점이 다르다.

이 길이란 테이블 생성시 필드를 정의할 때 VARCHAR(20)과 같이 지정한 필드 타입의 크기(20)를 말한다.

 

mysql_field_flags 함수

mysql_field_flags() 함수의 정의는 다음과 같다.

 

string mysql_field_flags(int result, int field_offset);

   검색된 결과 레코드 세트에서 특정 필드에 선언된 항목을 반환한다.

mysql_field_flags() 함수는 결과 레코드 세트에서 특정 필드에 "NOT NULL"과 같이 별도로 선언된 내용이 있으면 이 내용을 문자열로 출력한다. 선언된 항모이 두 개 이상일 경우 각 항목 사이를 하나의 공백 문자로 구분하여 하나의 문자열로 반환한다. 따라서 이 경우 각 항목별 문자열을 얻기 위해서 하나의 공백 문자를 구분 자로 하여 explode() 함수를 사용해야 한다.

 

mysql_field_table 함수

mysql_field_table() 함수의 정의는 다음과 같다.

 

string mysql_field_table(int result, int field_offset);

   검색된 결과 레코드 세트에서 특정 필드가 속해 있는 테이블의 이름을 반환한다.

이제 지금까지의 함수를 이용하여 필드의 이름과 데이터 타입, 크기, 소속 테이블, 필드 속성 등을 출력하여 보자.

 

 

<html>

<head>

   <style type="text/css">

   <!--

   BODY, TR, TH, TD {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

   

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE sex = 'F'";

 

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

      

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

$fields = mysql_num_fields($result);

 

echo("<table border=0 cellpadding=10>\n");

echo("<tr>\n");

echo("<td width=100 bgColor=pink align=center>필드명</td>\n");

echo("<td width=100 bgColor=pink align=center>필드타입</td>\n");

echo("<td width=100 bgColor=pink align=center>필드크기</td>\n");

echo("<td width=100 bgColor=pink align=center>필드속성</td>\n");

echo("<td width=100 bgColor=pink align=center>소속테이블</td>\n");

echo("</tr>\n");

 

for($i = 0; $i < $fields; $i++) {

   echo("<tr>\n");

   

   $field_name = mysql_field_name($result,$i);

   $field_type = mysql_field_type($result,$i);

   $field_len = mysql_field_len($result,$i);

   $field_flags = mysql_field_flags($result,$i);

   $field_table = mysql_field_table($result,$i);

 

   

   echo("<td bgColor=lightyellow align=center>$field_name</td>\n");

   echo("<td bgColor=lightyellow align=center>$field_type</td>\n");

   echo("<td bgColor=lightyellow align=center>$field_len</td>\n");

   echo("<td bgColor=lightyellow align=center>$field_flags</td>\n");

   echo("<td bgColor=lightyellow align=center>$field_table</td>\n");

 

   echo("</tr>\n");

}   

 

echo("</table>");

 

mysql_close($dbconn);

?>

 

</body>

</html>

 

[예제5.7] 필드의 이름과 타입, 크기, 속성 등의 정보 출력

 

14~24행은 MySQL 서버에 연결하여 "sample" 데이터베이스를 작업 대상 데이터베이스로 선택한다. 26행에서 mysql_query() 함수를 통해서 성별이 여자인 레코드의 이름과 아이디, 이메일, 성별, 마일리지, 사용자 레벨의 6가지 필드를 검색하므로 37행의 변수 $fields는 6이 된다.

 

48~64행은 6가지 필드에 대해서 각각 필드명과 필드 타입, 필드 크기, 필드 속성, 소속 테이블로 나누어 필드 정보를 출력한다.

여기서 필드명은 mysql_field_name(), 필드 타입은 mysql_field_type(), 필드 크기는 mysql_field_len(), 필드 속성은 mysql_field_flags(), 소속 테이블은 mysql_field_table() 함수의 반환 값으로부터 구하여 출력한다.

 

mysql_fetch_row 함수

mysql_fetch_row() 함수의 정의는 다음과 같다.

 

array mysql_fetch_row(int result);

   결과 레코드 세트에서 한 행(레코드)의 데이터를 가져온다.

mysql_fetch_row() 함수는 인자로 전달한 결과 레코드 식별자가 가리키는 결과 레코드 세트에서 한 행 즉, 한 레코드의 데이터를 가져온다. 하나의 레코드는 여러 개의 필드로 구성되어 있으므로mysql_fetch_row() 함수는 각 필드의 값을 그 원소로 갖는 배열을 반환한다.

계속하여 앞에서 들었던 예를 보면, userdb 테이블에서 성별이 여자인 레코드의 이름과 아이디, 이메일, 성별, 마일리지, 사용자 레벨을 검색하는 SELECT 쿼리문을 mysql_result() 함수를 통해 전송하면 그 결과 다음과 같이 userdb 테이블의 여섯 개 중 네 개의 레코드가 검색되고 이 결과 레코드 세트를 가리키는 식별자가 함수 실행의 결과로 반환된다.

 

name

id

email

sex

milage

level

김영미

guncat

ymkim@safelab.skku.ac.kr

F

2800

C

길수현

suhyun

suhyun@safelab.skku.ac.kr

F

4200

A

박현영

miserable

hypark@safelab.skku.ac.kr

F

4000

A

강연순

soony

soony@safelab.skku.ac.kr

F

2600

C

이 결과 레코드 세트에서 "김영미", "guncat"과 같은 레코드의 필드값을 얻으려면 mysql_fetch_row() 함수를 실행하여 한 행의 레코드를 가져와야 한다. 즉, 다음과 같이 처음으로 mysql_fetch_row() 함수를 실행하면 함수 실행 결과 $result 식별자가 가리키는 레코드 세트에서 첫 번째 레코드("김영미","guncat","ymkim@safelab.skku.ac.kr","F",2800,"C")의 값들이 배열 변수 $row에 저장된다.

 

$row = mysql_fetch_row($result);

즉, 첫 번째 원소인 $row[0]은 name 필드의 값인 "김영미"를 , $row[1]은 id 필드값인 "guncat"을 ... $row[5]는 "C"를 각각 그 값으로 갖는 배열 변수 $row 가 mysql_fetch_row() 함수의 실행 결과로 반환된다.

 

"김영미" 다음의 레코드를 가져오기 위해서는 다시 한번 mysql_fetch_row() 함수를 호출해야 한다. 이 경우 배열 변수 $row의 각 원소는 다시 "길수현" 레코드의 값으로 모두 재 할당된다.

 

계속하여 mysql_fetch_row() 함수를 호출하면 순서대로 "박현영", "강연순"의 레코드를 가져오며 더 이상의 검색된 레코드가 없을 경우 mysql_fetch_row() 함수는 false를 반환한다.

다음의 [예제5.8]은 mysql_fetch_row() 함수를 이용하여 검색 결과를 HTML로 출력하는 예제이다.

 

 

<html>

<head>

   <style type="text/css">

   <!--

   BODY, TR, TH, TD {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn); 

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE sex = 'F'";

 

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

      

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$fields = mysql_num_fields($result);

 

echo("<table width=600 border=0 cellpadding=10>\n");

echo("<tr>");

 

for($i = 0; $i < $fields; $i++) {

   $field_name = mysql_field_name($result,$i);

   echo("<td bgColor=pink align=center>$field_name</td>\n");

}

echo("</tr>\n");

 

 

while($row = mysql_fetch_row($result)) {

   echo("<tr>\n");

   for($i = 0; $i < $fields; $i++) {

      echo("   <td bgColor=lightyellow align=center>$row[$i]</td>\n");

   }

   echo("</tr>\n");

 

}

 

echo("</table>");

 

mysql_close($dbconn);

?>

 

</body>

</html>

 

[예제5.8] mysql_fetch_row() 함수를 이용한 검색 결과의 출력

 

1~36행까지는 앞서의 예제와 동일하다. 즉, sample 데이터베이스에서 성별이 여자인 데이터를 검색하여 그 검색 결과에 대한 식별자를 얻고 이 식별자를 통해서 필드의 이름이나 값 등을 참조할 수 있다.

40~43행에서는 결과 레코드 식별자를 mysql_field_name() 함수의 인자로 전달하여 각 필드의 이름을 테이블 상단에 출력한다.

47~53행에서는 mysql_fetch_row() 함수가 false가 될 때까지 즉, 검색된 모든 레코드를 한 행씩 배열 변수 $row 에 저장하여 배열의 원소를 통해 각 레코드의 필드값을 출력한다.

[예제5.8]의 실행 결과 성별이 여자인 레코드에 대한 검색 결과를 확인할 수 있다.

 

mysql_fetch_array 함수

mysql_fetch_array() 함수의 정의는 다음과 같다.

 

array mysql_fetch_array(int result, int[result_typ]);

   결과 레코드 세트에서 한 행(레코드)의 데이터를 연관 배열의 형태로도 가져온다.

mysql_fetch_array() 함수는 mysql_fetch_row() 함수를 한 단계 확장한 함수로 mysql_fetch_row() 함수처럼 가져온 레코드의 각 필드값을 인덱스 번호를 갖는 배열 원소에 저장할 수 있을 뿐만 아니라 연관 배열의 형태로도 저장할 수 있다는 점이 mysql_fetch_row() 함수와의 차이점이다. 이 경우 연관 배열의 참조키는 필드의 이름이 된다. 즉, $row[0]대신 $row["name"]과 같이 연관 배열의 참조키를 이용하여 해당 필드의 값을 얻을 수 있다.

[예제5.8]에서 47~53행의 코드를 다음의 코드로 바꾸어도 결과는 같다.

 

 

 

while($row = mysql_fetch_array($result)) {

   echo("<tr>\n");

   

   echo("   <td bgColor=lightyellow align=center>$row[name]</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row[id]</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row[email]</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row[sex]</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row[milage]</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row[level]</td>\n");

   

   echo("</tr>\n");

 

}

 

[예제5.9] mysql_fetch_array() 함수를 이용한 검색 결과의 출력

 

mysql_fetch_object 함수

mysql_fetch_object() 함수의 정의는 다음과 같다.

 

object mysql_fetch_object(int result, int [result_typ]);

   결과 레코드 세트에서 한 행(레코드)을 객체의 형태로 가져온다.

mysql_fetch_object() 함수는 mysql_fetch_row() 함수나 mysql_fetch_array() 함수처럼 결과 레코드 세트에서 한 줄의 레코드를 가져온다, 단지 차이점은 mysql_fetch_object() 함수는 배열이 아닌 객체를 반환함으로써 객체의 속성을 통해 각 필드값을 참조해야 한다는 점이다. mysql_fetch_object() 함수의 실행을 통해 반환된 객체는 해당 레코드가 가진 필드의 이름을 그 속성으로 가진다.

 

[예제5.8]에서 47~53행의 코드를 mysql_fetch_object() 함수를 사용하여 다음의 코드로 바꾸어도 결과는 같다.

 

 

 

while($row = mysql_fetch_object($result)) {

   echo("<tr>\n");

   

   echo("   <td bgColor=lightyellow align=center>$row->name</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row->id</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row->email</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row->sex</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row->milage</td>\n");

   echo("   <td bgColor=lightyellow align=center>$row->level</td>\n");

   

   echo("</tr>\n");

 

}

 

[예제5.10] mysql_fetch_object() 함수를 이용한 검색 결과의 출력

 

mysql_fetch_row(), mysql_fetch_array(), mysql_fetch_object() 함수 모두 동일한 역할을 수행하지만 수행 속도는 그 중 mysql_fetch_row() 함수가 가장 빠르다.

 

mysql_result 함수

mysql_result() 함수의 정의는 다음과 같다.

 

int mysql_result(int result, int row, mixed field);

   결과 레코드 세트에서 하나의 필드값을 얻는다.

mysql_result() 함수 역시 결과 레코드 세트에서 필드값을 가져오는 역할을 한다. mysql_fetch_row() 함수나 mysql_fetch_object(), mysql_fetch_array() 함수가 결과 레코드 세트에서 배열이나 객체의 형태로 하나의 레코드가 가진 모든 필드값을 한꺼번에 가져오는데 반해 mysql_result() 함수는 한번 호출할 때 레코드가 가진 여러 필드 중에서 하나의 필드값만을 반환한다. 따라서 쿼리 결과 검색되어진 레코드 세트의 크기가 큰 경우에는 mysql_result() 함수보다는 mysql_fetch_row() 함수나 mysql_fetch_object(), mysql_fetch_array() 함수를 사용하는 것이 훨씬 빠른 결과를 보여준다.

 

다음의 예제는 mysql_result() 함수를 이용하여 userdb 테이블에서 마일리지가 3000 이상인 레코드를 마일리지의 오름차순으로 정렬하여 출력하는 예제이다.

 

 

<html>

<head>

   <style type="text/css">

   <!--

   BODY, TR, TH, TD {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

   

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE milage >= 3000 ORDER BY milage DESC";

 

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

      

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$rows = mysql_num_rows($result);

$fields = mysql_num_fields($result);

 

echo("<table width=600 border=0 cellpadding=10>\n");

echo("<tr>\n");

 

for($j = 0; $j < $fields; $j++) {

   $name = mysql_field_name($result,$j);

   echo("<td bgColor=pink align=center>$name</td>\n");

}

echo("</tr>\n");

echo("<tr>\n");

 

for($i = 0; $i < $rows; $i++) {

   for($j = 0; $j < $fields; $j++) {

      $value = mysql_result($result,$i,$j);

      echo("<td bgColor=lightyellow align=center>$value</td>\n");      

   }

   echo("</tr>");

}

echo("</tr>\n");

echo("</table>");

   

mysql_close($dbconn);

?>

 

</body>

</html>

[예제5.11] mysql_result() 함수를 이용한 검색 결과의 출력

 

25행까지는 앞에서의 예제와 동일하다. 26행에서 milage가 3000 이상인 레코드를 milage의 오름차순으로 정렬하는 SQL 명령문을 mysql_query() 함수로 전송하여 검색 결과 레코드에 대한 식별자를 얻는다. 이 식별자로부터 37,38행에서 결과 레코드 세트로부터 검색된 레코드의 개수($rows)와 레코드의 필드 수($fields)를 알 수 있으며 이로부터 mysql_result() 함수를 이용하여 결과 레코드의 각 필드값을 참조할 수 있다.

 

50~54행이 mysql_result() 함수를 이용하여 검색된 레코드를 출력하는 코드이다. 각각의 필드값을 얻기 위하여 매번 mysql_result() 함수를 호출한다는 것 외에는 앞서의 세 개 함수 (mysql_fetch_row(),  mysql_fetch_object(), mysql_fetch_array())를 이용한 코드와 크게 다르지 않음을 알 수 있다.

 

mysql_free_result 함수

mysql_free_result() 함수의 정의는 다음과 같다.

 

int mysql_free_result(int result);

   스크립트가 실행되는 동안 점유했던 메모리 공간을 반환한다.

쿼리 명령문의 실행 결과로 반환되는 결과 레코드 세트가 차지하는 메모리는 일반적으로 스크립트가 종료됨과 동시에 반환된다. 그러나 스크립트를 실행하는 동안 보통 이상의 매우 많은 메모리를 사용했다고 판단되는 경우 개발자가 임의로 mysql_free_result() 함수를 호출함으로써 점유된 메모리를 비울 수 있다.

 

mysql_data_seek 함수

mysql_data_seek() 함수의 정의는 다음과 같다.

 

int mysql_data_seek(int result_identifier, int row_number);

   결과 레코드 세트 내에서 원하는 레코드 위치로 이동한다. 성공하면 true를, 실패하면 false를 반환한다.

mysql_data_seek() 함수는 첫 번째 인자인 결과 레코드 식별자가 가리키는 결과 레코드 세트 내에서 두 번째 인자로 준 레코드 번호를 갖는 레코드로 포인터를 이동시킨다. 이동된 해당 레코드의 값을 얻으려면 mysql_fetch_row() 함수를 한번 호출해야 한다.

다음의 예를 보자.

 

 

<html>

<head>

   <style type="text/css">

   <!--

   BODY, TR, TH, TD {

      font-size : 10pt;

   }

   //-->

   </style>

</head>

<body>

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$status = mysql_select_db("sample",$dbconn);

if(!$status) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

   

   echo("서버의 sample 데이터베이스연결에 실패하였습니다!<br>");

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE sex = 'F'";

 

$result = mysql_query($query,$dbconn);

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

      

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$rows = mysql_num_rows($result);

$fields = mysql_num_fields($result);

 

echo("<table width=600 border=0 cellpadding=10>\n");

echo("<tr>\n");

 

for($j = 0; $j < $fields; $j++) {

   $name = mysql_field_name($result,$j);

   echo("<td bgColor=pink align=center>$name</td>\n");

}

echo("</tr>\n");

 

$row = mysql_fetch_row($result);

 

echo("<tr>\n");

for($i = 0; $i < $fields; $i++) {

   echo("<td bgColor=lightyellow align=center>$row[$i]</td>\n");      

}

echo("</tr>");

 

if(!mysql_data_seek($result,3)) {

   echo("해당 위치에 레코드가 존재하지 않습니다!");

   exit;

}

 

$row = mysql_fetch_row($result);

 

echo("<tr>\n");

for($i = 0; $i < $fields; $i++) {

   echo("<td bgColor=lightyellow align=center>$row[$i]</td>\n");      

}

echo("</tr>");

 

echo("</table>");

   

mysql_close($dbconn);

?>

 

</body>

</html>

 

[예제5.12] mysql_data_seek() 함수를 이용한 특정 레코드의 출력

 

위 예제는 userdb 테이블에서 성별이 여자인 레코드를 검색하여 얻어진 결과 레코드 세트 내에서 mysql_data_seek() 함수를 이용하여 특정 위치의 레코드의 필드값을 출력하는 예제이다.

 

26행의 SQL 명령문을 서버에 전송하여 얻어진 결과 레코드를 보면 다음과 같다.

 

name

id

email

sex

milage

level

김영미

guncat

ymkim@safelab.skku.ac.kr

F

2800

C

길수현

suhyun

suhyun@safelab.skku.ac.kr

F

4200

A

박현영

miserable

hypark@safelab.skku.ac.kr

F

4000

A

강연순

soony

soony@safelab.skku.ac.kr

F

2600

C

이 상태에서 49행의 mysql_fetch_row() 함수를 실행하면 첫 번째 레코드인 김영미 레코드의 필드값들이 배열 변수 $row에 저장되어 53행에서 출력된다.

57행에서는 mysql_data_seek() 함수의 두 번째 인자로 3을 주었다. 즉, 레코드 번호가 3인 레코드로 포인터가 바로 이동되므로 현재의 레코드 위치는 강연순이 된다. 레코드 번호는 순서대로 김영미가 0, 길수현이 1, 박현영이 2, 강연순이 3의 값을 갖는다.

 

이제 이 강연순의 필드값들을 얻어내기 위해서 62행에서 다시 한번 mysql_fetch_row() 함수를 호출하면 강연순 레코드의 각 필드값들이 배열 $row 에 저장된다. 따라서 실행결과 첫 번째 레코드인 김영미와 네 번째 레코드인 강연순 두 개의 레코드가 출력된다.

 

mysql_fetch_field 함수

mysql_fetch_field() 함수의 정의는 다음과 같다.

 

object mysql_fetch_field(int result, int [field_offset]);

   결과 레코드 식별자가 가리키는 결과 레코드 세트로부터 필드 정보를 객체 형태로 반환한다.

mysql_fetch_field() 함수는 결과 레코드 세트로부터 레코드가 가지고 있는 필드에 관한 정보를 얻어 객체 형태로 반환한다. mysql_fetch_field() 함수로부터 얻을 수 있는 필드 정보로는 이름과 소속 테이블, 필드값의 최대 길이 등 여러 가지가 있으며 이들 정보는 반환되는 객체의 속성으로 정의되어 있다. 객체의 속성으로는 다음과 같은 것들이 있다.

 

속성명

내용

  name

  필드의 이름

  table

  필드가 속한 테이블의 이름

  max_length

  해당 필드에서 가장 큰 값을 갖는 필드의 길이

  not_null

  해당 필드가 NOT NULL로 선언되어 있으면 1을 반환

  primary_key

  해당 필드가 PRIMARY KEY로 선언되어 있으면 1을 반환

  unique_key

  해당 필드가 UNIQUE KEY로 선언되어 있으면 1을 반환

  multi_key

  해당 필드가 UNIQUE KEY가 아니면 1을 반환

  numeric

  해당 필드가 수치 값을 가지면 1을 반환

  blob

  해당 필드가 BLOB타입이면 1을 반환

  type

  해당 필드의 타입을 반환

  unsigned

  해당 필드가 부호 없는 수치이면 1을 반환

  zerofill

  해당 필드가 0으로 채워져 있으면 1을 반환

 

다음의 [예제5.13]은 userdb 테이블을 검색한 결과로 얻어지는 결과 레코드 세트의 필드 정보를 출력한다.

 

 

<html>

<head>

<style type="text/css">

<!--

   BODY, TR, TH, TD {

      font-size : 10pt;

   }

//-->

</style>

</head>

 

<body>

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE sex = 'F'";

$result = mysql_db_query("sample",$query,$dbconn);

 

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

      

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$fields = mysql_num_fields($result);

 

echo("<table border=0 cellpadding=5>\n");

echo("<tr>\n");

echo("<td bgColor=pink align=center>name</td>\n");

echo("<td bgColor=pink align=center>table</td>\n");

echo("<td bgColor=pink align=center>max_length</td>\n");

echo("<td bgColor=pink align=center>not_null</td>\n");

echo("<td bgColor=pink align=center>primary_key</td>\n");

echo("<td bgColor=pink align=center>unique_key</td>\n");

echo("<td bgColor=pink align=center>multiple_key</td>\n");

echo("<td bgColor=pink align=center>numeric</td>\n");

echo("<td bgColor=pink align=center>blob</td>\n");

echo("<td bgColor=pink align=center>type</td>\n");

echo("<td bgColor=pink align=center>unsigned</td>\n");

echo("<td bgColor=pink align=center>zerofill</td>\n");

echo("</tr>\n");

 

for($i = 0; $i < $fields; $i++) {

   echo("<tr>\n");

   

   $field = mysql_fetch_field($result,$i);

   $name = $field->name;

   $table = $field->table;

   $max_length = $field->max_length;

   $not_null = $field->not_null;

   $primary_key = $field->primary_key;

   $unique_key = $field->unique_key;

   $multiple_key = $field->multiple_key;

   $numeric = $field->numeric;

   $blob = $field->blob;

   $type = $field->type;

   $unsigned = $field->unsigned;

   $zerofill = $field->zerofill;

      

   echo("<td bgColor=lightyellow align=center>$name</td>\n");

   echo("<td bgColor=lightyellow align=center>$table</td>\n");

   echo("<td bgColor=lightyellow align=center>$max_length</td>\n");

   echo("<td bgColor=lightyellow align=center>$not_null</td>\n");

   echo("<td bgColor=lightyellow align=center>$primary_key</td>\n");

   echo("<td bgColor=lightyellow align=center>$unique_key</td>\n");

   echo("<td bgColor=lightyellow align=center>$multiple_key</td>\n");

   echo("<td bgColor=lightyellow align=center>$numeric</td>\n");

   echo("<td bgColor=lightyellow align=center>$blob</td>\n");

   echo("<td bgColor=lightyellow align=center>$type</td>\n");

   echo("<td bgColor=lightyellow align=center>$unsigned</td>\n");

   echo("<td bgColor=lightyellow align=center>$zerofill</td>\n");

   echo("</tr>\n");

}   

 

echo("</table>");

 

mysql_close($dbconn);

?>

 

</body>

</html>

 

[예제5.13] mysql_fetch_field() 함수를 이용한 필드 정보 출력

 

위 예제 18행을 보면 다음과 같이 mysql_db_query() 함수가 호출된 것을 알 수 있다.

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE sex = 'F' ";

$result = mysql_db_qyery("sample",$query,$dbconn);

mysql_db_query() 함수는 MySQL 서버에 있는 작업 대상 데이터베이스에 쿼리문을 전송하는 역할을 한다. 즉, mysql_select_db("sample",$dbdonn) 함수로 작업 대상 데이터베이스를 선택하고 mysql_query

($query,$dbconn) 함수로 서버에 SQL 쿼리문을 전송하는 역할을 한꺼번에 수행하는 함수이다.

49행에서는 mysql_fetch_field() 함수로부터 결과 레코드 세트의 필드 정보를 그 속성으로 갖는 객체 변수 $field를 얻고 이 객체 변수의 속성 값을 이용하여 필드의 각종 정보를 출력한다.

 

mysql_fetch_lengths 함수

mysql_fetch_lengths() 함수의 정의는 다음과 같다.

 

array mysql_fetch_lengths(int result);

   결과 레코드 세트에서 레코드의 각 필드에 담긴 필드값의 크기를 구한다.

mysql_fetch_lengths() 함수는 mysql_fetch_row() 함수에 의해 반환되는 레코드의 각 필드값의 길이를 배열로 저장하여 반환한다.

다음의 예제는 userdb 테이블에서 성별이 여자인 레코드를 검색하여 각 레코드의 필드에 저장된 필드값의 길이를 출력한다.

 

 

<html>

<head>

<style type="text/css">

<!--

   BODY, TR, TH, TD {

      font-size : 10pt;

   }

//-->

</style>

</head>

 

<body>

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$query = "SELECT name,id,email,sex,milage,level FROM userdb WHERE sex = 'F'";

$result = mysql_db_query("sample",$query,$dbconn);

 

if(!$result) {

   $errNO = mysql_errno($dbconn);

   $errMSG = mysql_error($dbconn);

      

   echo("에러코드 $errNO : $errMSG<br>");

   exit;

}

 

$fields = mysql_num_fields($result);

 

echo("<table border=0 cellpadding=5>\n");

echo("<tr>");

for($i = 0; $i < $fields; $i++) {

   $fieldname = mysql_field_name($result,$i);

   echo("<td bgColor=pink align=center>$fieldname</td>\n");

}

echo("</tr>\n");

 

while($row = mysql_fetch_row($result)) {

   $length = mysql_fetch_lengths($result);

   echo("<tr>\n");

   for($i = 0; $i < $fields; $i++) {

      echo("   <td bgColor=lightyellow align=center>$row[$i] [<b>$length[$i]</b>byte]</td>\n");

   }

   echo("</tr>\n");

}

 

echo("</table>");

 

mysql_close($dbconn);

?>

 

</body>

</html>

 

[예제5.14] mysql_fetch_lengths() 함수를 이용한 필드값의 길이 출력

 

위 예제 38~45행에서는 검색된 결과 레코드 세트에서 mysql_fetch_row() 함수로 하나의 레코드씩 가져와 해당 레코드의 필드값을 $row[$i]로부터 출력하고 이들 필드값이 차지하는 크기는 39행의 mysql_fetch_lengths() 함수로부터 배열 변수에 저장하여 $length[$i]로부터 출력한다.

 

mysql_list_dbs 함수

mysql_list_dbs() 함수의 정의는 다음과 같다.

 

int mysql_list_dbs(int [link_identifier]);

   연결 식별자에 의해 연결이 확인된 MySQL 서버에 존재하는 데이터베이스의 리스트를 포인터로 반환한다.

mysql_list_dbs() 함수는 MySQL 서버에 있는 데이터베이스의 목록을 담고 있는 결과 포인터를 반환한다. 이 결과 포인터를 mysql_result() 함수의 인자로 전달하여 실행하면 해당 데이터베이스의 리스트를 구할 수 있다.

다음의 예는 mysql_list_dbs() 함수로 현재 MySQL 서버 내에 어떠한 데이터베이스가 생성되어 있는지를 출력한다.

 

 

<?

$dbconn = mysql_connect("localhost","php","php99") || die("DB서버 연결에 실패하였습니다!");

 

$dblist = mysql_list_dbs($dbconn);

 

$numDB = mysql_num_rows($dblist);

$numETC = mysql_num_fields($dblist);

 

for($i = 0; $i < $numDB; $i++) {

   for($j = 0; $j < $numETC; $j++) {

      $dbname = mysql_result($dblist,$i,$j);

      echo("데이터베이스 : $dbname");

   }   

   echo("<br>");

}   

 

mysql_close($dbconn);

?>

 

[예제5.15] mysql_list_dbs() 함수로 데이터베이스 목록 구하기

 

위 예제의 4행에서 mysql_list_dbs() 함수의 실행 결과로 반환된 겨로가 포인터 $dblist를 11행에서 mysql_result() 함수의 인자로 전달하여 해당 서버 내에 존재하는 데이터베이스의 이름을 출력한다. 실행 결과 다음과 같이 mysql과 test, 그리고 5.3절에서 생성한 sample의 세 가지 데이터베이스가 존재함을 알 수 있다.

 

데이터베이스 : mysql

데이터베이스 : sample

데이터베이스 : test

 

mysql_list_tables 함수

mysql_list_tables() 함수의 정의는 다음과 같다.

 

int mysql_list_tables(string database, int[link_identifier]);

   현재 선택된 데이터베이스 내에 존재하는 필드의 리스트를 얻는다.

mysql_list_tables() 함수는 인자로 전달한 데이터베이스 내에 존재하는 필드의 목록을 저장하고 있는 결과 포인터를 반환한다.

다음의 예제는 msyql 데이터베이스에 존재하는 테이블의 리스트를 출력한다.

 

 

<?

$dbconn = mysql_connect("localhost","mysql","") || die("DB서버 연결에 실패하였습니다!");

 

$tablelist = mysql_list_tables("mysql",$dbconn);  

if(!$tablelist) {

   echo("테이블선택실패");

   exit;

}

 

$numTBL = mysql_num_rows($tablelist);

$numETC = mysql_num_fields($tablelist);

 

for($i = 0; $i < $numTBL; $i++) {

   for($j = 0; $j < $numETC; $j++) {

      $tblname = mysql_result($tablelist,$i,$j);

      echo("테이블명 : $tblname");

   }   

   echo("<br>");

}   

 

mysql_close($dbconn);

?>

 

[예제5.16] mysql_list_tables() 함수로 특정 데이터베이스의 테이블 목록 구하기

 

2행에서 mysql 데이터베이스에 접근하기 위해서 사용자를 "php"가 아닌 "root"로 설정하였다. 4행에서 mysql_list_tables() g마수의 실행 결과로 반환된 결과 포인터 $tablelist를 15행에서 mysql_result() 함수의 인자로 전달하여 mysql 데이터베이스 내에 존재하는 테이블의 이름을 출력한다.

 

실행결과 mysql 데이터베이스 내에는 다음과 같이 여섯 개의 테이블이 존재함을 알 수 있다.

 

테이블명 : columns_priv

테이블명 : db

테이블명 : func

테이블명 : host

테이블명 : tables_priv

테이블명 : user

 

mysql_list_fields 함수

mysql_list_fields() 함수의 정의는 다음과 같다.

 

int mysql_list_fields(string database_name, string table_name, int [link_identifier]);

   인자로 지정한 데이터베이스의 테이블에 존재하는 필드의 목록을 구한다.

mysql_list_fields() 함수의 첫 번째 인자는 데이터베이스이고 두 번째 인자는 해당 데이터베이스 내에 존재하는 테이블의 이름이다. mysql_list_fields() 함수는 실행 결과로 인자로 지정한 테이블을 가리키는 포인터를 반환하므로 mysql_field_name(), mysql_field_type(), mysql_field_len(), mysql_field_flags() 등의 함수로부터 이 테이블에 존재하는 필드의 이름이나 타입, 크기, 속성 등 여러 가지 정보를 얻어낼 수 있다.

 

mysql_pconnect 함수

mysql_pconnect() 함수의 정의는 다음과 같다.

 

int mysql_pconnect(string [hostname][:port], string[username], string[password]);

   MySQL 서버에 연결한다. 성공할 경우 양수의 연결 식별자를, 실패할 경우 false를 반환한다.

mysql_pconnect() 함수는 mysql_connect() 함수와 거의 동일하다. 단지 두 함수의 차이점은 mysql_connect() 함수의 경우 스크립트의 실행이 종료되면 해당 서버에 대한 연결이 자동적으로 끊어지지만 mysql_pconnect() 함수는 끊어지지 않고 그 연결이 지속된다. 즉, 스크립트 종료 전에 mysql_close() 함수를 호출하여도 mysql_pconnect() 함수로 설정된 연결은 끊어지지 않는다.

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.