글쓴이:우수한
mysql_fetch_object로 쿼리를 던지면, 그 결과 오브젝트(객체)를 받아오게 됩니다.
이것이 어떻게 프로그래밍을 간편하게 만들어주는지 살펴보도록 하겠습니다.
----- [1단계: 기초] -----
자, 다음과 같은 테이블이 있다고 합시다.
CREATE TABLE users (
id varchar(10) not null,
name varchar(10) not null,
addr varchar(30) not null,
phone varchar(14) not null,
PRIMARY KEY (id)
);
INSERT INTO users VALUES ("test", "아무개", "서울", "02-123-4567");
여기서는 편의상 DB 클래스를 사용하겠습니다. (하지만 DB클래스가 중요한 것은 아닙니다.)
DB->fetch()라는 함수는 mysql_fetch_object()를 뜻한다는 것만 아시면 됩니다.
$DB->query("SELECT id, name, addr, phone FROM users WHERE id='test' ");
$user = $DB->fetch();
위와 같은 코드를 실행하면, 그 결과 $user->id 에는 "test", $user->name 에는 "아무개" 등의 값이 들어있는 것을 확인하실 수 있습니다.
자, 그럼 위의 기능을 함수로 만들어보겠습니다.
function load_user($id) {
$SQL = " SELECT * FROM users WHERE id='$id' ";
$DB =& DB::getInstance();
$DB->query($SQL);
return $DB->fetch();
}
이제 회원정보를 읽어올때 $user = load_user("test"); 라고 하면 끝입니다.
회원정보를 변경할 수 있는 폼을 출력할때
과 같은 식으로 쓰면 됩니다.
쉽죠? 이로써 SELECT 쿼리문을 작성하는 번거로움이 줄게 되었습니다.
----- [2단계: 활용] ------
사용자가 회원정보를 변경하는 폼을 입력했다면, 이제 회원정보를 수정해야겠죠?
$user->name = $_POST["name"] 과 같은 식으로 값을 받습니다.
이것도 PHP의 유연성이라고 해야 할까나? 클래스를 생성할때 멤버변수(var)를 지정해주지 않더라도 추후에 멤버변수를 추가할 수 있고, 또 $user = new user; 와 같이 클래스로 만들지 않더라도 그냥 $user->name="아무개"; 하면 바로 오브젝트가 됩니다. --;;
회원정보를 저장할때는 save_user() 라는 함수를 만들어 쓰겠습니다.
function save_user($id, $user) {
if (!is_object($user)) return false;
$row = array();
foreach ($user as $key=>$val) $row[] = " $key='$val' ";
$DB =& DB::getInstance();
$SQL = "UPDATE user SET ".join(",", $row)." WHERE id='".$id."' ";
return $DB->query($SQL);
}
이제 감 잡으셨죠?
[사용 예]
$user->name = "아무개";
$user->addr = "부산";
save_user("test", $user);
이렇게 하면 회원정보 저장이 끝나는 것입니다.
여기서 $user->name="아무개" 는 변하지 않고 그대로이군요.
따라서 불필요한 쿼리를 하게 되는군요.
이럴때는 미리 unset($user->name); 한 다음에 save_user("test", $user); 를 해주면
UPDATE ... SET name="아무개" , addr="부산" .... 이라는 쿼리문이
UPDATE ... SET addr="부산" .... 으로 바뀌게되겠죠.
이로써 코드 작성시 UPDATE 쿼리를 생략할 수 있게 되었습니다.
(사실상 SQL 쿼리문을 적당히 작성해서 실행하는 단순한 함수에 불과합니다.)
테이블 자체를 하나의 오브젝트로 간주하고 코드를 작성하게 되기 때문에
변수 이름 때문에 헷갈리거나 하지 않고, 비교적 수월하게 작업을 할 수 있습니다.
----- [3단계: 응용] ------
지금까지 user 라고 하는 특정 테이블을 가지고 작업을 했습니다.
이왕 만든거, 이제는 이걸 좀더 보편적인 함수로 만들어서
아무 테이블에서나 SELECT 및 UPDATE 를 하도록 하겠습니다.
load_xxxx($obj)함수를 실행하면 하나의 레코드를 읽어오고
save_xxxx($obj)함수를 실행하면 데이타를 업데이트하는 겁니다.
단, 여기서 주의할 점이 있습니다. 가령
$user->score = 100; 이라고 지정하고
save_xxxx($user); 를 실행했는데
해당 테이블에 score라는 필드가 없으면 에러가 발생하겠지요.
그러니 해당객체($obj)의 멤버값으로 지정된 내용이 테이블에 존재하는지를 판단해야 합니다.
그래서 우선 해당 테이블의 필드를 읽어오는 함수를 만듭니다.
function get_fields($table) {
$key_ar = array();
$field_ar = array();
$DB =& DB::getInstance();
$SQL = "SHOW COLUMNS FROM ".$table;
$DB->query($SQL);
while ($row=$DB->fetch()) {
$field_ar[] = $row->Field;
if ($row->Key=="PRI") $key_ar[] = $row->Field;
}
return array($key_ar, $field_ar);
}
get_fields("테이블명")을 실행하면 기본키의 목록, 모든 필드의 목록을 가져오게 됩니다.
(참고: 보편적인 걸로 만들려고 하다 보니 SHOW COLUMNS/FIELDS 라는 쿼리를 한번 더 하게 되었습니다. 실전에서는 위의 2단계 정도까지 사용하시거나 이런 에러 검출이 필요없는 코드를 작성하셔야겠죠.)
자, 그럼 데이타를 읽어오는 함수는 다음과 같습니다.
기본키값으로 검색해서 1개의 레코드를 가져옵니다.
function load_simple_db($table, $obj) {
if (!is_object($obj) && !is_array($obj)) return false;
$where = array();
list($key_ar,) = get_fields($table);
if (!$key_ar) return false;
foreach ($obj as $key=>$val) {
if (in_array($key, $key_ar)) $where[] = " $key='$val' ";
}
$SQL = "SELECT * FROM ".$table." WHERE ".join(" and ", $where);
$DB =& DB::getInstance();
$DB->query($SQL);
return $DB->fetch();
}
이 함수를 사용할때는, 미리 객체를 생성하고 검색할 조건 값을 부여해야 합니다. 즉
[사용 예]
unset($user);
$user->id = "test";
$user = load_simple_db("user", $user);
echo $user->name;
echo $user->addr;
echo $user->phone;
이런 식으로 하면 됩니다.
데이타를 업데이트하는 함수는 다음과 같습니다.
역시 기본키만을 검색조건에 사용할 수 있습니다.
function save_simple_db ($table, $obj) {
if (!is_object($obj) && !is_array($obj)) return false;
$data = array();
$where = array();
list($key_ar,$field_ar) = get_fields($table);
if (!$key_ar) return false;
foreach ($obj as $key=>$val) {
if (in_array($key, $key_ar)) {
$where[] = " $key='$val' ";
} elseif (in_array($key, $field_ar)) {
$data[] = " $key='$val' ";
}
}
if (!$where || !$data) return false;
$SQL = "UPDATE ".$table." SET ".join(",", $data)." WHERE ".join(" and ", $where);
$DB =& DB::getInstance();
return $DB->query($SQL);
}
이 함수를 사용할때는, 미리 생성된 객체에 업데이트할 값을 지정해두어야 합니다.
또 기본키가 적어도 하나는 들어있어야 합니다.
[사용 예]
$user->id = "test";
$user->name = "아무개";
$user->addr = "부산";
$user->phone = "02-123-4567";
save_simple_db("user", $user);
이런 식으로 하면 됩니다.
물론 제한점이 많은 함수입니다만, 경우에 따라 유용하게 쓸 수 있겠죠.
----- [끝] -----
얼핏 보기에 복잡해보일지 몰라도, 잘 살펴보면 아주 간단한 내용입니다.
객체지향 프로그래밍을 다루는 것이 아니라,
사실상 배열 대신 객체 타입을 사용하는 것일 뿐입니다.
SELECT, UPDATE 쿼리문을 생략할 수 있으므로 코드가 간결해질 수 있다는 요지입니다.
(쓰고 보니 별 거 아니군요.) --;;
비밀글입니다.
팁앤텍 mysql_fetch_object 객체 활용하기
작성자 user
작성일 2003-05-31 01:38:54
조회수 526
댓글 0개