试过PHP连接ACCESS数据库没?这个用途不大,但有时候也用得着!我以前试图将一个ASP程序改写成PHP的,原程序的数据库设计得比较完善,我打算开发时就用它的ACCESS数据库 ,等程序完成后再转换。这个程序改写计划最终搁浅了,但此过程中为了方便连接ACCESS数据库,我写了个PHP连接ACCESS数据库的类,比较方便,希望有人用得着!
<?
/*
作者:夜无眠
QQ:27262681
***本类只能在win平台的服务器上使用
*/
class access{
function access( $dir ){ // 构析函数,调用.com建立数据源,链接数据库;参数为数据库文件路径
$this -> db = new com( " adodb.connection " );
$this -> db -> open( " Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " . realpath ( $dir ));
}
function sql( $sql ){ // 参数为SQL查询语句
if ( preg_match ( " /limit +([0-9]*),([0-9]*)/ " , $sql , $out )){ // 正则分析sql语句,提取limit参数,模拟MYSQL的分页
$limit1 = $out [ 1 ];
$limit2 = $out [ 2 ];
$sql = preg_replace ( " /limit +([0-9]*),([0-9]*)/ " , "" , $sql );
}
$rs = $this -> db -> execute( $sql );
if ( strpos ( $sql , " select " ) === false or strpos ( $sql , " select " ) > 5 ){ // 非查询语句直接返回空值,防止错误提示出现
return "" ;
}
if ( $limit1 == "" ){
$limit1 = 0 ;
}
if ( $limit2 == "" ){ // 如果没有limit参数,设$limit2为总记录数
$limit2 = 1000000 ;
}
$rs -> move( $limit1 ); // 记录指针移动到第$limit1条记录处
$i = 0 ;
while ( ! $rs -> eof and $i < $limit2 ){
foreach ( $rs -> fields as $rss ){
$rs_r [ $rss -> name] = $rss -> value;
}
$rs_rr [] = $rs_r ;
$rs -> move( 1 );
$i ++ ;
}
return $rs_rr ;
}
function getlist( $db , $p = "" ){ // 此函数用于将关联数组各元素处理成相关变量,第二个参数为变量名前缀,防止重名
foreach ( $db as $key => $dba ){
global ${ $p . $key };
${ $p . $key } = $dba ;
}
}
function yasuo( $dir ){ // 压缩数据库函数,本函数用access::yasuo($dir);调用,$dir为数据库文件路径,调用次函数之前必须将所有当前数据库的连接中断!
$ya = new com( " JRO.JetEngine " );
$truedir = realpath ( $dir );
$dirname = dirname ( $truedir );
$prov = " Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " ;
$ya -> CompactDatabase( $prov . $truedir , $prov . $dirname . " /aatmp.mdb " ); // 数据库所在目录必须有读写权限,否则会导致失败!
unlink ( $truedir );
rename ( $dirname . " /aatmp.mdb " , $truedir );
}
function add( $file ){ // 新建一个ACCESS数据库 参数$file为文件路径,必须为相对路径
$dir = dirname ( $_SERVER [ " SCRIPT_FILENAME " ]) . " / " . $file ;
$db = new com( " ADOX.Catalog " );
$db -> Create( " Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$dir " );
}
}
?>
/*
作者:夜无眠
QQ:27262681
***本类只能在win平台的服务器上使用
*/
class access{
function access( $dir ){ // 构析函数,调用.com建立数据源,链接数据库;参数为数据库文件路径
$this -> db = new com( " adodb.connection " );
$this -> db -> open( " Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " . realpath ( $dir ));
}
function sql( $sql ){ // 参数为SQL查询语句
if ( preg_match ( " /limit +([0-9]*),([0-9]*)/ " , $sql , $out )){ // 正则分析sql语句,提取limit参数,模拟MYSQL的分页
$limit1 = $out [ 1 ];
$limit2 = $out [ 2 ];
$sql = preg_replace ( " /limit +([0-9]*),([0-9]*)/ " , "" , $sql );
}
$rs = $this -> db -> execute( $sql );
if ( strpos ( $sql , " select " ) === false or strpos ( $sql , " select " ) > 5 ){ // 非查询语句直接返回空值,防止错误提示出现
return "" ;
}
if ( $limit1 == "" ){
$limit1 = 0 ;
}
if ( $limit2 == "" ){ // 如果没有limit参数,设$limit2为总记录数
$limit2 = 1000000 ;
}
$rs -> move( $limit1 ); // 记录指针移动到第$limit1条记录处
$i = 0 ;
while ( ! $rs -> eof and $i < $limit2 ){
foreach ( $rs -> fields as $rss ){
$rs_r [ $rss -> name] = $rss -> value;
}
$rs_rr [] = $rs_r ;
$rs -> move( 1 );
$i ++ ;
}
return $rs_rr ;
}
function getlist( $db , $p = "" ){ // 此函数用于将关联数组各元素处理成相关变量,第二个参数为变量名前缀,防止重名
foreach ( $db as $key => $dba ){
global ${ $p . $key };
${ $p . $key } = $dba ;
}
}
function yasuo( $dir ){ // 压缩数据库函数,本函数用access::yasuo($dir);调用,$dir为数据库文件路径,调用次函数之前必须将所有当前数据库的连接中断!
$ya = new com( " JRO.JetEngine " );
$truedir = realpath ( $dir );
$dirname = dirname ( $truedir );
$prov = " Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " ;
$ya -> CompactDatabase( $prov . $truedir , $prov . $dirname . " /aatmp.mdb " ); // 数据库所在目录必须有读写权限,否则会导致失败!
unlink ( $truedir );
rename ( $dirname . " /aatmp.mdb " , $truedir );
}
function add( $file ){ // 新建一个ACCESS数据库 参数$file为文件路径,必须为相对路径
$dir = dirname ( $_SERVER [ " SCRIPT_FILENAME " ]) . " / " . $file ;
$db = new com( " ADOX.Catalog " );
$db -> Create( " Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$dir " );
}
}
?>
不知道怎么用吧!下面有示例!
<?
include ( " access.php " );
access :: add( " my.mdb " ); // 创建数据库
$db = new access( " my.mdb " ); // 连接数据库
$sql =<<< eot
CREATE TABLE a (
id AUTOINCREMENT( 1 , 1 ) ,
name varchar( 10 ))
eot;
$db -> sql( $sql ); // 建表
$sql =<<< eot
insert into `a` (`name`) values( ' wo ri ' );
eot;
$db -> sql( $sql ); // 插入数据
$db -> sql( " insert into `a` (`name`) values('靠'); " );
$sql = " select * from a limit 1,1 " ;
$rs = $db -> sql( $sql ); // 查询
print_r ( $rs );
?>
include ( " access.php " );
access :: add( " my.mdb " ); // 创建数据库
$db = new access( " my.mdb " ); // 连接数据库
$sql =<<< eot
CREATE TABLE a (
id AUTOINCREMENT( 1 , 1 ) ,
name varchar( 10 ))
eot;
$db -> sql( $sql ); // 建表
$sql =<<< eot
insert into `a` (`name`) values( ' wo ri ' );
eot;
$db -> sql( $sql ); // 插入数据
$db -> sql( " insert into `a` (`name`) values('靠'); " );
$sql = " select * from a limit 1,1 " ;
$rs = $db -> sql( $sql ); // 查询
print_r ( $rs );
?>