diff --git a/.perm_test_apache b/.perm_test_apache new file mode 100644 index 0000000..e69de29 diff --git a/.perm_test_exec b/.perm_test_exec new file mode 100644 index 0000000..e69de29 diff --git a/admin.php b/admin.php new file mode 100644 index 0000000..d2eff22 --- /dev/null +++ b/admin.php @@ -0,0 +1,194 @@ + + + + + + + Админ-панель - Вход + + + +
+
+
+

Вход в админ-панель

+
+
+ + +
+ +
+ + +
+
+
+
+ + + prepare('INSERT INTO bouquets (name, description, price, image_url) VALUES (?, ?, ?, ?)'); + $stmt->execute([$name, $description, $price, $image_url]); + header('Location: admin.php'); + exit; +} + +// Редактирование букета +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['edit_bouquet'])) { + $id = $_POST['id']; + $name = $_POST['name']; + $description = $_POST['description']; + $price = $_POST['price']; + $image_url = $_POST['image_url']; + + $pdo = db(); + $stmt = $pdo->prepare('UPDATE bouquets SET name = ?, description = ?, price = ?, image_url = ? WHERE id = ?'); + $stmt->execute([$name, $description, $price, $image_url, $id]); + header('Location: admin.php'); + exit; +} + +// Удаление букета +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_bouquet'])) { + $id = $_POST['id']; + $pdo = db(); + $stmt = $pdo->prepare('DELETE FROM bouquets WHERE id = ?'); + $stmt->execute([$id]); + header('Location: admin.php'); + exit; +} + + +// --- Получение данных --- +$pdo = db(); +$bouquets = $pdo->query('SELECT * FROM bouquets ORDER BY id DESC')->fetchAll(); + +$edit_bouquet_data = null; +if (isset($_GET['edit'])) { + $id = $_GET['edit']; + $stmt = $pdo->prepare('SELECT * FROM bouquets WHERE id = ?'); + $stmt->execute([$id]); + $edit_bouquet_data = $stmt->fetch(); +} + +?> + + + + + + Админ-панель + + + + + +
+
+ +
+

+
+ + + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + + Отмена + + + +
+
+ + +
+

Список букетов

+ + + + + + + + + + + + + + + + + + + + + +
IDФотоНазваниеЦенаДействия
+ Ред. +
+ + +
+
+
+
+
+ + diff --git a/admin/config.php b/admin/config.php deleted file mode 100644 index 769a370..0000000 --- a/admin/config.php +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/admin/index.php b/admin/index.php deleted file mode 100644 index 8d8fc7f..0000000 --- a/admin/index.php +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - Admin Login - - - -
-
-
-
-
-

Admin Login

