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往windows中添加用户
Dec 06 PHP
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
php多任务程序实例解析
Jul 19 PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 PHP
PHP查看当前变量类型的方法
Jul 31 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
PHP pear安装配置教程
May 14 PHP
浅析PHP7新功能及语法变化总结
Jun 17 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
Mar 09 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
详解使用php-cs-fixer格式化代码
Sep 16 PHP
php 原生分页
Apr 01 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入门速成(2)
2006/10/09 PHP
NT IIS下用ODBC连接数据库
2006/10/09 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
destoon整合UCenter图文教程
2014/06/21 PHP
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
windows下安装php的memcache模块的方法
2015/04/07 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
php解析xml方法实例详解
2015/05/12 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
Python虚拟环境Virtualenv使用教程
2015/05/18 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
python 性能优化方法小结
2017/03/31 Python
对Python中range()函数和list的比较
2018/04/19 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
什么是python的id函数
2020/06/11 Python
Numpy数组的广播机制的实现
2020/11/03 Python
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
培训感想范文
2015/08/07 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android