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

排序|数据|数据库

在众多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{
?>
请输入您的用户名:
<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占用率)。

时间: 2024-10-27 08:46:14

PHP中使用DBM作为数据库(包括排序)的相关文章

在PHP中使用DBM作为数据库

数据|数据库 在众多CGI语言中,PHP以其简单,快速的优点开始逐渐成长,使用PHP开发程序的人也越来越多,而一般PHP用的数据库就两种:文本以及MYSQL.文本数据库读.写速度慢,当数据到达一定量时就会大大的降低速度乃至崩溃!而MYSQL虽然速度快,功能强大,不过不是一般的业余爱号者所能用得起的,因为一般的免费空间都不支持MYSQL(有主机的朋友就不要往下看了) 今天笔者介绍的是DBM数据库,DBM是柏克莱大学发展的文件/文本型数据库,在BSD系统中已经安装完毕,即使没有安装,在PHP4.03

asp.net中使用 Repeater控件拖拽实现排序并同步数据库字段排序_实用技巧

数据库表中有一个单位表,里面包括ID.Name.Order等字段,现在有个后台管理功能,可以设置这些单位在某些统计表格中的先后显示顺序,于是想到用拖拽方式实现,这样操作起来更简便. 使用了GifCam软件做了一个示例动画,效果如下图所示: 于是就动手起来,发现jquery.ui中提供sortable函数,可用于排序,界面中从数据库绑定的单位使用Repeater控件,下面简单介绍下主要步骤: 1.项目中使用到的jquery-1.7.2.min.js和jquery-ui.min.js请点击进行下载,

SQL Server中转换数据库的排序规则

本文定义了排序规则并介绍如何在 Microsoft SQL Server 中转换数据库的排序规则.有关 SQL Server 2000 的概念和讨论同样适用于 SQL Server 2005. 什么是排序规则? 排序规则指定了表示每个字符的位模式.它还指定了用于排序和比较字符的规则.排序规则具有下面的特征: ◆语言 ◆区分大小写 ◆区分重音 ◆区分假名 要了解服务器当前使用的排序规则,可以在 SQL 查询分析器中运行 sp_helpsort 系统过程. SQL Server 7.0 不支持使用多

sqlserver-怎么使数据库表中信息按某一列排序,列的类型是datetime

问题描述 怎么使数据库表中信息按某一列排序,列的类型是datetime 列名:report-date 例子:2014-09-01 00:00:00.000 sqlserver语句怎么写,按这一列的时间排序 解决方案 select * from xxxx order by [report-date] desc 解决方案二: 将这个字段转换成时间,order by cast(***这个字段) 解决方案三: sql server支持datetime排序 order by report-date

SQL Server转换数据库的排序规则

什么是排序规则? 排序规则指定了表示每个字符的位模式.它还指定了用于排序和比较字符的规则.排序规则具有下面的特征: ◆语言 ◆区分大小写 ◆区分重音 ◆区分假名 要了解服务器当前使用的排序规则,可以在 SQL 查询分析器中运行 sp_helpsort 系统过程. SQL Server 7.0 不支持使用多个排序规则的数据库.因此,在 SQL Server 7.0 中创建的所有数据库均使用默认的排序规则.SQL Server 2000 支持多个排序规则.SQL Server 2000 数据库可使用

java-Java中如何把foreach中的radio存入数据库?

问题描述 Java中如何把foreach中的radio存入数据库? 问题 ${status.index+1}:${question.question } A:${question.optionA }B:${question.optionB } C:${question.optionC }D:${question.optionD } /c:if /c:forEach/c:if 解决方案 radio存入数据库?难到不是radio的值 解决方案二: 加个name属性就可以存了. 相关文章 mysql-

【图解】详细讲解Hadoop中的一个简单数据库HBase

HBase是 Hadoop中的一个简单数据库.它与Google的Bigtable特别相似,但也存在许多的不同之处. 数据模型 HBase数据库使用了和 Bigtable非常相似的数据模型.用户在表格里存储许多数据行.每个数据行都包括一个可排序的关键字,和任意数目的列.表格是稀疏的,所以同一个表格 里的行可能有非常不同的列,只要用户喜欢这样做. 列 名是"<族 名>:<标签>"形式,其中<族名>和<标签>可以是任意字符串.一个表格的<

asp中利用数组实现数据库记录的批量录入方法

数据|数据库|数组 asp中利用数组实现数据库记录的批量录入方法(原创) 演示:http://www.zwtd.com/1/yanek/n/needdj2.asp <% rem 文章题目 asp中利用数组实现数据库记录的批量录入方法(原创)作者:yanek联系email:aspboy@263.net%> 包括两个文件 1.allneeddj.asp:实现表单的生成 2. allneeddjresult.asp 处理表单批量录入 3.hbedu.mdb :数据库文件 其数据库结构如下 provi

Dom + Javascript 在本机浏览器中对的表格数据进行排序

dom|javascript|浏览器|排序|数据 在本机浏览器中对的表格数据进行排序在Web应用中,数据从服务器端返回到客户端,以表格形式表现出来.如果要对数据集按指定的列排序显示,常规做法都是向服务器发出请求,服务器端程序重新从数据库中取出按指定列排序的数据,返回给客户端,页面重新显示排序后数据. 采用这种方式有如下缺点:1- 响应时间延迟,每次排序都要向服务器端发送请求,等待结果返回,同时增加网络负载.2- 编程复杂,可维护性差,而且客户端和服务器端代码耦合度很高,客户端和服务器端都要处理排