Eso es porque products_name y products_description están en la tabla products_description (o para ser más específicos en TABLE_PRODUCTS_DESCRIPTION), no en la tabla de productos (TABLE_PRODUCTS).
Para obtener toda la información básica (excepto los atributos), debe ejecutar la siguiente consulta:
$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>';
}
Sin embargo, tenga en cuenta que este código NO obtener productos de una categoría específica:obtiene todos los productos, incluso aquellos que están desactivados. Hay varias formas de obtener productos de una categoría específica, pero varían en rendimiento. Desafortunadamente, no hay una mejor manera de hacer esto porque depende de los datos. Si los productos que desea recuperar pertenecen a la categoría con id_categorías de 5 y es su categoría principal, basta con agregar a la primera consulta "WHERE master_categories_id =5". Pero si la categoría no es la categoría maestra para esos productos, las cosas se complican un poco porque necesitamos acceder a la tabla products_to_categories, lo que provoca un impacto en el rendimiento de los sitios con muchos productos. Si no sabe/no le importa mucho el rendimiento, puede cambiar la primera consulta a:(suponiendo que ya conoce las categorías_id de su categoría):
$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']);
Para deshacerse de los productos inactivos, ejecute
$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']);
(En realidad, verificar pd.products_id NO ES NULO no es necesario porque ya verificamos pd.language_id).
EDITAR Versión sin atributos
$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>';
}