php中用文本文件做数据库的实现方法


Posted in PHP onMarch 27, 2008

按我的经验,本人认为,以下列文件结构为最优: 
---------------------------------------------------------------------- 
文件扩展名:.php 
<? die('ACCESS DENIED!');?> 
email=ask4more@13.net & nickname=redfox & realname=阿鼎 & url=http://NetNote.oso.com.cn & ... 
... 
---------------------------------------------------------------------- 
    也许大家都看出来了,以.php做扩展名,并且文件的第一行是<? die('ACCESS DENIED!');?>,这样就有效的阻止了对数据文件的非法访问。文件的第二行的格式都是:  变量名1=值1 & 变量名2=值2 & ... 
    提出所有的变量很简单,就是用函数 parse_str(); 
例如: 
<? 
$theline="email=ask4more@13.net&nickname=redfox&realname=阿鼎&url=http://NetNote.oso.com.cn"; 
parse_str($theline);//分离出变量$email,$nickname,$realname,$url 
echo "I am $nickname,my real name is $realname<br>"; 
echo "welcome to visit my website:$url<br>"; 
echo "email me at:$email"; 
?> 
运行结果: 
I am redfox,my real name is 阿鼎 
welcome to visit my website:http://NetNote.oso.com.cn 
email me at:ask4more@13.net  

    因此,本文约定,数据文本结构为: 
---------------------------------------- 
<? die('ACCESS DENIED!');?> 
变量名1=值1 & 变量名2=值2 & ... 

文件扩展名: .php 
---------------------------------------- 

    真正的数据从第二行开始。好了,用这样的文件结构就可以很容易的实现GuestBook,BBS,甚至是社区的数据处理了:)我的主页“网络便签” http://netnote.oso.com.cn ,就是这样实现的。 
    为了方便广大网友,我编了几个函数,下面将作出必要的解释。当然你可以随便的修改和挎贝,但你必须保证功能的完整性。请将下面的代码存为 textfun.inc (当然取其它的名字也是一样的),在你要使用的文件的开始部分加入一行语句<?include("textfun.inc");?>,你就可以使用我为你编的函数了。 
下面一共一个db对象,一个函数p2row(); 

-------------textfun.inc---------------- 
<? 
class db{ 
  var $dbfile; 
  function createdb($dbName){ 
    $f=$dbName; 
    $this->$dbfile=$f; 
    $headInfo="<?die('ACCESS DENIED!');?>\n"; 
    $fp=fopen($f,"w"); 
    fputs($fp,$headInfo); 
    fclose($fp); 
    chmod($f,0777);//修改文件的模式,在Unix下也可用 
    return(1); 
  } 
  function opendb($f){ 
    $this->$dbfile=$f; 
    if(file_exists($f)){ 
      return true; 
    }else{ 
      $this->createdb($f); 
    } 
  } 
  function insertline($info){ 
    $fields=explode("|",$info); 
    while(list($key,$val)=each($fields)){ 
      $therow.="$val=\$".$val."&"; 
      $var1.="\$".$val.","; 
    } 
    $var1.='$tail'; 
    eval("global $var1;"); //为了取得环境变量 
    eval("\$therow=\"$therow\";"); 
    $fp=fopen($this->$dbfile,"a"); 
    fputs($fp,"$therow\n"); 
    fclose($fp); 
  } 
  function readall($f){ 
    if(file_exists($f)){ 
      $this->$dbfile=$f; 
      $rows=file($f); 
      for($i=1;$i<count($rows);$i++){ 
        $temp[]=$rows[$i]; 
      } 
      return $temp; 
    } 
  } 
  //以倒序的方式读入所有的数据行 
  function revread($f){ 
    if(file_exists($f)){ 
      $this->$dbfile=$f; 
      $rows=file($f); 
      $d=count($rows); 
      $j=$d-1; 
      for($i=0;$i<$d;$i++){ 
        if($i<$j){ 
          $temprow=$rows[$i]; 
          $rows[$i]=$rows[$j]; 
          $rows[$j]=$temprow; 
          $j--; 
        } 
      } 
      for($i=0;$i<count($rows)-1;$i++){  //去掉首行 
        $temp[]=$rows[$i]; 
      } 
      return $temp; 
    } 
  } 

  function close(){ 
  $this=$nothing; 
  } 

//把段落文本格式化为一行文本,便于存储 
function p2row($t){   
  $t=nl2br(stripslashes(htmlspecialchars($t))); 
  for($i=0;$i<strlen($t);$i++){ 
    $c=substr($t,$i,1); 
    if(ord($c)==10) $c=" "; 
      $tempstr.=$c; 
    } 
    return $tempstr; 
  } 
?> 
---------------------------------- 

