用文本作数据处理


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 相关文章推荐
最省空间的计数器
Oct 09 PHP
PHP JS Ip地址及域名格式检测代码
Sep 27 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 PHP
php源码的安装方法和实例
Sep 26 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 09 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
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
php修改数组键名的方法示例
2017/04/15 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
React组件生命周期详解
2017/07/03 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
scrapy爬虫完整实例
2018/01/25 Python
flask-restful使用总结
2018/12/04 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
Vertbaudet西班牙网上商店:婴儿服装、童装、母婴用品和儿童家具
2019/10/16 全球购物
保安岗位职责
2014/02/21 职场文书
优质服务活动实施方案
2014/05/02 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
个人求职自荐信范文
2015/03/06 职场文书
防卫过当辩护词
2015/05/21 职场文书
交通安全温馨提示语
2015/07/14 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
vue判断按钮是否可以点击
2022/04/09 Vue.js
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python