1

我想做的是编写一个“搜索”类,它可以搜索产品列表并将它们存储在一个数组中。

我已经有一个“产品”类,可用于获取特定产品的详细信息。

这是我的代码:

class Product {

    public $name;
    public $price;
    public $description;

    public function getProductById ($id) {

        $sql = 'SELECT name, price, description FROM product WHERE id = ' . $id;

        $row = /* MySQL functions here to execute SQL statement and get a matching row */

        $this->name = $row['name'];
        $this->price = $row['price'];
        $this->description = $row['description'];
        return TRUE;
    }
}

class Search {

    public $results;
    public $totalResults;

    function __construct() {
        $this->results = array ();
        $this->totalResults = 0;
    }

    public function doSearch ($name) {

        $sql = 'SELECT id FROM product WHERE name LIKE "%' . $name . '%"';

        $rows = /* MySQL functions here to execute SQL statement and get a list of matching product ID's */

        foreach ($rows as $row) {
            $product = new Product;
            $product->getProductById ($row['productid']);
            $this->results[] = $product;
        }
        return TRUE;
    }
}

$search = new Search;
$search->doSearch ('Fresh Flowers');

上面的问题是doSearch方法中每一条匹配的记录都会在getProductById方法中执行一次查询。如果有 100 个匹配的产品,将在 Product 类中执行 100 个单独的查询。

但是,如果我使用单个查询直接在 doSearch 方法中获取产品,那么这将完全绕过 Product 类。

当“产品”是一个对象时,编写一个可以返回“产品”对象列表的搜索类最合适的方法是什么,而不会产生我上面所做的开销?

4

4 回答 4

1

Product向将名称、价格和描述作为参数(或关联数组)的类添加一个构造函数,以使用必要的值填充对象,与数据库查询分离。

doSearch中,您可以创建一个SELECT,它不仅从 products 表中获取 ID,还获取所有相关字段,并立即使用new Product($name, $price, $description)or创建填充的产品对象new Product($row),而无需调用getProductById每个产品。

于 2012-11-24T19:04:25.817 回答
0

您的 Product 类不应该对数据库一无所知。它应该包含代表产品的值,仅此而已。从这个类中提取所有处理数据库的东西。

搜索产品是访问产品列表的一种方式。你的下一节课应该是产品列表。只有在访问单个产品时,您才不必处理列表,但这可能比您想象的要少。

好的,您已经有了产品和产品列表,您现在可以向前迈出一步并添加数据库访问权限。你需要一个类来处理给你一个产品(当通过 id 搜索时)和产品列表(当通过一些文本或其他东西搜索时)。只有这个类允许您处理访问数据库所需的查询。每个查询的结果集可以直接在“产品列表”类中使用,可能通过继承通用“产品列表”类中定义的所有内容并添加处理数据库结果。

所以最终你会得到:

Product -> ListOfProducts -> ProductDatabase -> DatabaseAccessLayer

于 2012-11-24T19:54:46.733 回答
0

Product创建一个使用数据库中的数据填充实例的类。

然后,该类可以Product根据获取的数据量创建该类的一个或多个实例。

结论:getProductById从您的Product课程中提取并将其放在其他地方。这是一种仅填充一个实例的专用方法。

于 2012-11-24T19:02:09.467 回答
0

首先抓住你想要的东西。

public function doSearch ($name) {

        $sql = 'SELECT id, name, price, description FROM product 
           WHERE name LIKE "%' . $name . '%"';

// now just return the array    

}

或者使用 PDO 将结果集作为对象返回。

$result->setFetchMode(PDO::FETCH_INTO, new animals);

正如这里所讨论的:如何在 PDO 中简单地返回对象?

于 2012-11-24T19:19:23.277 回答