喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

上一主题 下一主题
 11  1/2  1  2  > 
     
标题: [原创]用xml做数据库的类  
 
loking
新手上路
Rank: 1
初级会员



UID 66571
精华 0
积分 25
帖子 27
金钱 25 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2005-9-11
来自 捂裆衫
状态 离线
[原创]用xml做数据库的类

近日给自己的站做了个在线统计,用xml存储数据。写了下面这个类,欢迎大家指正。

<?php
/******************************************************************************************
*                                                                                                               *
* 文件名: xml.php                                                                                             *
* 作  用: xml类,完善中,暂只支持三级节点                                                                                                         *
*                                                                                                                                                                                 *
* 作  者: loking(biyees)                                                                                                                                           *
* Email:  [email]biyees@gmail.com[/email]  QQ:4967530                                                                                       *
*                                                                                                                                                                                 *
* example 读取数据:                                                                                                                                              * 
* $xml = new xml("dbase.xml",'table');                                                                                                                     * 
* $data=$xml->xml_fetch_array();                                                                                                                          *
* echo "<pre style=\"font-size:12px;\">";                                                                                                               *
* print_r($data);                                                                                                                                                        * 
*                                                                                                                                                                                 *
******************************************************************************************/
class xml 
{
    var 
$dbase;       //数据库,要读取的XML文件
    
var $dbname;      //数据库名称,顶层元素,与数据库文件名称一致
    
var $dbtable;     //数据表,要取得的节点
    
var $parser;      //剖析器    
    
var $vals;        //属性
    
var $index;       //索引
    
var $dbtable_array;//节点数组
    
var $array;        //下级节点的数组
    
var $result;       //返回的结果
    
var $querys;      

    function 
xml($dbase,$dbtable)
    {
        
$this->dbase=$dbase;
        
$this->dbname=substr($dbase,strrpos($dbase,"/")+1,-4);
        
$this->dbtable=$dbtable;
        
$data=$this->ReadXml($this->dbase);
        if(!
$data){
            die(
"无法读取 $this->dbname.xml");
        }
        
$this->parser xml_parser_create();
        
xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);
        
xml_parser_set_option($this->parser,XML_OPTION_SKIP_WHITE,1);
        
xml_parse_into_struct($this->parser,$data,$this->vals,$this->index);        
        
xml_parser_free($this->parser);
        
//遍历索引,筛选出要取值的节点 节点名:$dbtable
        
foreach ($this->index as $key=>$val) {
            if (
$key == $this->dbtable) {
                
//取得节点数组
                
$this->dbtable_array $val;    
            } else {
                continue;
            }
        }
        for (
$i=0$i count($this->dbtable_array); $i+=2) {
            
$offset $this->dbtable_array[$i] + 1;                    
            
$len    $this->dbtable_array[$i 1] - $offset;
            
//array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。
            //所取节点下级数组
            
$value=array_slice($this->vals,$offset,$len);
            
//取得有效数组,合并为结果数组
            
$this->array[]=$this->parseEFF($value);
        }
        return 
true;
    }
    
//将XML文件读入并返回字符串
    
function ReadXml($file)
    {
        return 
file_get_contents($file);
    }    
    
//取得有效数组
    
function parseEFF($effective) {
        for (
$i=0$i count($effective); $i++){
            
$effect[$effective[$i]["tag"]] = $effective[$i]["value"];
        }
        return 
$effect;
    }
    
//xml_query(方法,条件,多条件时逻辑运算符and or or,插入或更新的数组)
    
function xml_query($method,$condition,$if='and',$array=array())
    {
        if((
$method=='select')||($method=='count')){
            return 
$this->xml_select($method,$condition,$if);
        } elseif(
$method=='insert') {
            return 
$this->xml_insert($condition,$if,$array);
        } elseif(
$method=='update') {
            return 
$this->xml_update($condition,$if,$array);
        }
    }
    
//取得xml数组
    
