В этой статье мы рассмотрим базовые шаги по созданию простого интернет-магазина с использованием PHP и MySQL. Цель — дать понимание архитектуры и основных компонентов, которые можно в дальнейшем расширять под свои задачи.
Для работы понадобятся:
Создайте базу данных и необходимые таблицы:
CREATE DATABASE shop; USE shop; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE products ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, price DECIMAL(10, 2) NOT NULL, image_url VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, product_id INT NOT NULL, quantity INT DEFAULT 1, status ENUM('new', 'processed', 'shipped', 'cancelled') DEFAULT 'new', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (product_id) REFERENCES products(id) );
Ниже приведены минимальные реализации основных файлов проекта. Разместите их в корне вашего веб-проекта.
<?php $host = 'localhost'; $dbname = 'shop'; $username = 'root'; // замените на ваше имя пользователя БД $password = ''; // замените на ваш пароль try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $pdo-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Ошибка подключения к БД: " . $e-> getMessage()); } ?>
<?php session_start(); require_once 'config.php'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = trim($_POST['username']); $email = trim($_POST['email']); $password = $_POST['password']; if (empty($username) || empty($email) || empty($password)) { $error = "Все поля обязательны."; } else { $stmt = $pdo-> prepare("SELECT id FROM users WHERE email = ? OR username = ?"); $stmt-> execute([$email, $username]); if ($stmt-> fetch()) { $error = "Пользователь с таким email или логином уже существует."; } else { $hash = password_hash($password, PASSWORD_DEFAULT); $pdo-> prepare("INSERT INTO users (username, email, password_hash) VALUES (?, ?, ?)") -> execute([$username, $email, $hash]); header("Location: login.php"); exit; } } } ?> <h2> Регистрация</h2> <?php if (!empty($error)): ?> <p style="color:red;"> <?php echo htmlspecialchars($error); ?> </p> <?php endif; ?> <form method="POST"> Логин: <input type="text" name="username" required> <br> <br> Email: <input type="email" name="email" required> <br> <br> Пароль: <input type="password" name="password" required> <br> <br> <button type="submit"> Зарегистрироваться</button> </form> <a href="login.php"> Уже есть аккаунт? Войти</a>
<?php session_start(); require_once 'config.php'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $email = trim($_POST['email']); $password = $_POST['password']; $stmt = $pdo-> prepare("SELECT id, username, password_hash FROM users WHERE email = ?"); $stmt-> execute([$email]); $user = $stmt-> fetch(); if ($user && password_verify($password, $user['password_hash'])) { $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; header("Location: index.php"); exit; } else { $error = "Неверный email или пароль."; } } ?> <h2> Вход</h2> <?php if (!empty($error)): ?> <p style="color:red;"> <?php echo htmlspecialchars($error); ?> </p> <?php endif; ?> <form method="POST"> Email: <input type="email" name="email" required> <br> <br> Пароль: <input type="password" name="password" required> <br> <br> <button type="submit"> Войти</button> </form> <a href="register.php"> Нет аккаунта? Зарегистрироваться</a>
<?php session_start(); require_once 'config.php'; $stmt = $pdo-> query("SELECT id, name, price, image_url FROM products ORDER BY created_at DESC"); $products = $stmt-> fetchAll(); ?> <h1> Интернет-магазин</h1> <?php if (!empty($_SESSION['user_id'])): ?> <p> Привет, <?php echo htmlspecialchars($_SESSION['username']); ?> ! <a href="logout.php"> Выйти</a> </p> <?php else: ?> <p> <a href="login.php"> Войдите</a> или <a href="register.php"> зарегистрируйтесь</a> </p> <?php endif; ?> <h2> Товары</h2> <?php if ($products): ?> <ul> <?php foreach ($products as $p): ?> <li> <?php if (!empty($p['image_url'])): ?> <img src="<?php echo htmlspecialchars($p['image_url']); ?> " alt="<?php echo htmlspecialchars($p['name']); ?> " width="100"> <?php endif; ?> <h3> <a href="product.php?id=<?php echo $p['id']; ?> "> <?php echo htmlspecialchars($p['name']); ?> </a> </h3> Цена: <?php echo number_format($p['price'], 2, ',', ' '); ?> руб. </li> <?php endforeach; ?> </ul> <?php else: ?> <p> Товары отсутствуют.</p> <?php endif; ?>
<?php session_start(); require_once 'config.php'; if (!isset($_GET['id']) || !is_numeric($_GET['id'])) { die("Товар не найден."); } $productId = (int)$_GET['id']; $stmt = $pdo-> prepare("SELECT * FROM products WHERE id = ?"); $stmt-> execute([$productId]); $product = $stmt-> fetch(); if (!$product) { die("Товар не найден."); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (empty($_SESSION['user_id'])) { $error = "Требуется авторизация для оформления заказа."; } else { $quantity = (int)($_POST['quantity'] ?? 1); if ($quantity < 1) $quantity = 1; $pdo-> prepare("INSERT INTO orders (user_id, product_id, quantity) VALUES (?, ?, ?)") -> execute([$_SESSION['user_id'], $productId, $quantity]); // Простое уведомление админу mail('admin@example.com', 'Новый заказ', "Пользователь {$_SESSION['username']} заказал {$product['name']} ({$quantity} шт.)"); $success = "Заказ успешно оформлен!"; } } ?> <h1> <?php echo htmlspecialchars($product['name']); ?> </h1> <?php if (!empty($product['image_url'])): ?> <img src="<?php echo htmlspecialchars($product['image_url']); ?> " alt="<?php echo htmlspecialchars($product['name']); ?> "> <?php endif; ?> <p> <?php echo nl2br(htmlspecialchars($product['description'])); ?> </p> <p> <strong> Цена:</strong> <?php echo number_format($product['price'], 2, ',', ' '); ?> руб.</p> <?php if (!empty($success)): ?> <p style="color:green;"> <?php echo $success; ?> </p> <?php else: ?> <form method="POST"> <label> Количество: <input type="number" name="quantity" value="1" min="1"> </label> <br> <br> <button type="submit"> Купить</button> </form> <?php endif; ?> <p> <a href="index.php"> ← Назад к товарам</a> </p>
<?php session_start(); session_destroy(); header("Location: index.php"); exit; ?>
Создайте папку admin
и файл admin/index.php
:
<?php session_start(); require_once '../config.php'; // Простейшая проверка: только авторизованные (в реальности — роль админа!) if (empty($_SESSION['user_id'])) { header("Location: ../login.php"); exit; } $stmt = $pdo-> query("SELECT o.id, u.username, p.name, o.quantity, o.status, o.created_at FROM orders o JOIN users u ON o.user_id = u.id JOIN products p ON o.product_id = p.id ORDER BY o.created_at DESC"); $orders = $stmt-> fetchAll(); ?> <h1> Админка: заказы</h1> <p> <a href="../index.php"> ← На сайт</a> </p> <table border="1" cellpadding="8"> <tr> <th> ID заказа</th> <th> Пользователь</th> <th> Товар</th> <th> Кол-во</th> <th> Статус</th> <th> Дата</th> </tr> <?php foreach ($orders as $o): ?> <tr> <td> <?php echo $o['id']; ?> </td> <td> <?php echo htmlspecialchars($o['username']); ?> </td> <td> <?php echo htmlspecialchars($o['name']); ?> </td> <td> <?php echo $o['quantity']; ?> </td> <td> <?php echo htmlspecialchars($o['status']); ?> </td> <td> <?php echo $o['created_at']; ?> </td> </tr> <?php endforeach; ?> </table>
htmlspecialchars()
.Этот каркас можно расширять:
Главное — начать с простого, протестировать каждую часть и постепенно усложнять систему.
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!