// Pagination $page = isset($_GET['page']) ? (int)$_GET['page'] : 1; // Force 30 products per page on homepage $records_per_page = 30; $offset = ($page - 1) * $records_per_page; // Search and filters $search = isset($_GET['search']) ? sanitize_input($_GET['search']) : ''; $category_filter = isset($_GET['category']) ? (int)$_GET['category'] : 0; $sort = isset($_GET['sort']) ? sanitize_input($_GET['sort']) : 'newest'; // Build query conditions $where_conditions = ['p.is_active = 1']; $params = []; if ($search) { $where_conditions[] = '(p.name LIKE ? OR p.description LIKE ? OR p.brand LIKE ?)'; $params[] = "%$search%"; $params[] = "%$search%"; $params[] = "%$search%"; } if ($category_filter) { $where_conditions[] = 'p.category_id = ?'; $params[] = $category_filter; } $where_clause = implode(' AND ', $where_conditions); // Sort options - implement proper tie-breakers $order_by = 'p.created_at DESC'; switch ($sort) { case 'price_low': $order_by = 'COALESCE(p.sale_price, p.price) ASC'; break; case 'price_high': $order_by = 'COALESCE(p.sale_price, p.price) DESC'; break; case 'popular': $order_by = 'p.clicks DESC, p.created_at DESC'; break; case 'featured': $order_by = 'p.featured DESC, p.created_at DESC'; break; case 'newest': $order_by = 'p.created_at DESC'; break; } // Get total count with caching $count_cache_key = "product_count_" . md5($where_clause . serialize($params)); $total_records = cache_content($count_cache_key, function() use ($db, $where_clause, $params) { $count_query = "SELECT COUNT(*) as total FROM products p WHERE $where_clause"; $count_stmt = $db->prepare($count_query); $count_stmt->execute($params); return $count_stmt->fetch(PDO::FETCH_ASSOC)['total']; }, 1800); // Cache for 30 minutes // Get products with caching (skip caching for random sort) $products_cache_duration = 1800; // default 30 minutes if ($sort === 'random') { // Random page offset to avoid heavy RAND() per row $max_offset = max(0, (int)$total_records - $records_per_page); $offset = $max_offset > 0 ? random_int(0, $max_offset) : 0; // Direct query without caching for random selection $query = "SELECT p.*, c.name as category_name FROM products p LEFT JOIN categories c ON p.category_id = c.id WHERE $where_clause ORDER BY p.created_at DESC LIMIT $records_per_page OFFSET $offset"; $stmt = $db->prepare($query); $stmt->execute($params); $products = $stmt->fetchAll(PDO::FETCH_ASSOC); } else { // Shorter cache for popularity to reflect click updates if ($sort === 'popular') { $products_cache_duration = 300; // 5 minutes } $products_cache_key = "products_" . md5($where_clause . $order_by . $records_per_page . $offset . serialize($params)); $products = cache_content($products_cache_key, function() use ($db, $where_clause, $order_by, $records_per_page, $offset, $params) { $query = "SELECT p.*, c.name as category_name FROM products p LEFT JOIN categories c ON p.category_id = c.id WHERE $where_clause ORDER BY $order_by LIMIT $records_per_page OFFSET $offset"; $stmt = $db->prepare($query); $stmt->execute($params); return $stmt->fetchAll(PDO::FETCH_ASSOC); }, $products_cache_duration); // Cache duration varies by sort } // Get categories for navigation with caching $categories = cache_content('categories_nav', function() use ($db) { $cat_query = "SELECT id, name, slug FROM categories WHERE is_active = 1 ORDER BY name"; $cat_stmt = $db->prepare($cat_query); $cat_stmt->execute(); return $cat_stmt->fetchAll(PDO::FETCH_ASSOC); }, 3600); // Cache for 1 hour // Get featured products for hero section with caching $featured_products = cache_content('featured_products_hero', function() use ($db) { $featured_query = "SELECT p.*, c.name as category_name FROM products p LEFT JOIN categories c ON p.category_id = c.id WHERE p.is_active = 1 AND p.featured = 1 ORDER BY p.created_at DESC LIMIT 6"; $featured_stmt = $db->prepare($featured_query); $featured_stmt->execute(); return $featured_stmt->fetchAll(PDO::FETCH_ASSOC); }, 1800); // Cache for 30 minutes // Get random products for hero section (no caching for random results) $hero_products_query = "SELECT p.*, c.name as category_name FROM products p LEFT JOIN categories c ON p.category_id = c.id WHERE p.is_active = 1 ORDER BY RAND() LIMIT 1"; $hero_products_stmt = $db->prepare($hero_products_query); $hero_products_stmt->execute(); $hero_products = $hero_products_stmt->fetchAll(PDO::FETCH_ASSOC); // Get popular products for sidebar (based on clicks) $popular_query = "SELECT p.*, c.name as category_name FROM products p LEFT JOIN categories c ON p.category_id = c.id WHERE p.is_active = 1 ORDER BY p.clicks DESC, p.created_at DESC LIMIT 5"; $popular_stmt = $db->prepare($popular_query); $popular_stmt->execute(); $popular_products = $popular_stmt->fetchAll(PDO::FETCH_ASSOC); // Get popular categories (categories with most products) $popular_categories_query = "SELECT c.*, COUNT(p.id) as product_count FROM categories c LEFT JOIN products p ON c.id = p.category_id AND p.is_active = 1 WHERE c.is_active = 1 GROUP BY c.id HAVING product_count > 0 ORDER BY product_count DESC LIMIT 6"; $popular_categories_stmt = $db->prepare($popular_categories_query); $popular_categories_stmt->execute(); $popular_categories = $popular_categories_stmt->fetchAll(PDO::FETCH_ASSOC); $pagination = paginate($total_records, $records_per_page, $page); ?> Shop Smarter with PriceRoots – Best Deals & Discounts

Warning: Undefined variable $page in /home/jaffson/web/priceroots.com/public_html/index.php on line 194

Showing
Warning: Undefined variable $offset in /home/jaffson/web/priceroots.com/public_html/index.php on line 388

Warning: Undefined variable $total_records in /home/jaffson/web/priceroots.com/public_html/index.php on line 388
-
Warning: Undefined variable $offset in /home/jaffson/web/priceroots.com/public_html/index.php on line 388

Warning: Undefined variable $records_per_page in /home/jaffson/web/priceroots.com/public_html/index.php on line 388

Warning: Undefined variable $total_records in /home/jaffson/web/priceroots.com/public_html/index.php on line 388
0 of
Warning: Undefined variable $total_records in /home/jaffson/web/priceroots.com/public_html/index.php on line 389

Deprecated: number_format(): Passing null to parameter #1 ($num) of type float is deprecated in /home/jaffson/web/priceroots.com/public_html/index.php on line 389
0 products
Warning: Undefined variable $search in /home/jaffson/web/priceroots.com/public_html/index.php on line 390

No products found

Try adjusting your search criteria or browse all categories.

View All Products

Warning: Undefined variable $pagination in /home/jaffson/web/priceroots.com/public_html/index.php on line 465

Warning: Trying to access array offset on value of type null in /home/jaffson/web/priceroots.com/public_html/index.php on line 465