+ -
当前位置:首页 → 问答吧 → 最近写的一个PHP操作Access类(PHP+ODBC+Access)

最近写的一个PHP操作Access类(PHP+ODBC+Access)

时间:2006-08-11

来源:互联网

最近接了一个网站使用的是PHP+Access,汗,以前从来没有用php+Access做过,参考别人写的access函数,自己加入了一些其他的功能,封装为一个类,感觉调用蛮方便的,虽然没有测试过,但是感觉PHP+Access的速度没有PHP+MySQL速度快。
    代码如下:
复制PHP内容到剪贴板
PHP代码:

<?php
--------------------------------------------------------------------
//FileName:class.php
//Summary: Access数据库操作类
//Author:  forest
//CreateTime: 2006-8-10     
//LastModifed:
//copyright (c)2006 
//http://freeweb.nyist.net/~chairy  
//[email][email protected][/email]
//   使用范例:
//$databasepath="database.mdb";
//$dbusername="";
//$dbpassword="";
//include_once("class.php");
//$access=new Access($databasepath,$dbusername,$dbpassword);

--------------------------------------------------------------------
    class Access
    {
         var $databasepath,$constr,$dbusername,$dbpassword,$link;
         function Access($databasepath,$dbusername,$dbpassword)
         {
               $this->databasepath=$databasepath;
        $this->username=$dbusername;
        $this->password=$dbpassword;
        $this->connect();
          }
        
    function connect()
    {
        $this->constr="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath($this->databasepath); 
        $this->link=odbc_connect($this->constr,$this->username,$this->password,SQL_CUR_USE_ODBC);
        return $this->link;
        //if($this->link) echo "恭喜你,数据库连接成功!";
        //else echo "数据库连接失败!";
    }
        
    function query($sql)
    {
        return @odbc_exec($this->link,$sql);
    }
        
    function first_array($sql)
    {
        return odbc_fetch_array($this->query($sql));
    }
        
    function fetch_row($query)
    {
        return odbc_fetch_row($query);
    }
        
    function total_num($sql)//取得记录总数
    {
        return odbc_num_rows($this->query($sql));
    }
        
    function close()//关闭数据库连接函数
    {    
        odbc_close($this->link);
    }
            
    function insert($table,$field)//插入记录函数
    {
        $temp=explode(',',$field);
        $ins='';
        for ($i=0;$i<count($temp);$i++)
        {
            $ins.="'".$_POST[$temp[$i]]."',";
        }
        $ins=substr($ins,0,-1);
        $sql="INSERT INTO ".$table." (".$field.") VALUES (".$ins.")";
        $this->query($sql);
    }
        
    function getinfo($table,$field,$id,$colnum)//取得当条记录详细信息
    {
        $sql="SELECT * FROM ".$table." WHERE ".$field."=".$id."";
        $query=$this->query($sql);
        if($this->fetch_row($query))
        {
            for ($i=1;$i<$colnum;$i++)
            {
          $info[$i]=odbc_result($query,$i);
             }
         }
         return $info;
    }
        
    function getlist($table,$field,$colnum,$condition,$sort="ORDER BY id DESC")//取得记录列表    
    {
         $sql="SELECT * FROM ".$table." ".$condition." ".$sort;
         $query=$this->query($sql);
         $i=0;
         while ($this->fetch_row($query)) 
         {
        $recordlist[$i]=getinfo($table,$field,odbc_result($query,1),$colnum);
        $i++;
          }
          return $recordlist;
    }
        
    function getfieldlist($table,$field,$fieldnum,$condition="",$sort="")//取得记录列表
    {
         $sql="SELECT ".$field." FROM ".$table." ".$condition." ".$sort;
         $query=$this->query($sql);
         $i=0;
         while ($this->fetch_row($query)) 
         {
         for ($j=0;$j<$fieldnum;$j++)
        {
                   $info[$j]=odbc_result($query,$j+1);
        }    
        $rdlist[$i]=$info;
        $i++;
         }
         return $rdlist;
    }
        
    function updateinfo($table,$field,$id,$set)//更新记录
    {
        $sql="UPDATE ".$table." SET ".$set." WHERE ".$field."=".$id;
        $this->query($sql);
    }
        
    function deleteinfo($table,$field,$id)//删除记录
    {
         $sql="DELETE FROM ".$table." WHERE ".$field."=".$id;
         $this->query($sql);
    }
        
    function deleterecord($table,$condition)//删除指定条件的记录
    {
         $sql="DELETE FROM ".$table." WHERE ".$condition;
         $this->query($sql);
    }
        
    function getcondrecord($table,$condition="")// 取得指定条件的记录数
    {
         $sql="SELECT COUNT(*) AS num FROM ".$table." ".$condition;
         $query=$this->query($sql);
         $this->fetch_row($query);
         $num=odbc_result($query,1);
         return $num;            
    }
     }
