用文本作数据处理


Posted in PHP onOctober 09, 2006

作者:redfox  邮件:ask4more@163.net   
主页:http://netnote.oso.com.cn

    相信大家在网上申请的免费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 相关文章推荐
PHP时间戳使用实例代码
Jun 07 PHP
如何在symfony中导出为CSV文件中的数据
Oct 06 PHP
深入php处理整数函数的详解
Jun 09 PHP
php curl模拟post请求小实例
Nov 13 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
2014年最新推荐的10款 PHP 开发框架
Aug 01 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
Jun 10 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
php实现用户登陆简单实例
Apr 04 PHP
详解php中curl返回false的解决办法
Mar 18 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
在线竞拍系统的PHP实现框架(二)
Oct 09 #PHP
php中的时间处理
Oct 09 #PHP
用php写的serv-u的web申请账号的程序
Oct 09 #PHP
PHP系统流量分析的程序
Oct 09 #PHP
PHP的栏目导航程序
Oct 09 #PHP
php的计数器程序
Oct 09 #PHP
PHP的开合式多级菜单程序
Oct 09 #PHP
You might like
使用php重新实现PHP脚本引擎内置函数
2007/03/06 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
前端面试知识点目录一览
2019/04/15 Javascript
Node.js中console.log()输出彩色字体的方法示例
2019/12/01 Javascript
全面了解python字符串和字典
2016/07/07 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
python批量获取html内body内容的实例
2019/01/02 Python
介绍一下Linux中的链接
2016/06/05 面试题
校园网站的创业计划书范文
2013/12/30 职场文书
安全月宣传标语
2014/10/07 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
新学期主题班会
2015/08/17 职场文书
小学四年级作文之写景
2019/08/23 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android