带数据缓存的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'共 <strong>',$this->pageMsg[$resultId][0],'</strong> ',$recordName,'';
}
echo'<ahref=',str_replace('*','1',$linkHtml),'>首页</a> ';
if(1==$this->pageMsg[$resultId][3])
{
echo'上一页 ';
}else{
echo'<ahref=',strtr('*',$this->pageMsg[$resultId][3]-1,$linkHtml),'>上一页</a> ';
}
if($this->pageMsg[$resultId][3]==$this->pageMsg[$resultId][1])
{
echo'下一页';
}else{
echo'<ahref=',strtr('*',$this->pageMsg[$resultId][3]1,$linkHtml),'>下一页</a>';
}
echo' <ahref=',strtr('*',$this->pageMsg[$resultId][1],$linkHtml);
echo'>尾页</a> 页次:<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,'/页 转到';
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;
}
}
?>