Đó là bởi vì products_name và products_description nằm trong bảng products_description (hoặc cụ thể hơn trong TABLE_PRODUCTS_DESCRIPTION), không có trong các sản phẩm trong bảng (TABLE_PRODUCTS).
Để nhận được tất cả thông tin cơ bản (ngoại trừ các thuộc tính), bạn nên thực hiện truy vấn sau:
$q = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd ON(p.products_id = pd.products_id) WHERE language_id = " . (int)$_SESSION['languages_id']);
$items = array();
while(!$q->EOF) {
// let's get all attribues for product
$productInfo = $q->fields;
$qattr = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS_ATTRIBUTES . " WHERE products_id = " . (int)$q->fields['products_id']);
$attr = array();
while(!$qattr->EOF) {
$attr[] = $qattr->fields;
$qattr->MoveNext();
}
$productInfo['attributes'] = $attr;
$items[] = $productInfo;
$q->MoveNext();
}
// now let's output it
foreach($items as $item) {
echo '<p><a href="index.php?main_page=product_info&products_id='. $item['products_id'] .'"><img src="images/'. $item['products_image'].'" alt="'. $item['products_name'].'" title="'. $items['products_name'].'" /></a>';
echo $items['products_price'] . '</p>';
}
Tuy nhiên, lưu ý rằng mã này KHÔNG nhận sản phẩm từ danh mục cụ thể - nó nhận được tất cả các sản phẩm, ngay cả những sản phẩm đã ngừng hoạt động. Có một số cách để nhận sản phẩm từ danh mục cụ thể nhưng chúng khác nhau về hiệu suất. Thật không may, không có cách tốt nhất để làm điều này vì nó phụ thuộc vào dữ liệu. Nếu các sản phẩm Bạn muốn truy xuất thuộc danh mục có category_id là 5 và đó là danh mục chính của chúng, thì đủ để thêm vào truy vấn đầu tiên "WHERE master_categories_id =5". Nhưng nếu danh mục không phải là danh mục chính cho những sản phẩm đó thì mọi thứ sẽ phức tạp hơn một chút vì Chúng ta cần truy cập vào bảng products_to_categories, điều này gây ra mức tăng hiệu suất cho các trang web có nhiều sản phẩm. Nếu Bạn không biết / không quan tâm nhiều đến hiệu suất, Bạn có thể thay đổi truy vấn đầu tiên thành:(giả sử rằng Bạn đã biết category_id trong danh mục của Bạn):
$q = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd ON(p.products_id = pd.products_id LEFT JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c ON(p.products_id = p2c.products_id AND p2c.categories_id = YOUR_CATEGORY_ID) WHERE pd.products_id IS NOT NULL AND p2c.products_id IS NOT NULL AND language_id = " . (int)$_SESSION['languages_id']);
Để loại bỏ các sản phẩm không hoạt động, hãy thực thi
$q = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd ON(p.products_id = pd.products_id LEFT JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c ON(p.products_id = p2c.products_id AND p2c.categories_id = YOUR_CATEGORY_ID) WHERE products_status = 1 AND pd.products_id IS NOT NULL AND p2c.products_id IS NOT NULL AND language_id = " . (int)$_SESSION['languages_id']);
(Thực tế kiểm tra trên pd.products_id IS NOT NULL là không cần thiết vì Chúng tôi đã kiểm tra pd.language_id.)
CHỈNH SỬA Phiên bản không có thuộc tính
$q = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd ON(p.products_id = pd.products_id) WHERE language_id = " . (int)$_SESSION['languages_id']);
$items = array();
while(!$q->EOF) {
$items[] = $q->fields;
$q->MoveNext();
}
// now let's output it
foreach($items as $item) {
echo '<p><a href="index.php?main_page=product_info&products_id='. $item['products_id'] .'"><img src="images/'. $item['products_image'].'" alt="'. $item['products_name'].'" title="'. $items['products_name'].'" /></a>';
echo $items['products_price'] . '</p>';
}