Способы отображения каталога товаров на PHP

Раздел: 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>

Вывод списка товаров в PHP - comments

En
List php product (php)