?>

[ 本帖最后由 forest 于 2007-3-31 18:40 编辑 ]

作者: forest   发布时间: 2006-08-11

我写的这个类,光有人看,没有人顶,自己顶一个,哈哈!

作者: forest   发布时间: 2006-08-14

ADODB有Access的driver
不过也顶下
:$

作者: 姜运涛   发布时间: 2006-08-14

.

[ 本帖最后由 h058 于 2006-8-17 22:33 编辑 ]

作者: h058   发布时间: 2006-08-17

这个要先建立obdc的数据源才能用吧?

作者: cheerfans   发布时间: 2006-09-21

老大真有闲工夫,ACCESS也搞起来了,支持

作者: fnet   发布时间: 2006-10-03

呵呵
客户至上嘛

作者: fengyun   发布时间: 2006-10-04

强。。。。。access数据库。。。。。。:L 强。。。。野人阿:L 。。。

作者: visam   发布时间: 2006-10-08

作者: kenus   发布时间: 2006-10-09

呵呵,不错,关于用类的思想去编程应该是各种语言最终演变的方向了,flash action3的语法演变看来是走在php5前面了,虽然两者一个是后台的一个前台的,但是两种语言的演变的方向确是惊人的一致.

作者: g0c0   发布时间: 2006-12-04

PHP+ACCESS,这个客户也真有型

作者: leehui1983   发布时间: 2006-12-05

面向对象

作者: 水镜   发布时间: 2006-12-05

作者: kenus   发布时间: 2006-12-08

我也来顶一下

作者: waixin   发布时间: 2006-12-09

网上少有,是宝啊

作者: �����i�i   发布时间: 2006-12-09

很不错
支持一下

作者: jzwjk   发布时间: 2006-12-17

看我改的怎么样,
我还没实验,只是看了forest代码,一时冲动改了一下,有参考dede的类
复制PHP内容到剪贴板
PHP代码:

<?php
--------------------------------------------------------------------
//FileName:class.php
//Summary: Access数据库操作类
//Author:  forest
//CreateTime: 2006-8-10     
//LastModifed:
//copyright (c)2006 freeweb.nyist.net/~chairy  [email][email protected][/email]
//   使用范例:
//$database ="**.mdb";
//$dbuser   ="**";
//$dbpwd    ="**";
//$tablepre ="discuz_";
//$access=new Access($database,$dbuser,$dbpwd,$tablepre);
//$query="SELECT * FROM ----"
//$access->set_query($query);
//$access->query();
    