-
-
- - -
-
- - -
- - - - -
-
-
-
-
-
- - \ No newline at end of file diff --git a/assets/pasted-20250911-144550-1391137a.png b/assets/pasted-20250911-144550-1391137a.png new file mode 100644 index 0000000..cf2ec89 Binary files /dev/null and b/assets/pasted-20250911-144550-1391137a.png differ diff --git a/assets/pasted-20250911-145034-379d8f9f.jpg b/assets/pasted-20250911-145034-379d8f9f.jpg new file mode 100644 index 0000000..87d28b3 Binary files /dev/null and b/assets/pasted-20250911-145034-379d8f9f.jpg differ diff --git a/assets/pasted-20250912-055700-2ffe9102.webp b/assets/pasted-20250912-055700-2ffe9102.webp new file mode 100644 index 0000000..695682b Binary files /dev/null and b/assets/pasted-20250912-055700-2ffe9102.webp differ diff --git a/assets/pasted-20250912-055950-2c69346a.jpg b/assets/pasted-20250912-055950-2c69346a.jpg new file mode 100644 index 0000000..95e7ec7 Binary files /dev/null and b/assets/pasted-20250912-055950-2c69346a.jpg differ diff --git a/assets/pasted-20250912-060344-25dc7fb1.png b/assets/pasted-20250912-060344-25dc7fb1.png new file mode 100644 index 0000000..5d8cef5 Binary files /dev/null and b/assets/pasted-20250912-060344-25dc7fb1.png differ diff --git a/assets/pasted-20250912-060647-670fa2ea.png b/assets/pasted-20250912-060647-670fa2ea.png new file mode 100644 index 0000000..19c4af3 Binary files /dev/null and b/assets/pasted-20250912-060647-670fa2ea.png differ diff --git a/assets/pasted-20250912-061014-fa7d3929.png b/assets/pasted-20250912-061014-fa7d3929.png new file mode 100644 index 0000000..711f5a6 Binary files /dev/null and b/assets/pasted-20250912-061014-fa7d3929.png differ diff --git a/assets/pasted-20250912-061230-643b547e.png b/assets/pasted-20250912-061230-643b547e.png new file mode 100644 index 0000000..38b5be6 Binary files /dev/null and b/assets/pasted-20250912-061230-643b547e.png differ diff --git a/assets/pasted-20250912-061518-a2e75345.png b/assets/pasted-20250912-061518-a2e75345.png new file mode 100644 index 0000000..7f1b2ef Binary files /dev/null and b/assets/pasted-20250912-061518-a2e75345.png differ diff --git a/assets/pasted-20250912-062228-c4ca0869.png b/assets/pasted-20250912-062228-c4ca0869.png new file mode 100644 index 0000000..38b5be6 Binary files /dev/null and b/assets/pasted-20250912-062228-c4ca0869.png differ diff --git a/assets/pasted-20250912-162635-e80fb623.png b/assets/pasted-20250912-162635-e80fb623.png new file mode 100644 index 0000000..a75148e Binary files /dev/null and b/assets/pasted-20250912-162635-e80fb623.png differ diff --git a/assets/pasted-20250912-164546-80d36162.png b/assets/pasted-20250912-164546-80d36162.png new file mode 100644 index 0000000..a0e0c83 Binary files /dev/null and b/assets/pasted-20250912-164546-80d36162.png differ diff --git a/assets/pasted-20250912-164950-93be8050.png b/assets/pasted-20250912-164950-93be8050.png new file mode 100644 index 0000000..ca574c9 Binary files /dev/null and b/assets/pasted-20250912-164950-93be8050.png differ diff --git a/db/migrations/001_initial_schema.sql b/db/migrations/001_initial_schema.sql new file mode 100644 index 0000000..9325f6d --- /dev/null +++ b/db/migrations/001_initial_schema.sql @@ -0,0 +1,31 @@ + +CREATE TABLE IF NOT EXISTS `bouquets` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `name` VARCHAR(255) NOT NULL, + `description` TEXT, + `price` DECIMAL(10, 2) NOT NULL, + `image_url` VARCHAR(255) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `orders` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `customer_name` VARCHAR(255) NOT NULL, + `bouquet_id` INT NOT NULL, + `phone` VARCHAR(50) NOT NULL, + `address` TEXT NOT NULL, + `delivery_date` DATE NOT NULL, + `order_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`bouquet_id`) REFERENCES `bouquets`(`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS `migrations` ( + `migration` VARCHAR(255) NOT NULL, + PRIMARY KEY (`migration`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Insert some sample bouquets +INSERT INTO `bouquets` (`name`, `description`, `price`, `image_url`) VALUES +('Classic Rose Bouquet', 'A beautiful bouquet of one dozen red roses.', 45.99, 'https://picsum.photos/seed/rose-bouquet/800/600'), +('Sunny Day Bouquet', 'A cheerful mix of sunflowers and white daisies.', 35.50, 'https://picsum.photos/seed/sunflower-bouquet/800/600'), +('Elegant Lily Bouquet', 'Stunning white lilies for any occasion.', 55.00, 'https://picsum.photos/seed/lily-bouquet/800/600'), +('Vibrant Tulip Mix', 'A colorful assortment of fresh tulips.', 42.75, 'https://picsum.photos/seed/tulip-bouquet/800/600'); diff --git a/db/migrations/002_add_note_to_orders.sql b/db/migrations/002_add_note_to_orders.sql new file mode 100644 index 0000000..e321bc5 --- /dev/null +++ b/db/migrations/002_add_note_to_orders.sql @@ -0,0 +1 @@ +ALTER TABLE `orders` ADD COLUMN `note` TEXT NULL DEFAULT NULL AFTER `delivery_date`; \ No newline at end of file diff --git a/index.php b/index.php index 286f34c..e75fa33 100644 --- a/index.php +++ b/index.php @@ -1,190 +1,444 @@ prepare( - 'INSERT INTO orders (customer_name, phone, address, bouquet_id) VALUES (:customer_name, :phone, :address, :bouquet_id)' - ); - $statement->execute([ - ':customer_name' => $_POST['customer_name'], - ':phone' => $_POST['phone'], - ':address' => $_POST['address'], - ':bouquet_id' => (int)$_POST['bouquet_id'], - ]); - // Redirect or show success message - header('Location: ' . $_SERVER['PHP_SELF'] . '?order=success'); - exit; - } catch (PDOException $e) { - die("Order placement failed: " . $e->getMessage()); +// --- DB MIGRATIONS --- +try { + $pdo = db(); + $pdo->exec('CREATE TABLE IF NOT EXISTS `migrations` (`migration` VARCHAR(255) NOT NULL, PRIMARY KEY (`migration`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;'); + $executed_migrations_stmt = $pdo->query('SELECT migration FROM migrations'); + $executed_migrations = $executed_migrations_stmt->fetchAll(PDO::FETCH_COLUMN); + $migration_files = glob('db/migrations/*.sql'); + sort($migration_files); + foreach ($migration_files as $file) { + $migration_name = basename($file); + if (!in_array($migration_name, $executed_migrations)) { + $sql = file_get_contents($file); + $pdo->exec($sql); + $stmt = $pdo->prepare('INSERT INTO migrations (migration) VALUES (?)'); + $stmt->execute([$migration_name]); + } } +} catch (PDOException $e) { + error_log('Migration Error: ' . $e->getMessage()); } +// --- END DB MIGRATIONS --- + +$p_title = 'Цветочный магазин'; +$p_description = 'Красивые букеты на любой случай.'; try { - $pdoconnection = db(); - $statement = $pdoconnection->query('SELECT id, name, description, price, image_url FROM bouquets'); - $bouquets = $statement->fetchAll(); + $pdo = db(); + $stmt = $pdo->query('SELECT * FROM bouquets ORDER BY name ASC'); + $bouquets = $stmt->fetchAll(); } catch (PDOException $e) { - die("Database error: " . $e->getMessage()); + error_log('DB Error: ' . $e->getMessage()); + $bouquets = []; + $db_error = 'К сожалению, мы не смогли загрузить букеты в данный момент. Пожалуйста, попробуйте еще раз позже.'; } +$status_message = ''; +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $customer_name = trim($_POST['name'] ?? ''); + $bouquet_id = (int)($_POST['bouquet'] ?? 0); + $phone = trim($_POST['phone'] ?? ''); + $address = trim($_POST['address'] ?? ''); + $delivery_date = trim($_POST['delivery_date'] ?? ''); + $note = trim($_POST['note'] ?? ''); + + if (empty($customer_name) || empty($bouquet_id) || empty($phone) || empty($address) || empty($delivery_date)) { + $status_message = '
Пожалуйста, заполните все обязательные поля.
'; + } else { + try { + $sql = "INSERT INTO orders (customer_name, bouquet_id, phone, address, delivery_date, note) VALUES (:name, :bouquet, :phone, :address, :date, :note)"; + $stmt = $pdo->prepare($sql); + $stmt->execute([ + ':name' => $customer_name, + ':bouquet' => $bouquet_id, + ':phone' => $phone, + ':address' => $address, + ':date' => $delivery_date, + ':note' => $note + ]); + $status_message = '
Спасибо за ваш заказ! Мы скоро с вами свяжемся.
'; + } catch (PDOException $e) { + error_log('Order submission error: ' . $e->getMessage()); + $status_message = '
Не удалось обработать ваш заказ. Пожалуйста, попробуйте еще раз.
'; + } + } +} ?> - + - - - Flower Shop - + + + + <?= htmlspecialchars($p_title) ?> + - + + - -