function xml_fetch_array($condition,$if)
    { 
        
//$this->querys++;
        
$row $this->array;    //初始化数据数组
        
if($condition) {
            
//是否有条件,如有条件则生成符合条件的数组
            //生成条件数组,条件格式 field,operator,match
            
$condition=explode(",",$condition);//条件数组
            
$cs=count($condition)/3;           //条件数
            
for($i=0;$i<$cs;$i++){
                
$conditions[]=array("field"=>$condition[$i*3],"operator"=>$condition[$i*3+1],"match"=>$condition[$i*3+2]);
            }
            
//echo count($row);
            
for($r=0;$r<count($row);$r++){
                for(
$c=0;$c<$cs;$c++){
                    
//$i++;
                    
$condition=$conditions[$c];         //当前条件
                    
$field=$condition['field'];      //字段
                    
$operator=$condition["operator"];//运算符
                    
$match=$condition['match'];      //匹配            
                    
if(($operator=='=')&&($row[$r][$field]==$match)){
                        
$true++;//若条件符合,符合数加1    
                    
} elseif(($operator=='!=')&&($row[$r][$field]!=$match)){
                        
$true++;//若条件符合,符合数加1
                    
} elseif(($operator=='<')&&($row[$r][$field]<$match)){
                        
$true++;//若条件符合,符合数加1
                    
} elseif(($operator=='<=')&&($row[$r][$field]<=$match)){
                        
$true++;//若条件符合,符合数加1
                    
} elseif(($operator=='>')&&($row[$r][$field]>$match)){
                        
$true++;//若条件符合,符合数加1
                    
} elseif(($operator=='>')&&($row[$r][$field]>=$match)){
                        
$true++;//若条件符合,符合数加1
                    
}                    
                }                
                
//根据条件取值
                
if($if=='and'){
                    
//如果多条件为and,当符合数等于条件数时,生成数组
                    
if($true==$cs){
                        
$result[]=$row[$r];
                    }
                } else {
                    
//如果多条件为or,当有符合纪录时,生成数组
                    
if($true!=0){
                        
$result[]=$row[$r];
                    }
                }
                
//echo $true;
                //echo "<pre style=\"font-size:12px;text-align:left\">";
                //print_r($true);
                
$true=0;//符合条件数归零,进入下一轮循环
            
}
        } else {
            
$result=$this->array;
        }    
        
//echo "<pre style=\"font-size:12px;text-align:left\">";
        //print_r($this->result);
        
return $result;
    }
    
//筛选或统计
    
function xml_select($method,$condition,$if)
    {
        
$result=$this->xml_fetch_array($condition,$if);
        if(
$method=='select'){
            return 
$result;
        } else {
            return 
count($result);
        }
        
    }
    
//插入数据
    
function xml_insert($condition,$if,$array)
    {
        
$data=$this->xml_fetch_array($condition,$if);//总数据数组
        
$data[]=$array;                              //插入后的总数据数组
        
$this->array=$data;                          //更新总数组
        
$this->WriteXml($data);
    }

    
//得到更新的XML并改写
    
function xml_update($condition,$if,$array)
    {
        
$datas=$this->array;                              //总数据数组
        
$subtract=$this->xml_fetch_array($condition,$if);//要更新的数组
        //echo "<pre style=\"font-size:12px;text-align:left\">";
        //print_r($data);
        //print_r($datas);
        //echo "每条记录中有".count($datas[0])."个值<br>";
        
for($i=0;$i<count($datas);$i++){
            
$data=$datas[$i];
            
//echo "原始记录中的第".$i."条<br>";
            
foreach($data as $k=>$v){
                
//echo "-第".$i."条的".$k."值为".$v."<br>";
                //echo "--要查找的数组".$k."值为".$subtract[0][$k]."<br>";
                
if($v==$subtract[0][$k]){
                    
$is++;
                }            
            }
            if(
$is==count($data)){
                
//echo "----与第".$i."条符合<br>";
                
$datas[$i]=$array;
                
//array_splice($datas,$i,$i+1);
            
}
            
//echo "原始记录中的第".$i."条与要查找的有".$is."匹配<br>";                
            //echo "原始记录中的第".$i."条结束<br>";
            
$is=0;
        }
        
//array_splice($datas,2,2+1,$array);
        //echo "<pre style=\"font-size:12px;text-align:left\">";
        //print_r($datas);
        
$this->array=$datas;
        
$this->WriteXml($datas);
        
    }
    
