Nasıl her kategori altında birden fazla kategori ve ürünleri görüntülemek için?

2 Cevap php

Genellikle kategori menü ve o kategori altındaki tüm öğeleri gösteren bir kategori sayfasına her menü bağlantıları var.

Şimdi aynı sayfada PHP / MySQL ile altındaki tüm kategoriler ve öğeleri göstermek gerekir.

Yani bu böyle olacak.

Category 1
description of category 1
item 1 (some details, such as name, thumbnail etc for each item)
item 2
..

Category 2
description of category 2
item 5
item 6
..

Category 3
description of category 3
item 8
item 9
...

...

Benim veritabanında kategori ve ürün tablo var.

Ben kategoriler döngü var ve her kategori altında tüm öğeleri almak yoluyla döngü var gibi görünüyor.

Ama devam etmek nasıl emin değilim.

CREATE TABLE IF NOT EXISTS `omc_product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `shortdesc` varchar(255) NOT NULL,
  `longdesc` text NOT NULL,
  `thumbnail` varchar(255) NOT NULL,
  `image` varchar(255) NOT NULL,
  `product_order` int(11) DEFAULT NULL,
  `class` varchar(255) DEFAULT NULL,
  `grouping` varchar(16) DEFAULT NULL,
  `status` enum('active','inactive') NOT NULL,
  `category_id` int(11) NOT NULL,
  `featured` enum('none','front','webshop') NOT NULL,
  `other_feature` enum('none','most sold','new product') NOT NULL,
  `price` float(7,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;



CREATE TABLE IF NOT EXISTS `omc_category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `shortdesc` varchar(255) NOT NULL,
  `longdesc` text NOT NULL,
  `status` enum('active','inactive') NOT NULL,
  `parentid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Ben yardım takdir edecektir.

Şimdiden teşekkürler.

2 Cevap

Basit yolu: kategorilerini getirmek için bir sorgu yapmak ve daha sonra ayrı bir sorgu ürünlerin her listesini almak için. Gibi bir şey:

<?php
    // Shortcuts to essential string-escaping functions
    //
    function h($s) {
        echo htmlspecialchars($s, ENT_QUOTES);
    }
    function u($s) {
        echo urlencode($s);
    }
    function m($s) {
        return "'".mysql_real_escape_string($s)."'";
    }

    // Get all categories
    //
    $q= mysql_query('SELECT id, name, shortdesc FROM omc_category WHERE status='active' ORDER BY id');
    $categories= array();
    while ($categories[]= mysql_fetch_assoc($q)) {}
?>

<?php foreach ($categories as $category) { ?>
    <h2><?php h($category['name']); ?></h2>
    <p><?php h($category['shortdesc']); ?></p>
    <?php
        // Get all products for a category
        //
        $q= mysql_query('SELECT id, name FROM omc_product WHERE status='active' AND category_id='.m($category['id']));
    ?>
    <ul>
        <?php while ($product= mysql_fetch_assoc($q)) { ?>
            <li>
                <a href="/product.php?id=<?php u($product['id']); ?>">
                    <?php h($product['name']); ?>
                </a>
            </li>
        <?php } ?>
    </ul>
<?php } ?>

(Not:. Tamsayılar kaçış olmadan bir SQL sorgusu eklemek için güvenli Ama dizeleri ile yaptım sanki, bu alışkanlığı içine almak için iyi bir fikir değil çünkü m() burada aramak kesinlikle gerekli değil, eğer 'SQL-injection güvenlik delik olurdu ben manuel burada kaçan ile mysql_ arabirimini kullanarak değilim;. siz mysqli_ veya PDO kullanarak Parametrelenmiş sorgu ile kapalı genellikle çok daha iyi nereye . bulunan bu SQL kaçan endişe önler aynı u() 's URL kodlama için de geçerli:.. tamsayılar için gerekli, ancak kullanma alışkanlığı içine almak genellikle değmez)

Basit bir site için, bu Tamam olurdu. Birçok kategori ile daha büyük bir site için sizin gibi yapabileceği, hangi tek bir sorguda tüm ürünleri almak isteyebilirsiniz:

SELECT omc_product.id, omc_product.name, omc_product.category_id
FROM omc_product
JOIN omc_category ON omc_category.id=omc_product.category_id
WHERE omc_product.status='active' AND omc_category.status='active'
ORDER BY category_id, id

ve sonra her satırda, geri almak category_id önceki satırdan yana değişip değişmediğini kontrol edin. O varsa, çıkış name ve shortdesc, önceki sorgudan gelen category nesne. (Yapmak istemeyebilirsiniz ama, aynı zamanda onları almak için çok yukarıdaki sorguda Yoksa omc_category.name seçebilir ve shortdesc bu açıklamaları oldukça uzun olabilir eğer.)

Ayrıca, tablolar arasında uygun FOREIGN KEY referansları ile bir InnoDB tablo kullanmayı düşünün. (FULLTEXT hariç) bugün MyISAM kullanarak biraz iyi bir sebebi var.

`parentid` int(11) NOT NULL,

Oh, ben size hiyerarşik kategoriler var anlamına gelmez umarım! Bu her şeyi daha karmaşık hale getirecektir. Ayrıca bakınız: iç içe setleri.

SELECT A.`id` AS catid, A.`name` AS catname, ..., B.`id` AS prodid, ...
FROM `omc_category` A LEFT JOIN `omc_product` B ON (B.`category_id` = A.`id`)
ORDER BY A.`id`

Hatta kategoriye göre sipariş etmek gerekir dind't, ama daha kolay sonuç işleme yapar.

NOT: Sonuç kümesi çok büyükse, ben Lo'oris yaklaşımı lehine olacaktır.