仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1344|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页编程之PHP中利用DBM作为数据库(包含排序)

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:17:28 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
php   manual(PHP手册)肯定是要从网上下载一个的,它很权威,也很全面,我自己认为它是一本很好的参考书,但是不适合新手当教材使用。排序|数据|数据库   在浩瀚CGI言语中,PHP以其复杂,疾速的长处入手下手逐步生长,利用PHP开辟法式的人也愈来愈多,而普通PHP用的数据库就两种:文本和MYSQL。文本数据库读、写速度慢,当数据抵达必定量时就会大大的下降速度甚至溃散!而MYSQL固然速度快,功效壮大,由于普通的收费空间都不撑持MYSQL,由于普通的收费空间都不撑持MYSQL(有主机的伴侣就不要往下看了)
明天笔者引见的是DBM数据库,DBM是柏克莱大学开展的文件/文本型数据库,在BSD体系中已装置终了,即便没有装置,在PHP4.03中也到场了DBM的撑持。因而,在大部分撑持PHP的空间中都撑持DBM(撑持PHP的空间详见www.zphp.com)上面将分步引见在PHP利用DBM做为数据库:

1、判别你的空间是不是撑持DBM的办法:
输出上面的法式:
----------------------------------------------------
<?
echo dblist();
?>
----------------------------------------------------
保留为dbmtest.php,运转,看看是不是输入函数没有界说,假如不是,祝贺……

2、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。


3、利用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)就会呈现没法遍历搜刮的成绩!

4、用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><?}?>
----------------------------------------------------

5、用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占用率)。  刚开始写页面程序,调试完书中的例子。然后就可以尝试编写留言板了,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-29 04:10

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表