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 相关文章推荐
用Socket发送电子邮件(利用需要验证的SMTP服务器)
Oct 09 PHP
php htmlspecialchars加强版
Feb 16 PHP
基于php中使用excel的简单介绍
Aug 02 PHP
php cli换行示例
Apr 22 PHP
php 伪静态之IIS篇
Jun 02 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
浅析PHP中Session可能会引起并发问题
Jul 23 PHP
变量在 PHP7 内部的实现(一)
Dec 21 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
Apr 18 PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
php提供实现反射的方法和实例代码
Sep 17 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获取网络文件的实现代码
2010/01/01 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
Django保护敏感信息的方法示例
2019/05/09 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python区分不同数据类型的方法
2019/10/14 Python
用python写爬虫简单吗
2020/07/28 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
C#笔试题和英文面试题
2013/02/07 面试题
Linux文件操作命令都有哪些
2015/02/27 面试题
满月酒邀请函
2015/01/30 职场文书
Python实现排序方法常见的四种
2021/07/15 Python
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis
Python matplotlib多个子图绘制整合
2022/04/13 Python