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

2015-01-24信息快讯网

相信大家在网上申请的免费PHP空间,如果是初级用户,一般都是没得MySQL可供使用,那么我们解决数据处理的方法之一就是用文本文件了。但是用什么方法才可以最快最方便的处理文本数据呢?

按我的经验,本人认为,以下列文件结构为最优: 
---------------------------------------------------------------------- 
文件扩展名:.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 strtok()函数的优点分析
关于PHP5 Session生命周期介绍
PHP正则的Unknown Modifier错误解决方法
php is_file()和is_dir()用于遍历目录时用法注意事项
php 读取shell管道传输过来的内容
php 连接mssql数据库 初学php笔记
php下使用SimpleXML 处理XML 文件
PHP 导出数据到淘宝助手CSV的方法分享
php 用checkbox一次性删除多条记录的方法
PHP实现域名whois查询的代码(数据源万网、新网)
PHP 伪静态隐藏传递参数名的四种方法
PHP+ajax 无刷新删除数据
php 读取文件乱码问题
两个开源的Php输出Excel文件类
php 处理上百万条的数据库如何提高处理查询速度
php下把数组保存为文件格式的实例应用
php 获取当前访问的url文件名的方法小结
PHP详细彻底学习Smarty
Discuz! Passport 通行证整合
php,ajax实现分页
PHP 5.0对象模型深度探索之类的静态成员
PHP 5.0对象模型深度探索之对象复制
PHP 5.0对象模型深度探索之属性和方法
php简单静态页生成过程
PHP连接access数据库
MySQL修改密码方法总结
常用的php ADODB使用方法集锦
php获取mysql版本的几种方法小结
php实现mysql数据库备份类
php项目打包方法
asp和php下textarea提交大量数据发生丢失的解决方法
支持php4、php5的mysql数据库操作类
在PHP中使用Sockets 从Usenet中获取文件
PHP读取目录下所有文件的代码
最简便的MySql数据库备份方法MySQLdump第1/2页
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
PHP 文件上传进度条的两种实现方法的代码
php在线生成ico文件的代码
©2014-2024 dbsqp.com