我要做的是编写一个“搜索”类,可以搜索产品列表并将它们存储在数组中。
我已经有了一个“产品”类,可用于获取特定产品的详细信息。
这是我的代码:
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类。
当“产品”是一个对象时,编写一个可以返回“产品”对象列表的搜索类的最合适的方法是什么,而不会产生我上面所做的开销?
答案 0 :(得分:1)
将一个构造函数添加到Product
类中,该类将名称,价格和描述作为参数(或一个assoziative数组),用必要的值填充对象,并将数据库查询解耦。
在doSearch
中,您可以创建一个SELECT
,它不仅会从产品表中获取ID,还会获取所有相关字段,并使用new Product($name, $price, $description)
或{立即创建已填充的产品对象{1}},不为每个产品调用new Product($row)
。
答案 1 :(得分:0)
使用数据库中的数据创建一个用Product
填充实例的类。
然后,类可以根据获取的数据量创建Product
类的一个或多个实例。
结论:从getProductById
课程中提取Product
并将其放在其他位置。它是一种专门的方法,只填充一个实例。
答案 2 :(得分: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);
答案 3 :(得分:0)
您的Product类不应该对数据库有任何了解。它应该包含代表产品的值,仅此而已。从本课程中提取处理数据库的所有内容。
搜索产品是访问产品列表的一种方法。您的下一课应该是产品清单。只有在访问单个产品时,您才不必处理列表,但这可能不像您想象的那么频繁。
好的,您拥有产品和产品列表,现在可以前进一步并添加数据库访问权限。你需要一个类来处理给你一个产品(当按id搜索时)和产品列表(当用一些文本或其他东西搜索时)。只有这个类允许您处理访问数据库所需的查询。每个查询的结果集可以直接在“产品列表”类中使用,可能是通过继承通用“产品列表”类中定义的所有内容并添加处理数据库结果。
所以最后你会得到:
Product -> ListOfProducts -> ProductDatabase -> DatabaseAccessLayer