'데이타베이스'에 해당되는 글 3건
- 2009/08/21 문서 지향 데이타베이스인 MongoDB를 PHP로 다뤄보자
- 2008/12/14 MySQL 프로시져(PROCEDURE) 활용 샘플 소스 코드
- 2007/08/25 오늘 공개 보드로 플래시 커뮤니티를 만들었습니다. (2)
문서 지향 데이타베이스(Document Oriented Database) 몽고디비(MongoDB)를 테스트 하기 위한 PHP 소스 코드를 준비했습니다. 아래 소스 코드를 살펴보시면 PHP로 몽고디비에 접근하는 방법을 파악할 수 있습니다. 이에 대해 좀더 알아보고 싶다면 PHP 튜토리얼과 PHP 메뉴얼을 체크해보세요. 그리고 직접 테스트 해보려면 PHP 드라이버 설치를 해야 합니다. 드라이버도 설치하고 문서도 숙지해서 개발 환경을 갖추었다면 몽고디비를 실전에 응용해보는 것은 어떨까요? 거대한 자료 묶음을 빠르게 제어한다는 이 데이타베이스의 장점을 살려 위키(Wiki)나 블로그 또는 트위터 같은 소셜 네트워크 사이트를 만들어 봐도 좋은 것 같네요.
[MongoDB 테스트를 위한 소스 코드]
[MongoDB 테스트 실행 결과]
웹프로그래머의 홈페이지 정보 블로그 http://hompy.info/587
[MongoDB 테스트를 위한 소스 코드]
<?
include "Mongo/Auth.php";
$auth = new MongoAuth("192.168.10.123:27017");
$auth->login("desk", "tiger", "ti_password");
if (!$auth->loggedIn) {
echo $auth->error;
exit;
}
$coll = $auth->db->selectCollection("person.data");
$coll->drop();
if (!$coll->count()) {
$obj = array( "name" => "kim", "age" => 21 );
$coll->insert($obj);
$obj = array( "name" => "song", "age" => 18 );
$coll->insert($obj);
$obj = array( "name" => "lee", "age" => 23 );
$coll->insert($obj);
$obj = array( "name" => "han", "age" => 18 );
$coll->insert($obj);
$obj = array( "name" => "choi", "age" => 19 );
$coll->insert($obj);
$coll->ensureIndex(array('name' => 1), true);
$coll->ensureIndex(array('age' => 1), false);
$coll->deleteIndex("age");
}
$obj = array( '$set' => array("age"=>29 ) );
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$set' => array("age"=>21, "sex"=>"f", "tags"=>array()) );
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$push' => array("tags" => "game"));
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$push' => array("tags" => "movie"));
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$pushAll' => array("tags" => array("music","sports")));
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$pullAll' => array("tags" => array("music","love")));
$coll->update(array("name"=>"choi"),$obj);
$query = array('age'=>array('$gt'=>18));
$cursor = $coll->find($query)->sort(array("age"=>-1));
displayCursor($cursor);
$auth->logout();
exit;
function displayCursor($cursor){
while ($cursor->hasNext()) {
$obj = $cursor->getNext();
echo displayObject($obj);
echo "<br>\n";
}
}
function displayObject($obj){
$str = json_encode($obj);
$str = preg_replace('/"([a-z_][a-z0-9_]*)":/','<FONT color=#888888>\1</FONT>:', $str);
$str = preg_replace('/"([a-z_][a-z0-9_]*)"/','<FONT color=#cc3333>"\1"</FONT>', $str);
$str = str_replace(Array(',',':','{','}'), Array(', ',' : ','{ ',' }'), $str);
return $str;
}
?>
include "Mongo/Auth.php";
$auth = new MongoAuth("192.168.10.123:27017");
$auth->login("desk", "tiger", "ti_password");
if (!$auth->loggedIn) {
echo $auth->error;
exit;
}
$coll = $auth->db->selectCollection("person.data");
$coll->drop();
if (!$coll->count()) {
$obj = array( "name" => "kim", "age" => 21 );
$coll->insert($obj);
$obj = array( "name" => "song", "age" => 18 );
$coll->insert($obj);
$obj = array( "name" => "lee", "age" => 23 );
$coll->insert($obj);
$obj = array( "name" => "han", "age" => 18 );
$coll->insert($obj);
$obj = array( "name" => "choi", "age" => 19 );
$coll->insert($obj);
$coll->ensureIndex(array('name' => 1), true);
$coll->ensureIndex(array('age' => 1), false);
$coll->deleteIndex("age");
}
$obj = array( '$set' => array("age"=>29 ) );
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$set' => array("age"=>21, "sex"=>"f", "tags"=>array()) );
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$push' => array("tags" => "game"));
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$push' => array("tags" => "movie"));
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$pushAll' => array("tags" => array("music","sports")));
$coll->update(array("name"=>"choi"),$obj);
$obj = array( '$pullAll' => array("tags" => array("music","love")));
$coll->update(array("name"=>"choi"),$obj);
$query = array('age'=>array('$gt'=>18));
$cursor = $coll->find($query)->sort(array("age"=>-1));
displayCursor($cursor);
$auth->logout();
exit;
function displayCursor($cursor){
while ($cursor->hasNext()) {
$obj = $cursor->getNext();
echo displayObject($obj);
echo "<br>\n";
}
}
function displayObject($obj){
$str = json_encode($obj);
$str = preg_replace('/"([a-z_][a-z0-9_]*)":/','<FONT color=#888888>\1</FONT>:', $str);
$str = preg_replace('/"([a-z_][a-z0-9_]*)"/','<FONT color=#cc3333>"\1"</FONT>', $str);
$str = str_replace(Array(',',':','{','}'), Array(', ',' : ','{ ',' }'), $str);
return $str;
}
?>
[MongoDB 테스트 실행 결과]
{ _id : { }, name : "lee", age : 23 }
{ _id : { }, name : "kim", age : 21 }
{ _id : { }, name : "choi", age : 21, sex : "f", tags : ["game", "movie", "sports"] }
{ _id : { }, name : "kim", age : 21 }
{ _id : { }, name : "choi", age : 21, sex : "f", tags : ["game", "movie", "sports"] }
웹프로그래머의 홈페이지 정보 블로그 http://hompy.info/587
아래 소개된 SQL 소스 코드는 3가지의 MySQL 프로시져(PROCEDURE)를 이용해서 테이블 중에 개별 레코드의 특정 컬럼의 문자열을 구분자로 분리해서 별도의 테이블에 각각 하나의 레코드로 기록할 수 있도록 합니다.
웹프로그래머의 홈페이지 정보 블로그 http://hompy.info
| DROP TABLE IF EXISTS my_bundles; CREATE TABLE my_bundles(seq int auto_increment, total int, bundle text, PRIMARY KEY (seq)); INSERT INTO my_bundles(total,bundle) VALUES (3,"JAVASCRIPT,ACTIONSCRIPT,HTML"),(1,"C++"),(2,"ALGOL,C#"),(7,"C,PHP,JSP,LISP,BASIC,ADA,PYTHON"),(6,"JAVA,RUBY,PASCAL,COBOL,FORTRAN,PERL"),(5,"DELPHI,PROLOG,SMALLTALK,PERL,COLDFUSION"); SELECT * FROM my_bundles; DROP TABLE IF EXISTS my_items; CREATE TABLE my_items(seq int auto_increment, language varchar(32), PRIMARY KEY (seq)); DELIMITER $$ DROP PROCEDURE IF EXISTS tokenizer $$ CREATE PROCEDURE tokenizer( INOUT input_string varchar(1025), OUT token varchar(1025), IN boundary varchar(16) ) READS SQL DATA BEGIN SELECT char_length(boundary) INTO @boundry_length; SET @idx = LOCATE(boundary,input_string); IF (@idx = 0) THEN SET token = input_string; SET input_string = NULL; ELSE SET token = SUBSTR(input_string,1,@idx-1); SET input_string = SUBSTR(input_string,@idx + @boundry_length); END IF; END $$ DELIMITER ; DELIMITER $$ DROP PROCEDURE IF EXISTS insert_items $$ CREATE PROCEDURE insert_items(IN my_str varchar(1024)) MODIFIES SQL DATA BEGIN SELECT my_str INTO @org_string; CALL tokenizer(@org_string, @tkn_str, ','); WHILE (@tkn_str IS NOT NULL) DO INSERT INTO my_items(language) VALUES (@tkn_str); CALL tokenizer(@org_string, @tkn_str, ','); END WHILE; END $$ DELIMITER ; CALL insert_items('a,b,c'); SELECT * FROM my_items; DELIMITER $$ DROP PROCEDURE IF EXISTS insert_cols_items $$ CREATE PROCEDURE insert_cols_items() BEGIN DECLARE ok INT DEFAULT '0'; DECLARE tmp_seq INT DEFAULT '0'; DECLARE tmp_total INT DEFAULT '0'; DECLARE tmp_bundle TEXT DEFAULT ''; DECLARE tot INT DEFAULT '0'; DECLARE cur CURSOR FOR SELECT seq, total, bundle FROM my_bundles; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET ok = 1; OPEN cur; REPEAT FETCH cur INTO tmp_seq, tmp_total, tmp_bundle; IF NOT ok THEN CALL insert_items(tmp_bundle); SET tot = tot + 1; END IF; UNTIL ok END REPEAT; CLOSE cur; IF tot > 0 THEN SELECT tot; ELSE SELECT 0; END IF; END $$ DELIMITER ; TRUNCATE my_items; CALL insert_cols_items(); SELECT * FROM my_items; |
웹프로그래머의 홈페이지 정보 블로그 http://hompy.info
오늘 공개 보드(그누보드)로 플래시 커뮤니티를 만들었습니다. 당분간 공개 보드로 운영을 하다가 자체 보드를 개발해서 자료를 컨버팅 하고 새로운 보드로 운영해볼 생각입니다. 막상 운영을 해보려고 마음 먹고 보드를 설치하고 이것 저것 손보고 자료도 올리고 하려다 보니 하루 종일 시간 투자를 하게 되네요. 디자인 부분을 멋지게 해보고 싶지만 디자이너가 아닌 관계로 비쥬얼은 원하는 모양으로 변화 시키지 못해 특별히 한 것 없어 보이는 형국이네요. 차차 시간을 투자해서 보다 알찬 커뮤니티를 만들어볼 생각입니다. 이제 시작하는 단계라 우선은 웹프로그래머의 홈페이지정보 블로그의 몇몇 카테고리에 있는 자료를 플래시 커뮤니티로 컨버팅해서 옮겼고 곧 개인적으로 운영하고 있는 네이버 플래시 카페 자료를 컨버팅해서 커뮤니티 게시물로 활용해야 할 것 같습니다.^^ 블로그의 UTF-8 데이터를 커뮤니티 EUC-KR 게시물로 변환하는 과정에서 약간의 시간을 까먹어 버렸군요. 다른분도 저와 같은 혼란을 겪지 않게 해드리고 위해 아래의 코드를 참고하세요. EUC-KR 로 운영중인 MYSQL 서버에서 EUC-KR 로 데이터를 읽어 올 수 있는 코드입니다. 쿼리를 보내기 전에 사용하시면 됩니다.
mysql_query("SET CHARACTER SET utf8", $my_db1);
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'", $my_db1);
웹프로그래머와 함께 플래시 커뮤니티를 활성화 시켜볼 의향이 있는 분들은 블로그에 흔적을 남겨주시거나 메신져 친구등록 바랍니다.
웹프로그래머의 홈페이지정보 블로그 http://hompy.info
mysql_query("SET CHARACTER SET utf8", $my_db1);
mysql_query("SET SESSION collation_connection = 'utf8_general_ci'", $my_db1);
웹프로그래머와 함께 플래시 커뮤니티를 활성화 시켜볼 의향이 있는 분들은 블로그에 흔적을 남겨주시거나 메신져 친구등록 바랍니다.
웹프로그래머의 홈페이지정보 블로그 http://hompy.info


