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で、SELECTIDだけでなく、製品テーブルからすべての関連フィールドを取得するを作成し、各製品を呼び出さずに、new Product($name, $price, $description)またはを使用して、入力された製品オブジェクトをすぐに作成できます。new Product($row)getProductById

于 2012-11-24T19:04:25.817 に答える
0

のインスタンスにProductデータベースからのデータを取り込むクラスを作成します。

Productクラスは、フェッチされるデータの量に応じて、クラスの1つまたは複数のインスタンスを作成できます。

結論:クラスgetProductByIdからを抽出し、別の場所に配置します。これは、 1つのインスタンス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 に答える
0

Productクラスは、データベースについて何も知らないはずです。製品を表す値が含まれている必要があり、それ以上のものは含まれていません。このクラスからデータベースを扱うすべてのものを抽出します。

製品の検索は、製品のリストにアクセスする1つの方法です。次のクラスは、製品のリストである必要があります。1つの製品にアクセスする場合にのみ、リストを処理する必要はありませんが、これはおそらくあなたが思っているよりも少ない頻度です。

これで、製品と製品のリストができました。これで、一歩進んでデータベースアクセスを追加できます。1つの商品(IDで検索する場合)と商品のリスト(テキストなどで検索する場合)の両方を提供するクラスが必要です。このクラスのみが、データベースへのアクセスに必要なクエリを処理できます。各クエリの結果セットは、「製品リスト」クラス内で直接使用できます。おそらく、一般的な「製品リスト」クラスで定義されているすべてのものを継承し、データベース結果の処理を追加することによって使用できます。

したがって、最終的には次のようになります。

Product -> ListOfProducts -> ProductDatabase -> DatabaseAccessLayer

于 2012-11-24T19:54:46.733 に答える