【问题标题】:can a PHP class return a recordsetPHP 类可以返回记录集吗
【发布时间】:2013-01-08 14:28:28
【问题描述】:

我正在尝试为我的访问数据库连接创建一个类并返回一个记录集,然后使用 MoveNext() 遍历 RS。

class AccessDBConnection 
{ 
private $db; 
private $sql; 

function __construct($db, $sql) {

    $conn = new COM('ADODB.Connection') or exit('Cannot start ADO.');
    $conn->Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$db"); 

    $rs = $conn->Execute($sql);
    return $rs;

}

使用:

function testclass () {
    $rs = new AccessDBConnection("e:\database.mdb", "SELECT StudentID, UserName FROM MyTable WHERE StudentID = 'BJxxxx'");

    while (!$rs->EOF) { 
        $SID =  $rs->Fields['StudentID']->Value; 
        $UN =  $rs->Fields['UserName']->Value;
            echo $SID . " -- CLASS TEST -- " . $UN . "<br>";
                $rs->MoveNext(); 
    }
}

【问题讨论】:

  • 即使有可能,这也会被视为不好的做法。也许您正在寻找的是一些静态范围或单例方法?

标签: php class ms-access


【解决方案1】:

你不能从构造函数返回你的结果集。

创建一些分离的方法,例如getRS,它将返回它。

class AccessDBConnection 
{
    private $conn;

    public function __construct($db) {

        $this->conn = new COM('ADODB.Connection') or exit('Cannot start ADO.');
        $this->conn->Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$db"); 

    }

    public function query($sql) {

        return $this->conn->Execute($sql);

    }

}

用法:

function testclass () {
    $db = new AccessDBConnection("e:\database.mdb");
    $rs = $db->query("SELECT StudentID, UserName FROM MyTable WHERE StudentID = 'BJxxxx'");

    while (!$rs->EOF) { 
        $SID =  $rs->Fields['StudentID']->Value; 
        $UN =  $rs->Fields['UserName']->Value;
            echo $SID . " -- CLASS TEST -- " . $UN . "<br>";
                $rs->MoveNext(); 
    }
}

【讨论】:

  • 我想更多地使用它来连接而不是结果?我明白你的意思,我将不得不以数组或记录集以外的其他东西返回它......
  • 非常感谢,我遇到了一个错误:PHP 致命错误:在 E:\... 中的非对象上调用成员函数 Execute()...return $conn-&gt;Execute($sql);
【解决方案2】:

构造函数不返回。所以调用:

$rs = new AccessDBConnection($db, $sql);

不会产生记录集。

一些通用指针:

  • 在您的__construct 中做的很少,以便在您进行测试时更容易进行测试
  • 创建一个类似于public function connect() 的方法来执行连接
  • 创建用于执行查询和返回记录集的方法。

或者找到一个已经完成工作的包装类。重写轮子没有意义。

【讨论】:

  • 找到 PHP 使用 Access 数据库的任何地方都是一个挑战......所以你说我可以返回一个 RS,只是不在 __construct 中?
  • 正确。您基本上可以构建自己的版本哦mysql_ 函数。一个快速的谷歌出现了几个结果,你可以根据可用的结果。
猜你喜欢
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2012-06-08
  • 2010-12-09
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多