//写入XML文件(全部写入)
    
function WriteXml($array)
    {
        if(!
is_writeable($this->dbase)){
            die(
"无法写入".$this->dbname.".xml");
        }
        
$xml.="<?xml version=\"1.0\" encoding=\"utf-8\"?>rn";
        
$xml.="<$this->dbname>rn";
        for(
$i=0;$i<count($array);$i++){
            
$xml.="<$this->dbtable>rn";
            foreach(
$array[$i] as $k=>$s){
                
$xml.="<$k>$s</$k>rn";
            }
            
$xml.="</$this->dbtable>rn";
        }
        
$xml.="</$this->dbname>";
        
$fp=@fopen($this->dbase,"w");
        
flock($fpLOCK_EX);
        
rewind($fp);        
        
fputs($fp,$xml);
        
fclose($fp);
    }
    
//逐行写入xml(我试着写入10000行,感觉没一次写入快,所以没用这种写入方式)
    
function WriteLine($array)
    {
        if(!
is_writeable($this->dbase)){
            die(
"无法写入".$this->dbname.".xml");
        }
        
$fp=@fopen($this->dbase,"w");
        
rewind($fp);
        
flock($fpLOCK_EX);
        
fputs($fp,"<?xml version=\"1.0\" encoding=\"utf-8\"?>rn");
        
fputs($fp,"<$this->dbname>rn");
        for(
$i=0;$i<count($array);$i++){
            
fputs($fp,"<$this->dbtable>rn");
            
$xml.="<$this->dbtable>rn";
            foreach(
$array[$i] as $k=>$s){
                
fputs($fp,"<$k>$s</$k>rn");
            }
            
fputs($fp,"</$this->dbtable>rn");
        }
        
fputs($fp,"</$this->dbname>");
        
fclose($fp);
    }
}
?>
[ 本帖最后由 loking 于 2006-8-12 02:06 PM 编辑 ]
2006-8-12 01:49 PM#1
查看资料  访问主页  发短消息  QQ  顶部
 
loking
新手上路
Rank: 1
初级会员



UID 66571
精华 0
积分 25
帖子 27
金钱 25 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2005-9-11
来自 捂裆衫
状态 离线
[推荐阅读] [北京]luna图形科技工作室招聘(PHP,C++,美工)
example

在线统计,xml如下

<?xml version="1.0" encoding="utf-8"?>
<online>
<visitor>
<id>2006081388491</id>
<uid>1</uid>
<member>loking</member>
<gid>1</gid>
<group>system</group>
<time>1155447026</time>
<url>http://localhost:8080/yyhsorg/?//</url>
<page>校友网首页</page>
<ipaddress>127.0.0.1</ipaddress>
</visitor>
<visitor>
<id>2006081336221</id>
<uid>0</uid>
<member>guest</member>
<gid>0</gid>
<group>guest</group>
<time>1155447033</time>
<url>http://219.139.*.*:8080/yyhsorg/?//</url>
<page>校友网首页</page>
<ipaddress>219.139.*.*</ipaddress>
</visitor>
</online>


