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/