用文本作数据处理


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中的多态性[译]
Aug 02 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 PHP
四个PHP非常实用的功能
Sep 29 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 PHP
PHP常用文件操作函数和简单实例分析
Jun 03 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
php魔术方法功能与用法实例分析
Oct 19 PHP
php版阿里云OSS图片上传类详解
Dec 01 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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 array_flip() 删除数组重复元素
2009/01/14 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
跟我学习javascript的隐式强制转换
2015/11/16 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
2016/04/08 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
javascript实现滚轮轮播图片
2020/12/13 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
详解python中的文件与目录操作
2017/07/11 Python
python xlsxwriter创建excel图表的方法
2018/06/11 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
学生检讨书范文
2015/01/27 职场文书
追悼会家属答谢词
2015/09/29 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript