0

商品IDを保存するカートクラスがあります。ユーザーはポップアップでカートを開くボタンを使用してカートを開くことができるため、カートのコンテンツをすべてのページにロードする必要があります。

サイズ制限のため、商品のIDしか保存できませんが、最終ユーザーに商品名を表示したいので、要素ごとにクエリを実行して、データベースから商品データを取得する必要があります。

これを行うことによる大きな欠点はありますか?または、より良い解決策はありますか?

PS:カート内のすべての商品のIDを取得してから、必要な商品のデータを取得する1つのクエリを実行できます。クラスの一部を書き直す必要があるので、これは避けたいのですが、以前のソリューションと実際に違いはありますか?

PPS:SQLクエリの総数は、どのような場合でも多すぎないようにする必要があります。もちろん私は気にしませんが、ユーザーが一度に何百もの異なる製品を購入することはないでしょう。

4

1 に答える 1

2

私はあなたの質問から一文だけを強調したいです:

したがって、要素ごとにクエリを実行し、データベースから製品データを取得する必要があります。

それがあなたの問題です。あなたはそれをする必要はありません。1回のクエリでデータベースにクエリを実行し、IDのリストにあるすべての製品を要求できます。

SQL言語の有用な部分はIN(....)句です。

$ids = [123, 884, 7848, 2882, 3232]; // let's say that is your input
$idList = implode(',', array_map('intval', $ids));
$sql = sprintf(
    "SELECT field1, field2, field3 FROM products WHERE products.ID IN(%s)",
    $idList
);

これは、製品IDのリストに対する単一のクエリです。データベースからデータをフェッチするときは、インメモリデータベース(別名Hashtable)をオンザフライで作成して、IDに基づいてデータを「フェッチ」できるようにします。

foreach($ids as $id)
{
    $concreteProduct = $rows[$id];
    ...
}

arrayまた、データベースから返されたID値によってキー設定されたものとしても知られています。IDは一意であるため、これはtmで機能します。

これがお役に立てば幸いです。時期尚早の最適化と呼ばれることもありますが、多くの場合に使用できるため、この概念に注意する必要があります。

于 2012-09-21T20:15:40.013 に答える