    db是我们自定义的本文数据对象,包括六个方法:createdb(),opendb(),insertline(),readall().revread(),close(); 

db->createdb(string filename) 
用法例:<? 
    include("textfun.inc"); 
    $mydb=new db; 
           $mydb->createdb("UserInfo.php");     
    ?> 
这个方法创建了一个文件UserInfo.php,首行是<? die('ACCESS DENIED!');?> 

db->opendb(string filename) 
用法例:<? 
    include("textfun.inc"); 
    $mydb=new db; 
           $mydb->opendb("UserInfo.php"); 
    ?> 
这个方法以追加模式“打开”了数据文件UserInfo.php,如果这个文件不存在,则被创建。 
    因此,这个方法可以取代createdb()方法。(但千万别删了class db{  }里面的createdb()函数哦:P) 

db->insertline(string VarString) 
用法例:<? 
    include("textfun.inc"); 
    $theline="email=ask4more@13.net&nickname=redfox&realname=阿鼎&url=http://NetNote.oso.com.cn"; 
    parse_str($theline);//构造环境变量 
    $mydb=new db; 
           $mydb->opendb("UserInfo.php"); 
    $mydb->insertline("nickname|realname|email|url"); 
    ?> 
db->insertline()可以将形如"nickname|realname|email|url"的字符串,分离出相应的环境变量,并以本文约定的形式存入文件。 传入insertline()的参数,一定要用“|”把环境变量名连成字符串,个数不限,但千万别在前面加"$"哦,嗯,就是要形如"nickname|realname|email|url"这样的字符串  :~) 

array db->readall(string filename) 
用法例:<? 
    include("textfun.inc"); 
    $mydb=new db; 
    $allrec=$mydb->readall("UserInfo.php"); 
    ?> 
readall()方法返回除首行(<? die('ACCESS DENIED!');?>)外所有数据的数组,每行对应于数组的一个元素。 

array db->revread(string filename) 
用法例:<? 
    include("textfun.inc"); 
    $mydb=new db; 
    $allrec=$mydb->revread("UserInfo.php"); 
    ?> 
revread()方法以倒序方式读入除首行(<? die('ACCESS DENIED!');?>)外所有数据,返回数组。这对我们在编留言本等时候尤为有用。 

void db->close() 
        关闭db对象。 

好了,我们现在就用db对象编一个最简单的留言本。 
---------guestbook.php------------ 
我的留言本<p> 
<form name=form1 action=<? echo $PHP_SELF;?>> 
NickName:<input type=text name=nickname><br> 
E-Mail:<input type=text name=email><br> 
Homepage:<input type=text name=url value="http://"><br> 
Message:<textarea name=message cols=30 rows=12></textarea><p> 
<input type=submit name=Submit value=提交> 
</form> 
<? 
include("textfun.inc"); 
if($Submit){ 
  $thetime=date("Y-m-d h:m:s A"); 
  $message=p2row($message); 
  $mydb=new db; 
  $mydb->opendb("msg.php"); 
  $mydb->insertline("nickname|email|url|message|thetime"); 

  //以下读出所有的数据 
  $allrecs=$mydb->revread("msg.php"); 
  while(list($key,$theline)=each($allrecs)){ 
    parse_str($theline); 
    ?> 
    <a href="mailto:<?echo $email;?>"><?echo $nickname;?></a><?echo $thetime;?><br> 
    URL:<a href="<?echo $url;?>"><?echo $url;?></a><br> 
    Message:<br><?echo stripslashes($message);?><hr noshade size=1> 
    <? 
  } 
  $mydb->close(); 

?> 
----------------------------- 
好了,虽然这个留言本不是很美观,但主要是为了举例说明db对象的用法~:) 
本文在WIN98+PWS+PHP4下调试通过!

PHP 相关文章推荐
用PHP 4.2书写安全的脚本
Oct 09 PHP
php中获得视频时间总长度的另一种方法
Sep 15 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
Jun 24 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
Apr 15 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
Mar 07 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
May 28 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
详解PHP序列化和反序列化原理
Jan 15 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
May 12 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 PHP
Discuz! Passport 通行证整合
Mar 27 #PHP
FCKeditor添加自定义按钮
Mar 27 #PHP
php,ajax实现分页
Mar 27 #PHP
PHP 5.0对象模型深度探索之类的静态成员
Mar 27 #PHP
PHP 5.0对象模型深度探索之对象复制
Mar 27 #PHP
PHP 5.0对象模型深度探索之属性和方法
Mar 27 #PHP
php简单静态页生成过程
Mar 27 #PHP
You might like
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
javascript时间差插件分享
2016/07/18 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
简单谈谈Python中的闭包
2016/11/30 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
PyQt5每天必学之布局管理
2018/04/19 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
Python进行统计建模
2020/08/10 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
新学期红领巾广播稿
2014/01/14 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
党支部书记四风问题整改措施
2014/09/24 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
防卫过当辩护词
2015/05/21 职场文书
蜗居观后感
2015/06/11 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书