Способы отображения каталога товаров на PHP
Вывод списка товаров в PHP
Наиболее эффективный способ вывода списка товаров основан на разделении логики доступа к данным и представления. Рекомендуется использовать PDO с подготовленными запросами для взаимодействия с базой данных и отдельный файл шаблона для отображения. Это обеспечивает безопасность, читаемость и поддерживаемость.
Реализация с PDO и репозиторием:
// config.php
define('DB_HOST', 'localhost');
define('DB_NAME', 'shop');
define('DB_USER', 'root');
define('DB_PASS', '');
// db.php
try {
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Ошибка подключения: ' . $e->getMessage());
}
// ProductRepository.php
class ProductRepository {
private $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function getAll(): array {
$stmt = $this->pdo->query('SELECT id, name, price, image FROM products');
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
// index.php
$repo = new ProductRepository($pdo);
$products = $repo->getAll();
include 'templates/products.php';
// templates/products.php
<div class='products'>
<?php foreach ($products as $product): ?>
<div class='product'>
<h3><?= htmlspecialchars($product['name']) ?></h3>
<p>Цена: <?= number_format($product['price'], 2) ?> руб.</p>
<img src='<?= htmlspecialchars($product['image']) ?>' alt='<?= htmlspecialchars($product['name']) ?>'>
</div>
<?php endforeach; ?>
</div>
вывести список php (вывести список в php)
Пояснения:
- PDO подключается один раз, настройки вынесены в конфиг.
- Класс ProductRepository изолирует логику запросов.
- Шаблон использует экранирование htmlspecialchars и number_format.
- При необходимости легко заменить хранилище данных или способ отображения.
Типичные ошибки:
- Отсутствие экранирования - уязвимость XSS. Решение: всегда использовать htmlspecialchars.
- Необработанное исключение PDOException - сайт падает. Решение: блок try-catch с логированием.
- Неправильные имена столбцов в SQL. Решение: проверка схемы БД или использование констант.
Как вывести статический список товаров без базы данных?
Для прототипов или небольших каталогов можно задать товары в массиве.
$products = [
['id' => 1, 'name' => 'Телефон', 'price' => 15000],
['id' => 2, 'name' => 'Ноутбук', 'price' => 60000],
];
foreach ($products as $p) {
echo '<div>' . $p['name'] . ' - ' . $p['price'] . ' руб.</div>' . '\n';
}
List php product (вывод списка товаров в php)
Преимущество - простота. Недостаток - данные смешаны с логикой, сложно поддерживать.
Как использовать MySQLi для вывода товаров?
MySQLi поддерживает подготовленные запросы. Пример процедурного стиля:
$mysqli = mysqli_connect('localhost', 'root', '', 'shop');
if ($stmt = mysqli_prepare($mysqli, 'SELECT id, name, price FROM products WHERE active = 1')) {
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
echo '<div>' . $row['name'] . ': ' . $row['price'] . ' руб.</div>';
}
mysqli_stmt_close($stmt);
}
Lists contact php (вывод списка контактов в php)
Ошибка: не проверяется успешность prepare. Решение: проверять $stmt на false и выводить ошибку mysqli_error($mysqli).
Как применить PDO без отдельного шаблона?
Можно вывести данные прямо в index.php, но такой подход затрудняет разделение ответственности.
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', '');
$stmt = $pdo->query('SELECT name, price FROM products');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo '<div>' . htmlspecialchars($row['name']) . ': ' . $row['price'] . ' руб.</div>\n';
}
List php section (вывод списка разделов в php)
Как интегрировать Eloquent ORM (Laravel)?
В проекте на Laravel вывод товаров через модель Product:
$products = Product::where('active', 1)->get(['id', 'name', 'price']);
foreach ($products as $product) {
echo '<div>' . $product->name . ' - ' . $product->price . ' руб.</div>';
}
Eloquent обеспечивает удобный синтаксис, но требует фреймворка.
Ошибка: забыли импортировать модель. Решение: добавить use App\Models\Product;
Как организовать Repository в чистом PHP?
Этот вариант описан в rbase, но можно сделать интерфейс и реализацию.
interface ProductRepositoryInterface {
public function getAll(): array;
}
class PdoProductRepository implements ProductRepositoryInterface {
private $pdo;
public function __construct(PDO $pdo) { $this->pdo = $pdo; }
public function getAll(): array {
$stmt = $this->pdo->query('SELECT * FROM products');
return $stmt->fetchAll();
}
}
Расширенные примеры вывода списка товаров
Пример 1: Пагинация с PDO
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare('SELECT id, name, price FROM products LIMIT :limit OFFSET :offset');
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$products = $stmt->fetchAll();
foreach ($products as $p) {
echo '<div>' . $p['name'] . ' ...</div>';
}
$totalStmt = $pdo->query('SELECT COUNT(*) FROM products');
$total = $totalStmt->fetchColumn();
$pages = ceil($total / $perPage);
for ($i = 1; $i <= $pages; $i++) {
echo '<a href="?page=' . $i . '">' . $i . '</a> ';
}
<div>Товар 1 ...</div> <div>Товар 2 ...</div> <a href='?page=1'>1</a> <a href='?page=2'>2</a> ...
Пример 2: Поиск по названию товара
$search = isset($_GET['search']) ? $_GET['search'] : '';
$stmt = $pdo->prepare('SELECT name, price FROM products WHERE name LIKE :search');
$stmt->execute([':search' => '%' . $search . '%']);
$results = $stmt->fetchAll();
if ($results) {
foreach ($results as $row) {
echo '<div>' . htmlspecialchars($row['name']) . '</div>';
}
} else {
echo 'Товары не найдены.';
}
<div>Телефон</div> <div>Ноутбук</div>
Пример 3: Сортировка товаров по цене и имени
$orderBy = isset($_GET['order']) ? $_GET['order'] : 'name';
$allowed = ['name', 'price'];
if (!in_array($orderBy, $allowed)) {
$orderBy = 'name';
}
$stmt = $pdo->query('SELECT name, price FROM products ORDER BY ' . $orderBy . ' ASC');
$products = $stmt->fetchAll();
foreach ($products as $p) {
echo '<div>' . $p['name'] . ': ' . $p['price'] . ' руб.</div>';
}
<div>Ноутбук: 60000 руб.</div> <div>Телефон: 15000 руб.</div>
Пример 4: Вывод из JSON файла (без БД)
$json = file_get_contents('products.json');
$products = json_decode($json, true);
foreach ($products as $product) {
echo '<div>' . $product['name'] . ' - ' . $product['price'] . ' руб.</div>';
}
<div>Телефон - 15000 руб.</div> <div>Ноутбук - 60000 руб.</div>