<?php
$file
='online.xml';
$online=array("id"=>$onlineid,"uid"=>$this->uid,"member"=>$this->userid,"gid"=>$this->gid,"group"=>$this->group,"time"=>time(),"url"=>$this->pageurl,"page"=>$this->pagename,"ipaddress"=>$ip);//在线用户
$xml=new xml($file,'visitor');
$onlines=$xml->xml_query("select",'time,>,'.$onlinetime,'and');//在线人数数组,其中'time,>,$onlinetime'是条件,取出在时间范围内的数组
if(!$onlines){
    
$xml->xml_query("insert",'time,>,'.$onlinetime,'',$online);//没有的情况下插入新数组(插入自己)
    
$online_num=1;//在线1人
} else {
 $my=$xml->xml_query("count",'id,=,'.$onlineid.',time,>,'.$onlinetime,'and');//看自己是否处于在线列表中,这里用的count方法
 if($my!=0){
        
$xml->xml_query("update",'id,=,'.$onlineid.',time,>,'.$onlinetime,'and',$online);//如在线则更新
        
$online_num=count($onlines);//返回在线人数
   
} else {
       
$xml->xml_query("insert",'','',$online);//如不在线,则插入新数组
       
$online_num=count($onlines)+1;//在原在线人数上+1
}
?>
2006-8-12 02:01 PM#2
查看资料  访问主页  发短消息  QQ  顶部
 
loking
新手上路
Rank: 1
初级会员



UID 66571
精华 0
积分 25
帖子 27
金钱 25 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2005-9-11
来自 捂裆衫
状态 离线
[推荐阅读] 求助:mysql数据丢失问题
最后AD一下,欢迎加入本群14222652
2006-8-12 02:04 PM#3
查看资料  访问主页  发短消息  QQ  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 如何获得当前文件的路径
怎么给出的代码不能用?



五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-8-12 02:59 PM#4
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
loking
新手上路
Rank: 1
初级会员



UID 66571
精华 0
积分 25
帖子 27
金钱 25 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2005-9-11
来自 捂裆衫
状态 离线
[推荐阅读] 关于输出的问题!
$online=array("id"=>$onlineid,"uid"=>$this->uid,"member"=>$this->userid,"gid"=>$this->gid,"group"=>$this->group,"time"=>time(),"url"=>$this->pageurl,"page"=>$this->pagename,"ipaddress"=>$ip);//在线用户
这个数组及几个query条件是在我自己定义好的,所以例子只能用在我的系统中。

以下是基本方法

<?php
$xml
=new xml('data.xml');
$array=xml_query('select','',,'');//select方法,取得数组
$result=xml_query(count,'','');//count方法,取得统计数
$insert=xml_query('insert','','',$newarray);//insert方法,插入新数据(数组)
$update=xml_query('update','','',$newarray)//update方法,更新数据(数组
?>
[ 本帖最后由 loking 于 2006-8-12 04:32 PM 编辑 ]
2006-8-12 04:31 PM#5
查看资料  访问主页  发短消息  QQ  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] [游戏]看看谁的姓名更厉害
菜鸟也要有理想 推荐的xml操作类不错!



五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2006-8-13 11:41 AM#6
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
loking
新手上路
Rank: 1
初级会员



UID 66571
精华 0
积分 25
帖子 27
金钱 25 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2005-9-11
来自 捂裆衫
状态 离线
[推荐阅读] 还是没弄明白!!!!也许是我说的不明白!!!
呵呵,好庞大。下载学习中



只做我想做的!
2006-8-13 02:10 PM#7
查看资料  访问主页  发短消息  QQ  顶部
 
luzhou (luzhou)
金牌会员
Rank: 6Rank: 6
资深会员



UID 22070
精华 0
积分 1048
帖子 1037
金钱 1048 喜悦币
威望 0
人脉 0
阅读权限 70
注册 2003-7-28
状态 离线
[推荐阅读] mysql_fetch_array错误
XML是非常好的技术。



自在的PHPer~
2006-8-22 08:26 PM#8
查看资料  发短消息  顶部
 
tl84 (tl84)
乞丐

初级会员



UID 49872
精华 0
积分 -1
帖子 20
金钱 -1 喜悦币
威望 0
人脉 0
阅读权限 1
注册 2004-11-15
状态 离线
[推荐阅读] 哪位高手能给我解释下url映射和生成html的区别
写的不错!!
2006-8-29 02:01 PM#9
查看资料  发短消息  QQ  顶部
 
youngerpeo
新手上路
Rank: 1
初级会员



UID 64851
精华 0
积分 8
帖子 45
金钱 8 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2005-6-20
来自 北京
状态 离线
[推荐阅读] 新浪技术社区开张迎客
下来研究一下,看样子不错
2006-8-29 04:19 PM#10
查看资料  发短消息  顶部
 11  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.063302 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP