分享
 
 
 

在PHP中使用DBM作为数据库(包括排序)

王朝php·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

在众多CGI语言中,PHP以其简单,快速的优点开始逐渐成长,使用PHP开发程序的人也越来越多,而一般PHP用的数据库就两种:文本以及MYSQL。文本数据库读、写速度慢,当数据到达一定量时就会大大的降低速度乃至崩溃!而MYSQL虽然速度快,功能强大,不过不是一般的业余爱号者所能用得起的,因为一般的免费空间都不支持MYSQL(有主机的朋友就不要往下看了)

今天笔者介绍的是DBM数据库,DBM是柏克莱大学发展的文件/文本型数据库,在BSD系统中已经安装完毕,即使没有安装,在PHP4.03中也加入了DBM的支持。因此,在大部份支持PHP的空间中都支持DBM(支持PHP的空间详见www.zphp.com)下面将分步介绍在PHP使用DBM做为数据库:

一、判断你的空间是否支持DBM的方法:

输入下面的程序:

----------------------------------------------------

<?

echo dblist();

?>

----------------------------------------------------

保存为dbmtest.php,运行,看看是否输出函数没有定义,如果不是,恭喜……

二、PHP使用DBM的基本函数:

1、int dbmopen(string filepath,string mode);

这个可以打开一个DBM数据库,其中filepath为DBM数据库的路径,mode有4个参数:"r"以只读的方式打开数据库;"w"以读写方式打开数据库;"c"以读写方式打开数据库,若不存在则建立;"n"删去现有数据库,以读写方式打开数据库。

2、boolean dbmclose(int handle); 关闭一个已经打开了的DBM数据库,同时释放handle。

3、string dbmfetch(int handle,string key); 取得已经打开了的handle数据库的key所对应的值。

4、boolean dbmexists(int handle, string key); 判断在已经打开了的handle数据库中是否存在key。

5、string dbmfirstkey(int handle); 取得已经打开了的handle数据库的物理第一个key。

6、string dbmnextkey(int handle,string key);

取得已经打开了的handle数据库中的key所对应的下一个key(就是dbmnextkey和dbmfirstkey两个函数实现了dbm的遍历搜索!)

7、boolean dbminsert(int handle,string key,string value);

在已经打开了的handle数据库中插入一个key,其对应的值为value,如果已经存在key则返回false。

8、boolean dbmreplace(int handle, string key, string value);

在已经打开了的handle数据库中替换key所对应的值成为value,如果不存在key则返回建立。

9、boolean dbmdelete(int handle,string key);在已经打开了的handle数据库中删除key。

三、使用DBM的注意事项:

1、DBM数据库不像SQL,它只有单纯的key/Value的定位,如果你想储存多种信息,只能将信息用一个分隔符来分开,如下(这里用“|!:!|”做分隔符)

Name|!:!|TelNo|!:!|MailAdd //分别储存了名字、电话及邮箱

读取时方法如下:

----------------------------------------------------

 $data=explode('|!:!|'dbmfetch( $dbmid, $key));

//则 $data[o]对应名字, $data[1]对应电话, $data[2]对应邮箱

----------------------------------------------------

2、DBM本身储存数据没有任何物理顺序,只能通过自己的处理(见下文)来排序!

3、DBM不像文本,把一个db从这个主机转移到另一个主机上是会出错的,即一旦建立一个db文件,就不能转移!

4、DBM在NT下面一个key对应的值的长度不能超过1k个字符,故在NT下不能使用DBM保留一些有长度问题的东西!

5、关于DBM中使用中文的KEY:DBM的key不能使用中文,笔者在一共程序中试过,如果使用中文作为key的话当key一多(大约20)就会出现无法遍历搜索的问题!

四、用DBM做无序数据库:

用DBM做无序数据库(即数据无顺序概念)十分简单,比文本数据库要简单的多!比如下面是一个让用户输入用户名后给出用户电话的程序:

----------------------------------------------------

<?

if(isset( $userid)){

 $data=dbmopen("path","r");

if(dbmexists( $data, $userid))echo  $no=dbmfetch( $data, $userid);

else echo "UserID Error!";

dbmclose( $data);

}else{

?>

请输入您的用户名:

<form action=<?echo $PHP_SELF;?>

<input type="text" name="userid">

<input type="submit" name="submit"></form><?}?>

----------------------------------------------------

五、用DBM做有序数据库:

因为DBM没有对数据进行排序,所以对于一些按一定顺序输出的程序(如刚才的程序改为显示所有用户的电话)则比较棘手,需要人为排序,下面笔者给出两种方法:

1、排序数据法:在这种方法里我们专门用一个key所对应的值来记录顺序,那个key我们人为命名为sort,sort对应值如下:

data1's key|data2's key|data3's key|........|data n's key

其中data n's dey的长度需要一定(笔者使用的是时间方法,如下程序可以生成key:)

----------------------------------------------------

function getkey(){

 $date=date("ymdHis");

return  $date;

}

----------------------------------------------------

这样用getkey()可以得到一个类似001203114950的12位key,而每个key就对应它自己的值(在这里用户的电话);而用substr( $sort, $i*13,12)就可以读出第i个用户的key,下面是显示列表的代码:

----------------------------------------------------

<?

//首先要知道有多少个用户,可以专门开一个num来记录

 $data=dbmopen("path","r"); //打开数据库

 $sort=dbmfetch( $data,"sort"); //读取sort

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

 $key=substr( $sort, $i*13,12); //安顺序取得key

 $telno=dbmfetch( $data, $key); //读出key对应的value

echo  $i+1." User's TelNO is ". $telno."<br>";

}

dbmclose( $data);

?>

----------------------------------------------------

2、数组排序法:在这里感谢无伤兄,是他让笔者想起用数组来排序的。数组排序的基本原理是将整个DBM数据库的每条key读入数组,然后根据每个key的大小使用usort()等函数排序然后输出。

因为是对key的大小排序,所以key的长度没有什么限制,只要保证后加入的key大于先加入的key就可以实现先显示后加入的人,这里用time()来作为key。

下面是列表代码:

----------------------------------------------------

 $data=dbmopen("path","r"); //打开数据库

 $i=1;

for( $key=dbmfirstkey( $data); $key; $key=dbmnextkey( $data, $key)){

 $sort[ $i]= $key;

 $i++;

} //遍历取得所有的key

usort( $sort); //安大小排序

for( $i=0; $i<count( $sort); $i++)

echo  $i+1." User's TelNO is ".dbmfetch( $data, $sort[ $i])."<br>";

dbmclose( $data);

----------------------------------------------------

以上两种方法在运行时占用内存(用于排序)第一种比第二种要大一点,不过对于运算量来讲,第一种方法则要小于第二种,至于想用哪种方法就随你意了(如果你兴趣,可以试试两者的CPU占用率)。

笔者在经过了N次(N>50)实验后完成了这篇文章仅以此献给穷苦的仍在用txt的朋友们相信也不是所有看CN的人都有自己的主机!如果有什么不明白的,来这里看看:www.zphp.com。

笔者不是什么高手,不过因为几乎找不到在PHP上使用DBM数据库的资料(包括英文资料,不过Perl方面的却不少)。最好留一个笔者用DBM写的论坛,大家可以试试速度:www.zphp.com/demo/dbmbbs/ !

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有