热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpupdatexml,php操作XML增删查改

以前写的一个数据量不大的小网站用到的,用xml代替数据库的玩意,献丑了这短代码的执行效率太低了。循环插入1000条数据会超时。[代码][PHP]代码cl

以前写的一个数据量不大的小网站用到的,用xml代替数据库的玩意,献丑了

这短代码的执行效率太低了。循环插入1000条数据 会超时。

[代码][PHP]代码class XMLDataBase extends DomDocument{

var $dbname; //属性 数据库文件名 同根元素名称

var $dbpath; //属性 数据库路径

//var $debug; //属性 调试标志

var $debug=true;//开启调试模式

public function XMLDataBase($dbname,$dbpath){ //构造函数

if(empty($dbname)){

if($this->debug)echo "创建数据库文件失败,请检查实例参数";

return false;

}else{

$this->dbname = $dbname; //将数据库命名为指定名称

$this->dbpath = $dbpath; //为数据指定路径

if(!file_exists($dbpath."/".$this->dbname.".xml")){ //如果没有数据库文件

$xmlstr = 'dbname.' sn="0"/>';

$this->loadXML($xmlstr);

$this->save($dbpath."/".$this->dbname.".xml"); //创建数据库文件

}

$this->load($dbpath."/".$this->dbname.".xml"); //加载数据库文件

}

return true;

}

//插入数据

public function insert_xml($myfields,$values,$mytype){

if(empty($mytype)){ //如果类型为空,返回跟节点

$Root = $this->documentElement;

}else{

$Root = $this->getElementsByTagName($mytype); //取得$mytype节点

$Root = $Root->item(0);

if(empty($Root->nodeValue)){ //判断$mytype节点为空则建立之, empty() 这个变量存在吗?不存在就对了!!

$this->InserTabeNode($mytype);

$Root = $this->getElementsByTagName($mytype);

$Root = $Root->item(0);

}

}

$arrfield = explode("#cut#", $myfields);

$arrval = explode("#cut#", $values);

//获取插入记录

$AutoID = $this->AutoKey();

$Node_AutoID= $this->createElement("autoid");

$text= $this->createTextNode($AutoID);

$Node_AutoID->appendChild($text);

$i=0;

foreach($arrfield as $myfield){

${$node}=$arrval[$i];

${"Node_".$myfield} = $this->createElement($myfield);

$text = $this->createTextNode(${$node});

${"Node_".$myfield}->appendChild($text);

$i++;

}

//建立一条记录

$Node_record = $this->createElement("record");

$Node_record->appendChild($Node_AutoID);

foreach($arrfield as $fieldn){

$Node_record->appendChild(${"Node_".$fieldn});

}

//加入到$dbtable结点下

$Root->appendChild($Node_record);

//更新 根节点SN

$this->documentElement->setAttribute("sn","$AutoID");

//保存

$this->save($this->dbpath."/".$this->dbname.".xml");

return true;

}

//修改记录

public function update_xml($AutoID,$mytype){

if(empty($mytype)){ //如果类型为空,返回跟节点

$Root = $this->documentElement;

$xpath = new DOMXPath($this);

$Node_Record = $xpath->query("//record[autoid=$AutoID]");

}else{

$Root = $this->getElementsByTagName($mytype); //取得$mytype节点

$Root = $Root->item(0);

$xpath = new DOMXPath($this);

$Node_Record = $xpath->query("/$this->dbname/$mytype/record[autoid=$AutoID]");

}//end if

if(empty($Node_Record->item(0)->nodeName)) echo "没有查询到要修改的记录\r\n";

$K=0;

foreach ($Node_Record->item($i)->childNodes as $articles){

$Field[$K]=$articles->textContent;

echo "$articles->nodeName\r\n";

$K++;

}

}

//保存记录

public function besave_xml($AutoID,$values,$mytype){

if(empty($mytype)){ //如果类型为空,返回跟节点

$Root = $this->documentElement;

$xpath = new DOMXPath($this);

$Node_Record = $xpath->query("//record[autoid=$AutoID]");

}else{

$Root = $this->getElementsByTagName($mytype); //取得$mytype节点

$Root = $Root->item(0);

$xpath = new DOMXPath($this);

$Node_Record = $xpath->query("/$this->dbname/$mytype/record[autoid=$AutoID]");

}//end if

if(empty($Node_Record->item(0)->nodeValue)){ //如果记录不存在

if($this->debug)echo "AutoID={$AutoID}的记录不存在于{$mytype}节点中,请检查传入参数!";

return false;

}

$Replace = explode("#cut#", $values);

$temparr=array_reverse($Replace);

//array_push($temparr,$AutoID);

$temparr[]=$AutoID; //用 array_push() 来给数组增加一个单元,还不如用 $array[] = ,因为这样没有调用函数的额外负担。 --By PHP Manual

$Replace=array_reverse($temparr);

$K=0;

//修改

foreach ($Node_Record->item(0)->childNodes as $articles){

$Node_newText = $this->createTextNode($Replace[$K]);

$articles->replaceChild($Node_newText,$articles->lastChild);//*************** 有点疑问

$K++;

}

$this->save($this->dbpath."/".$this->dbname.".xml");

return true;

}

//筛选或者统计

public function select_xml($sfield,$keyword,$mytype,$rows,$isonly){

//$sfield 指定字段 $mytype分类名称 $rows循环输出时指定记录条数 $isonly判断指定关键字记录是否存在

if($sfield == '') $sfield='autoid'; //设定字段默认值

//if($keyword=='') $keyword='1';

$xpath = new DOMXPath($this);

//if(empty($keyword)) return 0;

if($mytype == ''){

$querystr = "//record[contains($sfield,'$keyword')]";

$Node_Record = $xpath->query($querystr);

}else{

$querystr = "/$this->dbname/$mytype/record[contains($sfield,'$keyword')]";

$Node_Record = $xpath->query($querystr);

}//end if

$Node_Record_Length = $Node_Record->length; //取得记录总数

if($isonly==1){

if($Node_Record_Length>0) return 999;

}

//循环输出字段及其内容

if($Node_Record_Length <1) return 0;

$rerows &#61; array(); //记录集数组

$rerow &#61; array(); //单条记录数组

for($i&#61;0;$iitem($i)->childNodes as $articles){

$Field[$K]&#61;$articles->textContent;

$rerow["$articles->nodeName"] &#61; $Field[$K]; //节点名 &#61;> 节点值 推入数组

$K&#43;&#43;;

}

$rerows[$i]&#61;$rerow;

}//for end

//不知道还有没有更好的方法反序结果

$echorows&#61;array_reverse($rerows); //反序排列返回的数组

$countall&#61;count($echorows); //统计数组记录总数

if($rows>0)$countall&#61;$rows; //如果指定行数 更改数据总数

if($rows>count($echorows))$countall&#61;count($echorows); //如果指定行数大于总数 则总数不变

$myrs&#61;array(); //新建的记录集数组

for($j&#61;0;$jdocumentElement;

$xpath &#61; new DOMXPath($this);

$Node_Record &#61; $xpath->query("//record[autoid&#61;$AutoID]");

}else{

$Root &#61; $this->getElementsByTagName($mytype); //取得$mytype节点

$Root &#61; $Root->item(0);

$xpath &#61; new DOMXPath($this);

$Node_Record &#61; $xpath->query("/$this->dbname/$mytype/record[autoid&#61;$AutoID]");

}

//查询选择删除的记录

if(empty($Node_Record->item(0)->nodeValue)){ //如果记录不存在

if($this->debug)echo "AutoID&#61;{$AutoID}的记录不存在于{$mytype}节点中&#xff0c;请检查传入参数&#xff01;"; //输出相应信息

return false; //返回假

}

$Root->removeChild($Node_Record->item(0)); //在节点中移除

$this->save($this->dbpath."/".$this->dbname.".xml");

return true; //返回真

}

