是否最好减少对数据库的调用并将结果输出到数组中?

时间:2010-06-14 16:33:38

标签: php mysql oop resultset

我正在尝试创建一种更简洁的方式来进行数百个db调用。我不是每次想要输出单个字段时都写出整个查询,而是尝试将代码移植到一个完成所有查询工作的类中。这是我到目前为止的课程:

class Listing {

/* Connect to the database */
private $mysql;

function __construct() {
    $this->mysql = new mysqli(DB_LOC, DB_USER, DB_PASS, DB) or die('Could not connect');
}
function getListingInfo($l_id = "", $category = "", $subcategory = "", $username = "", $status = "active") {
    $condition = "`status` = '$status'";
    if (!empty($l_id)) $condition .= "AND `L_ID` = '$l_id'";
    if (!empty($category)) $condition .= "AND `category` = '$category'";
    if (!empty($subcategory)) $condition .= "AND `subcategory` = '$subcategory'";
    if (!empty($username)) $condition .= "AND `username` = '$username'";
    $result = $this->mysql->query("SELECT * FROM listing WHERE $condition") or die('Error fetching values');
    $info = $result->fetch_object() or die('Could not create object');
    return $info;
}
}

这样可以轻松地从一行访问我想要的任何信息。

$listing = new Listing;
echo $listing->getListingInfo('','Books')->title;

这将输出“Books”类别中第一个列表的标题。但是如果我想输出该列表的价格,我必须再次调用getListingInfo()。这会在db上生成另一个查询,并再次仅返回第一行。

这比每次编写整个查询要简洁得多,但我觉得我可能经常调用db。有没有更好的方法从我的类输出数据,并且仍然可以简洁地访问它(可能将所有行输出到数组并返回数组)?如果是,怎么样?

4 个答案:

答案 0 :(得分:7)

您确实遇到了性能问题吗?

如果您当前的设置有效并且没有遇到性能问题,我就不会碰它。

这种数据库访问抽象可能会成为维护问题,可能无法帮助提高性能。

此外,您很容易受到SQL injection的影响。

答案 1 :(得分:0)

将结果缓存在内部var

或者用警告注释并解释函数用户将结果复制到var中而不是一次又一次地使用相同的参数调用它

答案 2 :(得分:0)

是的,这会经常调用数据库。

一些解决方案

1)将列表信息放在变量

2)将结果缓存在散列映射或字典中(注意内存泄漏)

答案 3 :(得分:0)

您应该能够将查询中的整个对象存储到变量中,然后从该对象访问单个值:

$object = $listing->getListingInfo('','Books');
$title = $object->title;
$price= $object->price;

但你也可以使用fetch_assoc()并返回整个assiciative数组:

$array = $listing->getListingInfo('','Books');
$title = $object['title'];
$price= $object['price'];

这将为您提供相同的结果,并且只向DB提供一个查询。

编辑:如果getListingInfo()是唯一的功能,您应该考虑以下事项:

  1. 将函数重命名为prepareListingInfo(),并在函数内只准备查询并将其存储在类变量中。
  2. 添加一个getNextListingInfo()函数,该函数将返回下一行的对象或关联数组。
  3. 使用此新功能,您可以获得与查询匹配的每一行。