【问题标题】:Converting from a PHP MySQL result object to a result resource (OO to procedural)从 PHP MySQL 结果对象转换为结果资源(OO 到过程)
【发布时间】:2011-01-25 22:29:41
【问题描述】:

我一直在使用面向对象的风格在 PHP 应用程序中处理 MySQL 数据库函数。但是现在我想使用一个需要结果资源作为输入变量的函数,但我可用的只是语句中的结果对象

          $oresult = $odb->query($sql);

有没有办法从面向对象风格的数据库连接中生成结果资源 ($dbconn = new mysqli (...))?

谢谢你

【问题讨论】:

    标签: php mysql object


    【解决方案1】:

    您通常希望为您的结果集提供资源(封装数据库函数的包装器函数。即 numRows()、affectedRows() 等),这反过来又可以为您提供一个记录集来迭代必要时得出结果。

    【讨论】:

    • 我正在阅读您的回复并努力获得基本的了解。如何“向 [我的] 结果集提供资源”?您是建议放弃 OO 样式以便我拥有资源还是有办法获得结果资源?如果是后者,你能举个例子吗?抱歉,如果我遗漏了一些简单的东西。
    • 我必须将其拆分为多个回复,因为我有一个最大字符限制可以解决。让我用一些代码来演示。假设我们有一个 Mysql_Query 类,它执行选择、更新或删除指定的 SQL 语句。
    • class Mysql_Query { public function select($sql) { $result = mysql_query($sql);返回新的 Mysql_Result($result); } } 类 Mysql_Result { 受保护的 $_resource;公共函数 __construct($resource) { $this->_resource = $resource; } 公共函数 numRows() { return mysql_num_rows($this->_resource); } 公共函数 fetchRows() { $rows = array();而 ($row = mysql_fetch_assoc($this->_result)) { $rows[] = $row; } 返回 $rows; } }
    • 如您所见,您永远不想直接让资源公开可用。相反,您希望封装需要资源的 mysql* 方法的逻辑,并在内部将资源传递给它们。在这个简单的示例中,您将看到我将 mysql_query() 的结果传递给结果类,该类公开 mysql 函数并在内部为执行的查询提供资源。
    • John,感谢您编写示例代码。在它完全有意义之前,我需要看到实际的“包装”。在阅读了这篇文章和 Bob 的回复后,我决定硬着头皮重写我的函数以接受资源对象。 - 汤姆
    【解决方案2】:

    AFAIK,Mysqli 的 OO 和 Procedural 风格甚至根本不处理结果资源。如果返回记录集,query() 和 real_query() 函数和方法都会立即(或最终导致)返回 Mysqli_resultobject。整个 Mysqli 扩展中没有函数或属性可以从主 Mysqli 对象中提取“链接”,也没有从 Mysqli_result 对象中提取资源(本身)。事实上,你在 Mysqli 的程序样式示例中看到的 $link 实际上只是一个 Mysqli 对象。

    如果您正在使用的任何函数调用“结果资源”,则它们必须意味着来自旧的常规 Mysql 扩展的函数。没有办法将 Mysql 和 Mysqli 函数和方法混合在一起。所以本质上,是的,在这种情况下,您必须完全放弃 Mysqli,并从一开始就使用旧式的程序化 Mysql。

    【讨论】:

    • 正如我在下面提到的,在阅读了 Mysql 和 Mysqli 函数完全分离的说明后,我决定可以重写现有函数以接受结果对象作为传入变量。感谢您的答复。 - 汤姆
    • @Tom T:没问题。如果您正在开发新旧之间的某种桥接框架,您可能有一个好主意,让一个函数或类同时处理 mysqli 和 mysql。有可能设计自己的方式使它们无缝地协同工作,尤其是在选择旧 MySQL 路线的旧网站上。否则,请注意类似的扩展和插件,有时函数和类可以互换(异常、spl 异常),有时不能互换(mysql、mysqli)。
    猜你喜欢
    • 2019-01-24
    • 2015-11-25
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2013-10-12
    • 2012-12-06
    • 2016-12-23
    相关资源
    最近更新 更多