排序|数据|数据库
在众多CGI语言中,PHP以其简单,快速的优点开始逐渐成长,使用PHP开发程序的人也越来越多,而一般PHP用的数据库就两种:文本以及MYSQL。文本数据库读、写速度慢,当数据到达一定量时就会大大的降低速度乃至崩溃!而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{
?>
请输入您的用户名: