欢迎来到HELLO素材网! 南京网站制作选择顺炫科技
丰富的DIV CSS模版、JS,jQuery特效免费提供下载
当前位置:主页 > 建站教程 > 服务器教程 >

带数据缓存的ACCESS数据库操作类

发表于2019-04-13 20:08| 次阅读| 来源网络整理| 作者session

摘要:带数据缓存的ACCESS数据库操作类

带数据缓存的ACCESS数据库操作类

  次要提供的性能:
  
  1,根本的常用的就不说了
  
  2,数据列表输出,除了奇偶行交替变换色彩之类的列表,其余都可能实现,支持利用函数对字段的值停止格式化输出。而且这个性能的效率应该还是能保证的,只管像是一个模板解析函数了。首先,一行的HTML代码量并不多,而解析,也仅仅是运转了一个preg_replace和str_replace就实现了,而且解析一次,在列表输出时,就不需求再次解析了,所以,此性能也仅仅就是比手动编写的多了那两个函数而已,几乎可能疏忽不计。
  
  3,分页查询,可经过类提供的一个方法,简略实现分页的查询。生成的SQL语句是我在网上找的,听说时不用存储过程最高效率的了,而ACCESS也不支持存储过程
  
  4,显示分页,提供了两种样式,一种适宜分页比较少的短样式,一种是分页比较多的长洋式,显示效果与动易CMS的分页相反,其实就是模仿动易的。
  
  5,显示分页需求的相干数据,在分页查询函数中已经实现,所以,即使不利用类提供的分页样式,也可能方便的本人订制
  
  6,数据缓存,只有要配置好,缓存门路,缓存生命周期,假设是分页查询的话,在设置一下最多缓存多少分页,就不需求再作任何的干涉,和不利用数据缓存的利用方法,接口齐全相反。利用效果我没有测试,不过应该还是可能保证的,数据缓存是数组方式的
  
  代码:
  
  以下为引用的内容:
  <?php
  classaccess
  {
  /**
  *申明存储查询后果ID的数组,数据库衔接ID,存储分页信息的数组,缓存数据读取偏移量
  */
  public$resultId,$linkId,$pageMsg,$offset;
  /**
  *声显著示谬误消息的页面地址
  */
  public$errPage='';
  /**
  *申明数据库门路,此门路需为绝对门路
  */
  public$dbPath='';
  
  /**
  *缓存存储门路
  */
  public$cachePath='';
  
  /**
  *缓存申明周期,设为0则不实用缓存
  */
  public$cacheLifeTime=3600;
  
  /**
  *当利用分页查询时,最多缓存多少页
  */
  public$cacheLimitMax=100;
  
  /**
  *建设数据库衔接
  *
  *阐明:
  *此数据库类无结构函数,在申明新类之后,需手动运转此函数
  */
  publicfunctionconnect()
  {
  $dsn='DRIVER={MicrosoftAccessDriver(*.mdb)};DBQ='.$this->dbPath;
  $this->linkId=odbc_connect($dsn,'','',SQL_CUR_USE_ODBC);
  $this->linkId||$this->setError('Connectdatabasedefeat!');
  }
  
  /**
  *执行一条SQL语句
  *
  *参数:
  *$sql要执行的SQL语句
  *$resultId查询后果的ID,当执行一条不需前往的SQL语句,如删除,更新等时,该参数可省略
  */
  publicfunctionquery($sql,$resultId='__id__')
  {
  $this->resultId[$resultId]=odbc_exec($this->linkId,$sql);
  $this->resultId[$resultId]||$this->setError('CarriesouttheSQLdefeat!');
  }
  
  /**
  *从查询后果集中读取一条记载,并前往为数组
  *
  *参数:
  *$resultId查询后果的ID
  */
  publicfunctionrecord($resultId)
  {
  if(is_array($this->resultId[$resultId]))
  {
  $offset=$this->offset[$resultId];$this->offset[$resultId];
  return$this->resultId[$resultId][$offset];
  }
  returnodbc_fetch_array($this->resultId[$resultId]);
  }
  
  /**
  *从查询后果集中读取一条记载,并注册为类的属性,属性名为字段名
  *
  *参数:
  *$resultId查询后果ID
  */
  publicfunctionrecordObj($resultId)
  {
  if(is_array($this->resultId[$resultId]))
  {
  $rowArray=$this->resultId[$resultId][$this->offset[$resultId]];
  $this->offset[$resultId];
  }else{
  $rowArray=$this->record($resultId);
  }
  for(reset($rowArray);$key=key($rowArray);next($rowArray))$this->$key=$rowArray[$key];
  }
  
  /**
  *获取一个查询后果集的记载数
  *
  *参数:
  *$resultId查询后果ID
  */
  publicfunctionrowsNum($resultId)
  {
  returnodbc_num_rows($this->resultId[$resultId]);
  }
  
  /**
  *获取表中符合条件的记载总数
  *
  *参数:
  *$table表明
  *$primary主键,提供一个主键时可提高功能
  *$condition查询条件,留空时将前往表中的记载总数
  */
  publicfunctionrowsTotal($table,$primary='*',$condition='')
  {
  $sql='select('.$primary.')from'.$table.($condition?'where'.$condition:'');
  $rowsTotal=odbc_result(odbc_exec($this->linkId,$sql),1);
  $rowsTotal>=0||$this->setError('Gainstherecordtotaldefeat!');
  return(int)$rowsTotal;
  }
  
  /**
  *监禁一个查询后果
  *
  *参数:
  *$resultId查询后果ID
  */
  publicfunctionresultFree($resultId)
  {
  odbc_free_result($this->resultId[$resultId])||$this->setError('Releaseresultdefeat!');
  }
  
  /**
  *监禁一切查询后果
  */
  publicfunctionallResultFree()
  {
  for(reset($this->resultId);$key=key($this->resultId);next($this->resultId))'__id__'==$key||$this->resultFree($key);
  }
  
  /**
  *监禁一切查询后果并关闭数据库衔接
  */
  publicfunctionclose()
  {
  $this->allResultFree();odbc_close($this->linkId);
  }
  
  /**
  *数据库查询
  *
  *参数:
  *$resultId查询后果ID
  *$table所要查询的数据表
  *$fields需求前往的字段,省略时将前往一切字段
  *$condition查询条件,省略时,将前往表中的一切记载
  */
  publicfunctionselect($resultId,$table,$fields='*',$condition='')
  {
  if($this->cacheLifeTime)
  {
  $cachePath=$this->cachePath.$table.md5($fields.$condition).'.php';
  if(time()-@filemtime($cachePath)<$this->cacheLifeTime)
  {
  include$cachePath;$this->resultId[$resultId]=$dataCache;
  $this->offset[$resultId]=0;return;
  }else{
  $writeCache=true;
  }
  }
  $condition&&$condition='order'==substr($condition,0,6)?$condition:'where'.$condition;
  $this->query('select'.$fields.'from'.$table.$condition,$resultId);
  $writeCache&&$this->writeCache($cachePath,$resultId);
  }
  
  /**
  *插入记载
  *
  *参数:
  *$table表明
  *$rowArray二维数组,索引为字段名
  */
  publicfunctioninsert($table,$rowArray)
  {
  $fields=$values='';
  for(reset($rowArray);$key=key($rowArray);next($rowArray))
  {
  $fields.=','.$key;$values.=',\''.$rowArray[$key].'\'';
  }
  $this->query('insertinto'.$table.'('.substr($fields,1).')values('.substr($values,1).')');
  }
  
  /**
  *更新一条记载
  *
  *参数:
  *$table表名
  *$rowArray二维数组,索引为字段名
  *$condition更新条件
  */
  publicfunctionupdate($table,$rowArray,$condition)
  {
  $fields='';
  for(reset($rowArray);$key=key($rowArray);next($rowArray))$fields.=','.$key.'=\''.$rowArray[$key].'\'';
  $this->query('update'.$table.'set'.substr($fields,1).'where'.$condition);
  }
  
  /**
  *删除记载
  *
  *参数:
  *$table表明
  *$condition删除条件,当省略时,删除表中的一切记载
  */
  publicfunctiondelete($table,$condition='')
  {
  $this->query('deletefrom'.$table.($condition?'where'.$condition:''));
  }
  
  /**
  *输出数据列表
  *
  *参数:
  *$resultId查询后果ID
  *$rowHtml列表的行HTML代码
  *$everyOther每隔几行插入$insertHtml
  *$insertHtml需求插入的HTML
  *
  *$rowHtml的编写规则:
  *<td>{$name}</td><td>{date('Y-m-d',strtotime($addtime))}</td>
  *需求输出的字段或用来格式化字段的函数需用{和}包括
  *变量名利用字段名
  */
  publicfunctiondisplayList($resultId,$rowHtml,$everyOther='',$insertHtml='')
  {
  $rowHtml=preg_replace('/\$([A-Za-z0-9_])/','$rowArray[\'\\1\']',$rowHtml);
  $rowHtml='echo\''.str_replace(array('{','}'),array('\',',',\''),$rowHtml).'\'';
  $i=1;
  while($rowArray=$this->record($resultId))
  {
  eval($rowHtml);
  if($everyOther==$i){echo$insertHtml;$i=1;}
  $i=$i1;
  }
  }
  
  /**
  *分页查询函数
  *
  *参数:
  *$resultId查询后果ID
  *$table所要查询的数据表名
  *$fields需求前往的字段
  *$primary用来排序的字段
  *$page查询第几页
  *$pageSize每页记载数
  *$condition查询条件,默以为空
  *$order排序模式,0为正序,1为倒序,默以为1
  *
  *阐明:
  *此函数会将与分页相干的信息存储于$this->pageMsg[$resultId]中
  *这是一个一维数组,具备5个值,分别为:记载总数,总页数,以后页记载数,以后第几页,每页多少条记载
  *可应用这些信息编写本人的分页样式,不需另外计算
  */
  publicfunctionlimit($resultId,$table,$fields,$primary,$page,$pageSize,$condition='',$order=1)
  {
  isset($this->pageMsg[$resultId][0])||$this->pageMsg[$resultId][0]=$this->rowsTotal($table,$primary,$condition);
  $this->pageMsg[$resultId][1]=ceil($this->pageMsg[$resultId][0]/$pageSize);
  $page>$this->pageMsg[$resultId][1]&&$page=$this->pageMsg[$resultId][1];
  $this->pageMsg[$resultId][2]=$page==$this->pageMsg[$resultId][1]?($this->pageMsg[$resultId][0]-($page-1)*$pageSize):$pageSize;
  $this->pageMsg[$resultId][3]=$page;
  $this->pageMsg[$resultId][4]=$pageSize;
  if($this->cacheLifeTime&&$page<=$this->cacheLimitMax)
  {
  $cachePath=$this->cachePath.$table.'_'.$page.'.php';
  if(time()-@filemtime($cachePath)<$this->cacheLifeTime)
  {
  include$cachePath;$this->resultId[$resultId]=$dataCache;
  $this->offset[$resultId]=0;return;
  }else$writeCache=true;
  }
  if($order)
  {
  $mark='<';$min='min';$order='orderby'.$primary.'desc';
  }else{
  $mark='>';$min='max';$order='';
  }
  $sql='selecttop'.$this->pageMsg[$resultId][2].''.$fields.'from'.$table;
  if(1==$page)
  {
  $sql.=($condition?'where'.$condition:'').$order;
  }else{
  $sql.='where'.$primary.$mark.'(select'.$min.'('.$primary.')from(selecttop'.($page-1)*$pageSize;
  $sql.=''.$primary.'from'.$table.$order.'))'.($condition?'and'.$condition:'').$order;
  }
  $this->query($sql,$resultId);
  $writeCache&&$this->writeCache($cachePath,$resultId);
  }
  
  publicfunctiondisplayLimit($resultId,$linkHtml,$style=2,$recordName='条记载')
  {
  if(2==$style)
  {
  echo'共&nbsp;<strong>',$this->pageMsg[$resultId][0],'</strong>&nbsp;',$recordName,'';
  }
  echo'<ahref=',str_replace('*','1',$linkHtml),'>首页</a>&nbsp;';
  if(1==$this->pageMsg[$resultId][3])
  {
  echo'上一页&nbsp;';
  }else{
  echo'<ahref=',strtr('*',$this->pageMsg[$resultId][3]-1,$linkHtml),'>上一页</a>&nbsp;';
  }
  if($this->pageMsg[$resultId][3]==$this->pageMsg[$resultId][1])
  {
  echo'下一页';
  }else{
  echo'<ahref=',strtr('*',$this->pageMsg[$resultId][3]1,$linkHtml),'>下一页</a>';
  }
  echo'&nbsp;<ahref=',strtr('*',$this->pageMsg[$resultId][1],$linkHtml);
  echo'>尾页</a>&nbsp;页次:<strong><fontcolor=#ff0000>';
  echo$this->pageMsg[$resultId][3],'</font>/',$this->pageMsg[$resultId][1],'</strong>页';
  if(2==$style)
  {
  echo'<strong>',$this->pageMsg[$resultId]['e'],'</strong>',$recordName,'/页&nbsp;转到';
  echo':<selectname=pagesize=1onchange="javascript:window.location=';
  echo'this.options[this.selectedIndex].value;"style=font-size:12px;height=18px>';
  for($i=1;$i<=$this->pageMsg[$resultId][1];$i)
  {
  echo'<optionvalue=\'',strtr('*',$i,$linkHtml);
  echo$this->pageMsg[$resultId][3]==$i?'\'selected':'\'','>第',$i,'页</option>';
  }
  echo'</select>';
  }
  }
  
  /**
  *将查询后果输入缓存
  *
  *参数:
  *$cachePath缓存门路
  *$resultId查询后果ID
  */
  privatefunctionwriteCache($cachePath,$resultId)
  {
  $cacheContent='';
  while($rowArray=odbc_fetch_array($this->resultId[$resultId]))
  {
  $cacheContent.='$dataCache[]=array('.$this->rowToStr($rowArray).');';
  }
  file_put_contents($cachePath,'<?php'.$cacheContent.'?>');
  include$cachePath;$this->resultId[$resultId]=$dataCache;
  $this->offset[$resultId]=0;
  }
  
  /**
  *将数组转换为一个二维数组构造的字符串
  *
  *参数:
  *$rowArray数组
  */
  privatefunctionrowToStr($rowArray)
  {
  for(reset($rowArray);$key=key($rowArray);next($rowArray))
  {
  $rowStr.=',\''.$key.'\'=>\''.strtr($rowArray[$key],'\'','\\\'').'\'';
  }
  returnsubstr($rowStr,1);
  }
  
  /**
  *调用谬误消息页面,实现谬误消息的显示
  *
  *参数:
  *$msg谬误消息
  */
  publicfunctionsetError($msg)
  {
  include$this->errPage;
  }
  }
  ?>