--------------------------------------------------------------------
class Access{
    var $databasepath; 
    var $constr;       
    var $dbusername;   
    var $dbpassword;   
    var $linkid;       
    var $result;       
    var $queryString;  
    var $tablepre;     //数据表前缀
    function __construct($database,$dbuser,$dbpwd,$pre,$mode){
        $this->databasepath=$database;
        $this->username=$dbuser;
        $this->password=$dbpwd;
        $this->tablepre=$pre;
        $this->connect($mode);
    }
    function Access($database,$dbuser,$dbpwd,$pre,$mode){
        $this->__construct($database,$dbuser,$dbpwd,$pre,$mode);
    }
    function connect($mode=false){
        $this->constr = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" . realpath($this->databasepath); 
        if($mode){
            $this->linkid = odbc_pconnect($this->constr,$this->username,$this->password,SQL_CUR_USE_ODBC);
        } else {
            $this->linkid = odbc_connect($this->constr,$this->username, $this->password,SQL_CUR_USE_ODBC);
        }
        return $this->linkid;
    }
    function set_query($sql) {
        $prefix="#@__";
        $sql = trim($sql);
        $inQuote = false;
        $escaped = false;
        $quoteChar = '';
        $n = strlen($sql);
        $np = strlen($prefix);
        $restr = '';
        for($j=0; $j < $n; $j++) {
            $c = $sql{$j};
            $test = substr($sql, $j, $np);
            if(!$inQuote) {
                if ($c == '"' || $c == "'") {
                    $inQuote = true;
                    $escaped = false;
                    $quoteChar = $c;
                }
            } else {
                if ($c == $quoteChar && !$escaped) {
                    $inQuote = false;
                } else if ($c == "\\" && !$escaped) {
                    $escaped = true;
                } else {
                    $escaped = false;
                }
            }
            if ($test == $prefix && !$inQuote) {
                $restr .= $this->tablepre;
                $j += $np-1;
            } else {
                $restr .= $c;
            }
        }
        $this->queryString = $restr;
    }
    function query($id="me"){
        $this->result[$id] = @odbc_exec($this->linkid,$this->queryString);
        if(!$this->result[$id]) {
            $this->display_error("Execute Query False! <font color='red'>".$this->queryString."</font>");
        }
    }
    function first_array($id="me"){
        return odbc_fetch_array($this->result[$id]);
    }
    function fetch_row($id="me"){
        return odbc_fetch_row($this->result[$id]);
    }
    function total_num($id="me"){//取得记录总数
        return odbc_num_rows($this->result[$id]);
    }
    function close(){//关闭数据库连接函数
        @odbc_close($this->linkid);
        $this->free_all_result();
    }
    function free_result($id="me") {
        @mysql_free_result($this->result[$id]);
    }
    function free_all_result() {
        if(!is_array($this->result)) {
            return "";
        }
        foreach($this->result as $kk => $vv){
            if($vv) @odbc_free_result($vv);
        }
    }
    function insert($table,$field,$value){//插入记录函数
        $sql="INSERT INTO {$table} ({$field}) VALUES ({$value})";
        $this->set_query($sql);
        $this->query();
    }
    function getinfo($table,$requirement,$limit){//取得当条记录详细信息
        $sql="SELECT * FROM {$table} WHERE {$requirement}";
        $this->set_query($sql);
        $this->query();
        if($this->fetch_row()){
            for ($i=1;$i<$limit;$i++){
                $info[$i]=odbc_result($this->result["me"],$i);
            }
        }
        return $info;
    }
    function getlist($table,$field,$limit,$condition,$sort="ORDER BY id DESC"){//取得记录列表
        $sql="SELECT * FROM ".$table." ".$condition." ".$sort;
        $this->set_query($sql);
        $this->query();
        while ($this->fetch_row()){
            $id=odbc_result($this->result["me"],1);
            $requirement="{$field}={$id}";
            $recordlist[]=getinfo($table,$requirement,$limit);
        }
        return $recordlist;
    }
    function getfieldlist($table,$field,$fieldnum,$condition="",$sort=""){//取得记录列表
        $sql="SELECT ".$field." FROM ".$table." ".$condition." ".$sort;
        $this->set_query($sql);
        $this->query();
        while ($this->fetch_row()){
            for ($j=0;$j<$fieldnum;$j++){
                $info[$j]=odbc_result($this->result["me"],$j+1);
            }    
            $rdlist[]=$info;
        }
        return $rdlist;
    }
    function updateinfo($table,$requirement,$set){//更新记录
        $sql="UPDATE {$table} SET {$set} WHERE {$requirement}";
        $this->set_query($sql);
        $this->query();
    }
    function deleteinfo($table,$requirement){//删除记录
        $sql="DELETE FROM {$table} WHERE {$requirement}";
        $this->set_query($sql);
        $this->query();
    }
    function deleterecord($table,$condition){//删除指定条件的记录
        $sql="DELETE FROM ".$table." WHERE ".$condition;
        $this->set_query($sql);
        $this->query();
    }
    function getcondrecord($table,$condition=""){// 取得指定条件的记录数
        $sql="SELECT COUNT(*) AS num FROM ".$table." ".$condition;
        $this->set_query($sql);
        $this->query();
        $num=odbc_num_rows($this->result["me"]);
        return $num;            
    }
    function display_error($msg) {
        echo "<html>\r\n";
        echo "<head>\r\n";
        echo "<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>\r\n";
        echo "<title>DedeCms Error Track</title>\r\n";
        echo "</head>\r\n";
        echo "<body>\r\n<p style='line-helght:150%;font-size:10pt'>\r\n";
        echo $msg;
        echo "<br/><br/>";
        echo "</p>\r\n</body>\r\n";
        echo "</html>";
    }
}
?>

[ 本帖最后由 muqiao 于 2006-12-17 08:14 编辑 ]

作者: muqiao   发布时间: 2006-12-17

