dbm数据库和mysql数据库,在PHP中使用DBM作为数据库-PHP教程,数据库相关

在众多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{

?>

请输入您的用户名:

}?>

—————————————————-

五、用dbm做有序数据库:

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

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

data1s key|data2s key|data3s key|……..|data ns key

其中data ns 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

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

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

echo $i+1.” users telno is “.$telno.”
”;

}

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

echo $i+1.” users telno is “.dbmfetch($data,$sort[$i]).”
”;

dbmclose($data);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值