PHP/MySQL 在一个类中隔离数据库访问——如何以 OOP 方式处理多行结果集

标签 php mysql oop coding-style

PHP/MySQLisolating database access in class - 如何处理多行选择

这是一道编程题。 我将所有数据库访问函数隔离在一个类中

<?php
class DB {
    var $conn;         
    function DBClass () {
                @$this-> conn = mysqli_connect (DB_SERVER, DB_USER, DB_PASS, DB_NAME);
    }
    function validateUser ($aUserid, $aPassword) {
                …  validation code – sql injection code etc..
                $sql = "Select userid, name, level From users where userid = '$aUserid' and password = '$aPassword'";
                $result = mysqli_query ( $this->conn, $sql );
                if (!$result || (mysqli_num_rows ($result) < 1)) {
                            return false;
                }
                $dbarray = mysqli_fetch_assoc ($result); // get a row
                return $dbarray;
    }

    function getProduct ($aProductid) {

                return $dbarray;
    }

    function getProductList () {  
                // <----------- this would be the problem function
    }
}

$DB = new DBClass();
?>

我的调用例程:

<?php
        $dbarray = $DB->validateUser ($_POST['userid'], $_POST['password']); 
?>

没问题,它工作正常。我遇到了多行结果集的问题。现在我必须回到每一行的类对象。如果我在调用例程中包含 MySQL 代码没有问题,但我想将它隔离在我的类中并且我不确定如何编写代码。

有什么想法吗?有例子吗?

最佳答案

如果你使用PHP 5.3.0和mysqlnd,你可以使用新函数mysqli_fetch_all() .这将返回关联数组的数组。

如果您使用早期版本的 PHP,您可以切换到使用 PDO,并使用函数 PDOStatement::fetchAll() .

您在评论中询问非常大的结果集如何。确实,无限制的结果集可能会导致数组超出您的 PHP 内存限制,这会导致 fatal error 并停止脚本。但这真的是个问题吗?你有多少种产品?您可以使用 LIMIT 来确保查询不是无限的。


关于你关于重返类的问题的另一部分,我建议制作一个 Iterator类:

class DB implements IteratorAggregate
{
  protected $_data = array();

  public function getProductList() {
    // fetch all results from SQL query, stuff them into $this->_data
    return $this->getIterator();
  }

  public function getIterator() {
    return new ArrayIterator($this->_data);
  }
}

现在您可以在 foreach 循环中使用该类:

$db = new DB();
foreach ($db->getProductList() as $product) {
  // do something with each product
}

IteratorAggregate 接口(interface)意味着您甚至可以这样做:

$db = new DB();
$db->getProductList();
// ...other steps...
foreach ($db as $product) {
  // do something with each product
}

当然,使用此方法一次只能存储一个结果集。如果您同时将 DB 类用于任何其他查询,这会使事情变得复杂。出于这个原因,大多数人不会尝试编写一个单独的类来封装所有的数据库操作。他们为每种类型编写单独的类 Domain Model他们需要与数据库连接脱钩。

关于PHP/MySQL 在一个类中隔离数据库访问——如何以 OOP 方式处理多行结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1341818/

相关文章:

java - 不能重用方法android OOP

javascript - 调用 javascript 对象的问题

php - 从 php 检索 JSON 时出错 - Android

php - 如何使用 PHP 忽略给定数组中的某些集合

php - 电子邮件在 Joomla 网站 [SMTP] 中不起作用

php - 使用带绑定(bind)的 PHP 准备语句显示来自 mySQL 的行

c++ - Arduino - 只有第一个对象在包含在另一个对象的集合/数组中时丢失其数据属性值

php - Doctrine2 应该自动合并相关实体

javascript - 不同语言的自动完成或 : How to store different languages for web-applications

php - 在 PHP 中,当我们使用 mysql_query 时,内存中会发生什么