恩,改的不错,呵呵~~

作者: forest   发布时间: 2006-12-17

顶一下,不错呀。哈哈,学习了。

作者: newbird   发布时间: 2006-12-18

顶一个,以后会用到

作者: Internet   发布时间: 2006-12-20

强人啊。支持一下!

作者: 特蓝克斯   发布时间: 2006-12-25

//$tablepre ="discuz_";

是什么哦?

作者: redmangame   发布时间: 2007-01-13

...不错

作者: Poon   发布时间: 2007-01-13

呵呵,我也用的是adodb。

作者: zfh   发布时间: 2007-02-01

客户是神经病.

作者: gd286115   发布时间: 2007-02-22

我来顶楼主,正好需要,直接拿过来用用。
我原来有个ACCESS的数据库里有些东西需要转,哈哈。

作者: 瓜哥   发布时间: 2007-02-24

好是不好,但是好像你是按照4.0版的语法写的

应该用5.0的新写法,构造器用__construct
成员变量,成员函数应该用private,public
还有,应该写一个析构函数,在析构时删除链接

作者: xuer   发布时间: 2007-02-27

:)

作者: luzhou   发布时间: 2007-02-28

因为,mysql数据库空间贵,所以用access,呵

作者: HowgoO   发布时间: 2007-03-03

牛人一个,,:)

作者: jaony   发布时间: 2007-03-09

你写的类,你自己有没有测试过?速度超慢

作者: huoyue2008   发布时间: 2007-03-09

顶。

作者: 布鲁塞尔浮木   发布时间: 2007-04-11

:Q
我不会用类
require_once("./inc/access.php");
$database ="data/aaa.mdb";
$dbuser   ="";
$dbpwd    ="";
$tablepre ="";
$accessa=new Access($database,$dbuser,$dbpwd,$tablepre);
$query="SELECT * FROM index";
$accessa->set_query($query);
$accessa->query();               
$accessa->total_num();
echo $accessa; (这句始终输出object)
然后我又试
echo $accessa->total_num();  一片空白

这个类怎么用的啊
谁能给个例子

作者: jysoso   发布时间: 2007-05-15

我给你定;
呵呵;

作者: 木�^   发布时间: 2007-05-15

:handshake
3Q木头

作者: jysoso   发布时间: 2007-05-15

我现在又试了
$result=$accessa->query();
while($rows = odbc_fetch_object($result)){
    echo $rows->name;
   }

还是老样子。。什么都木有

作者: jysoso   发布时间: 2007-05-15

$s="SELECT * FROM index";
echo $access->total_num($s)


结果是-1  为何???我晕了

作者: jysoso   发布时间: 2007-05-15

嗯嗯,加油加油。。。。

作者: coolkiss   发布时间: 2007-05-16

这里有我写的ADO版本……
http://www.jerryhong.com/2007/08 ... %e5%ba%93/#more-104

作者: hjrgenius   发布时间: 2007-08-14

强悍呀
我看了半年的mysql
进展还是不大
你们到底怎么武装的这么强悍
哦哦
向版主学习

作者: tinyqueen   发布时间: 2007-12-28

php中的 odbc_num_rows对acc不起作用的,唉,光写了,也没人试下!!

作者: guzhongzhi   发布时间: 2007-12-29

引用:
原帖由 forest 于 2006-8-11 10:08 发表
最近接了一个网站使用的是PHP+Access,汗,以前从来没有用php+Access做过,参考别人写的access函数,自己加入了一些其他的功能,封装为一个类,感觉调用蛮方便的,虽然没有测试过,但是感觉PHP+Access的速度没有PHP+M ...
不知道你测试过没有似乎有一个地方少写了$this->

呵呵 和你客户商量一下换数据库吧。 数据量大了他就哭吧。 access 基本不零。

作者: zshtom   发布时间: 2008-01-01

我想问下那ACCESS数据文件应该放到那里才能连接起来?

作者: ericwu07   发布时间: 2008-04-22

你的不需要连接路径的吗?

作者: ericwu07   发布时间: 2008-04-22

谢谢!正准备看看php和access的...

作者: richardhc   发布时间: 2008-05-12

顶你!!!!!!!!!!!
学学习习!!!

作者: piaohh   发布时间: 2008-05-13

支持一下,说不定哪天有用哈!

作者: qiaogqiang   发布时间: 2008-05-21

学习啦~谢谢了!

作者: richardhc   发布时间: 2008-05-28