PHP를 이용한 메모리 DB
memdb.inc
<?
//////////////////////////////////////////////////////////////////////////////////////
//
// MEM_DB 메모리 점유형 DB
//
// MEM DB v0.5
// 제작자 : 이현구(닉 : ent24)
//
//
// 현재 기능
// sql_create 데이터 베이스 생성
// 사용법 : sql_create("테이블명","필드1,필드2");
// ex) sql_create("a","b,c");
// 리턴값 : 없음
// sql_select 데이터 선택
// 사용법 : sql_select("테이블명","추출필드1,추출필드1","조건(현재는 = 만 사용가능함 중복 검색시 and/or 가능)","정렬(desc) 기본 asc");
// ex) : sql_select("a","b,c","b=10 and c=10","desc");
// 리턴값 : Array[레코드번호][필드명]
// sql_select_limit 데이터 선택된 데이터 개수 반환
// 사용법 : sql_select_limit("테이블명");
// ex) : echo sql_select_limit("a");
// 리턴값 : INT
// sql_insert 데이터 삽입
// 사용법 : sql_insert("테이블명","첫필드 데이터1,두번째 필드 데이터2"); //필드는 순서대로 입력
// ex) : sql_select_limit("a","10,20");
// 리턴값 : 없음
// sql_drop 데이터 테이블 삭제
// 사용법 : sql_drop("테이블명");
// ex) : sql_drop("a");
// 리턴값 : 없음
//
//////////////////////////////////////////////////////////////////////////////////////
class Mem_SQL
{
//기본
var $Mem_db_TABLE_BASE_LIMIT_Num;
function Mem_SQL()
{
$this->Mem_db_TABLE_BASE_LIMIT_Num=4;
}
//테이블생성
function sql_create($TB_name,$Fild_name_s)
{
//필드명 정의
$Fild_name=split(",",$Fild_name_s);
//필드명개수
$Fild_count=count($Fild_name);
//테이블의정보저장
$this->{$TB_name}[fild_limit]=$Fild_count;
$this->{$TB_name}[filds]=$Fild_name_s;
$this->{$TB_name}[limit]=0;
$this->{$TB_name}[select_limit]=0;
}
//테이블 레코드 개수 반환
function sql_select_limit($TB_name)
{
return $this->{$TB_name}[select_limit];
}
//선택
function sql_select($TB_name,$Fild_name_s,$Fild_search_s,$Fild_sort)
{
//전달 데이터 정의
$Result_data=Array();
//필드명 정의
$Fild_name=split(",",$Fild_name_s);
//필드명개수
$Fild_count=count($Fild_name);
//필드 개수 체크
$Table_count=count($this->{$TB_name});
//검색필드
$Fild_search_ary=$this->Search_query_data($Fild_search_s);
$Fild_search_count=count($Fild_search_ary[1]);
//해당 쿼리 개수 체크
$Check_fild_count=0;
//데이터 삽입
for($rof=$this->Mem_db_TABLE_BASE_LIMIT_Num;$rof<$Table_count;$rof++)
{
$Insert_check=0;
if($Fild_search_s)
{
for($rof_serach=0;$rof_serach<$Fild_search_count;$rof_serach++)
{
$cut_pos=strpos($Fild_search_ary[1][$rof_serach],"=");
$search_Fild_name=trim(substr($Fild_search_ary[1][$rof_serach],0,$cut_pos));
$search_Fild_data=substr($Fild_search_ary[1][$rof_serach],$cut_pos+1);
$Insert_check_mem=0;
if($this->{$TB_name}[$rof][ $search_Fild_name ]==$search_Fild_data) $Insert_check_mem=1;
if($Fild_search_ary[0][$rof_serach-1])
{
if($Fild_search_ary[0][$rof_serach-1]=="and") $Insert_check=$Insert_check*$Insert_check_mem;
if($Fild_search_ary[0][$rof_serach-1]=="or") $Insert_check=$Insert_check+$Insert_check_mem;
}
$Insert_check=$Insert_check+$Insert_check_mem;
}
}
else
$Insert_check=1;
if($Insert_check)
{
for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
{
$Result_data[$Check_fild_count][$rof_fild]=$this->{$TB_name}[$rof][ $Fild_name[$rof_fild] ];
$Result_data[$Check_fild_count][$Fild_name[$rof_fild]]=$this->{$TB_name}[$rof][ $Fild_name[$rof_fild] ];
}
$Check_fild_count++;
}
}
//데이터 정렬
$this->{$TB_name}[select_limit]=$Check_fild_count;
if($Fild_sort)
{
$Fild_sort_set_ary=explode(" ",$Fild_sort);
$Fild_sort_name=$Fild_sort_set_ary[0];
if($Fild_sort_set_ary[1]=="desc")
{
for($rof1=1;$rof1<$Check_fild_count;$rof2=$rof1, $rof1=$rof1*3+1);
do
{
for($rof3=0;$rof3<$rof2;$rof3++)
{
for($rof1=$rof3+$rof2;$rof1<$Check_fild_count;$rof1+=$rof2)
{
for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
$tmp_data_ary[$Fild_name[$rof_fild]]=$Result_data[$rof1][$Fild_name[$rof_fild]];
for($rof4=$rof1-$rof2, $tmp_data=$Result_data[$rof1][$Fild_sort_name];$rof4>=$rof3 && $Result_data[$rof4][$Fild_sort_name]<$tmp_data;$rof4-=$rof2)
{
for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
$Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$Result_data[$rof4][$Fild_name[$rof_fild]];
}
for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
$Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$tmp_data_ary[$Fild_name[$rof_fild]];
}
}
$rof2=($rof2-1)/3;
}while($rof2>=1);
}
else
{
for($rof1=1;$rof1<$Check_fild_count;$rof2=$rof1, $rof1=$rof1*3+1);
do
{
for($rof3=0;$rof3<$rof2;$rof3++)
{
for($rof1=$rof3+$rof2;$rof1<$Check_fild_count;$rof1+=$rof2)
{
for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
$tmp_data_ary[$Fild_name[$rof_fild]]=$Result_data[$rof1][$Fild_name[$rof_fild]];
for($rof4=$rof1-$rof2, $tmp_data=$Result_data[$rof1][$Fild_sort_name];$rof4>=$rof3 && $Result_data[$rof4][$Fild_sort_name]>$tmp_data;$rof4-=$rof2)
{
for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
$Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$Result_data[$rof4][$Fild_name[$rof_fild]];
}
for($rof_fild=0;$rof_fild<$Fild_count;$rof_fild++)
$Result_data[$rof4+$rof2][$Fild_name[$rof_fild]]=$tmp_data_ary[$Fild_name[$rof_fild]];
}
}
$rof2=($rof2-1)/3;
}while($rof2>=1);
}
}
return $Result_data;
}
//삽입
function sql_insert($TB_name,$Fild_data_s)
{
//필드 이름 삽입
$Fild_name_s=$this->{$TB_name}[filds];
//필드명 정의
$Fild_name=split(",",$Fild_name_s);
//필드개수
$Fild_count=$this->{$TB_name}[fild_limit];
//다음필드 배열수
$Next_count=count($this->{$TB_name});
//필드 명체크
$Fild_data=split(",",$Fild_data_s);
//삽입
for($rof=0;$rof<$Fild_count;$rof++)
$this->{$TB_name}[$Next_count][$Fild_name[$rof]]=$Fild_data[$rof];
//현재 배열 개수저장
$this->{$TB_name}[limit]=$Next_count-$this->Mem_db_TABLE_BASE_LIMIT_Num;
//전달값
return $Next_count;
}
//삽입
function sql_drop($TB_name)
{
$this->{$TB_name}="";
}
//조건문 해석기
function Search_query_data($querys)
{
$String_data=array();
$querys_org=$querys;
$Query_Operators_string=array(" and "," or ");
$Query_counts=0;
for($rof=0;$rof<count($Query_Operators_string);$rof++)
{
$Search_counts=count(explode($Query_Operators_string[$rof],$querys));
if($Search_counts>1)
$Query_counts+=$Search_counts-1;
}
for($rof_chk=0;$rof_chk<$Query_counts;$rof_chk++)
{
$Max_nums=100000;
$Cut_values=0;
for($rof=0;$rof<count($Query_Operators_string);$rof++)
{
$chk_counts_value=strpos($querys,$Query_Operators_string[$rof]);
if($Max_nums>$chk_counts_value&&$chk_counts_value!==false)
{
$Cut_values=strlen($Query_Operators_string[$rof]);
$Max_nums=$chk_counts_value;
$String_data[0][$rof_chk]=$Query_Operators_string[$rof];
break;
}
}
$querys=substr($querys,$Max_nums+$Cut_values);
}
for($rof=0;$rof<count($String_data[0]);$rof++)
{
$start_point=strpos($querys_org,$String_data[0][$rof]);
$datas_str_more=substr($querys_org,0,$start_point-1);
$querys_org=substr($querys_org,$start_point+strlen($String_data[0][$rof]));
$String_data[1][$rof]=$datas_str_more;
}
$String_data[1][$rof]=$querys_org;
return $String_data;
}
}
?>
----------------------------------------------------------------------------------
memdb.php
<?
$memdb=new Mem_SQL;
// 사용법 : sql_create("테이블명","필드1,필드2");
$memdb->sql_create("test","counts,names");
// 사용법 : sql_insert("테이블명","첫필드 데이터1,두번째 필드 데이터2"); //필드는 순서대로 입력
$memdb->sql_insert("test","10,자료3");
$memdb->sql_insert("test","20,자료2");
$memdb->sql_insert("test","30,자료1");
$memdb->sql_insert("test","40,자료4");
// 사용법 : sql_select("테이블명","추출필드1,추출필드1","조건(현재는 = 만 사용가능함 중복 검색시 and/or 가능)","정렬(desc) 기본 asc");
$item_data=$memdb->sql_select("test","counts,names","","names");
// 사용법 : sql_select_limit("테이블명");
$item_count=$memdb->sql_select_limit("test");
// 사용법 : sql_drop("테이블명");
$memdb->sql_drop("test");
//출력
for($i=0;$i<$item_count;$i++)
{
echo $item_data[$i][counts]."-".$item_data[$i][names]."<br>";
}
?>
---------------------------------------------------------------------------------
php 프로세스 간의 db 공유가 가능하도록 기능을 추가할 계획이 없다면,
sqlite::memory: 도 좋은 방법입니다.
<?php
$db = new PDO('sqlite::memory:');
$db->exec('CREATE TABLE a (b, c)');
$db->exec('INSERT INTO a VALUES (1,2)');
$stmt = $db->query('SELECT * FROM a');
$data = $stmt->fetchAll();
print_r($data);
?>
역시 단점은 한 프로세스가 끝나면 데이터가 소실되기 때문에,
어디에 써야 할지를 모르겠다는 것이죠.
'인터넷정보' 카테고리의 다른 글
nuSoap을 이용한 서버간의 파일전송 (0) | 2007.10.11 |
---|---|
로딩바 로딩중입니다 표시하기 (0) | 2007.10.11 |
페이징 (0) | 2007.10.11 |
php에서 첨부파일이 포함된 메일 보내기 함수 (0) | 2007.10.11 |
문자열에서 한글과 영문자만 골라내기 (0) | 2007.10.11 |
런타임으로 자바스크립트 화일 열기 (0) | 2007.10.11 |
마우스 오버시 테이블 한줄 색깔 바꾸기 (0) | 2007.10.11 |
간단한 php 달력 (0) | 2007.10.11 |
php로 pop3 데몬을 만들기 (0) | 2007.10.11 |
페이징 함수 (0) | 2007.10.11 |