//插入类别节点

public function InserTabeNode($mytype){

$Root &#61; $this->documentElement;

$Node_record &#61; $this->createElement($mytype);

$Root->appendChild($Node_record);

$this->save($this->dbpath."/".$this->dbname.".xml");

}

public function AutoKey(){ //产生自增流水号

//读取根节点sn属性

$Root &#61; $this->documentElement;

if($Root->hasAttributes()) $attributes &#61; $Root->attributes;

$AutoKey &#61; $attributes->item(0)->nodeValue&#43;1; //sn原值增加1

return $AutoKey;

}

}//class end

//调用就类似这丫

$fields&#61;"item#cut#description#cut#quantity#cut#amount#cut#email#cut#email2#cut#paytime#cut#posttime";

$values&#61;"$item#cut#$description#cut#$quantity#cut#$amount#cut#$email#cut#$email2#cut#$paytime#cut#$posttime";

$Myxml &#61; new XMLDataBase("orderlist",XMLDATAPATH);

if($Myxml->insert_xml($fields,$values,""))

{

ShowMsg("订单发布成功&#xff01;","orderlist.php");

exit();

}

本文原创发布php中文网&#xff0c;转载请注明出处&#xff0c;感谢您的尊重&#xff01;



推荐阅读
  • 1.Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 引号快捷键_首选项和设置——自定义快捷键
    3.3自定义快捷键(CustomizingHotkeys)ChemDraw快捷键由一个XML文件定义,我们可以根据自己的需要, ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • 利用空间换时间减少时间复杂度以及以C语言字符串处理为例减少空间复杂度
    在处理字符串的过程当中,通常情况下都会逐个遍历整个字符串数组,在多个字符串的处理中,处理不同,时间复杂度不同,这里通过利用空间换时间等不同方法,以字符串处理为例来讨论几种情况:1: ... [详细]
author-avatar
小闯娃
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有