В случае, если на странице mysite.local/eshop/catalog.php добавить все товары в корзину, а затем на странице mysite.local/eshop/basket.php удалить все товары из корзины, то при повторном добавлении ничего не происходит.
Можете подсказать почему?
Страница catalog.php:<?php // подключение библиотек
require "inc/lib.inc.php";
require "inc/config.inc.php";
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Каталог товаров</title>
</head>
<body>
<p>Товаров в <a href="basket.php">корзине</a>: <?= $count?></p>
<table border="1" cellpadding="5" cellspacing="0" width="100%">
<tr>
<th>Название</th>
<th>Автор</th>
<th>Год издания</th>
<th>Цена, руб.</th>
<th>В корзину</th>
</tr>
<?php
$goods = selectAllItems();
foreach($goods as $item):
?>
<tr>
<td><?= $item['title']?></td>
<td><?= $item['author']?></td>
<td><?= $item['pubyear']?></td>
<td><?= $item['price']?></td>
<td> <a href="add2basket.php?id=<?= $item['id']?>">В корзину</a></td>
</tr>
<? endforeach; ?>
</table>
</body>
</html>
Страница basket.php:<?php
// подключение библиотек
require "inc/lib.inc.php";
require "inc/config.inc.php";
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Корзина пользователя</title>
</head>
<body>
<h1>Ваша корзина</h1>
<?php
$goods = myBasket();
$sum = 0;
if (!$count) {
echo "<p> Корзина пуста! Вернитесь в <a href='catalog.php'>каталог</a></p>";
exit;
} else {
echo "<p> Вернуться в <a href='catalog.php'>каталог</a> </p>";
}
?>
<table border="1" cellpadding="5" cellspacing="0" width="100%">
<tr>
<th>N п/п</th>
<th>Название</th>
<th>Автор</th>
<th>Год издания</th>
<th>Цена, руб.</th>
<th>Количество</th>
<th>Удалить</th>
</tr>
<?php foreach($goods as $item): ?>
<tr>
<td><?= $item['id']?></td>
<td><?= $item['title']?></td>
<td><?= $item['author']?></td>
<td><?= $item['pubyear']?></td>
<td><?= $item['price']?></td>
<td><?= $item['quantity']?></td>
<td><a href="delete_from_basket.php?id=<?= $item['id']?>">Удалить</a></td>
</tr>
<?
$sum = $sum + $item['price'] * $item['quantity'];
endforeach;
?>
</table>
<p>Всего товаров в корзине на сумму: <?= $sum ?> руб.</p>
<div align="center">
<input type="button" value="Оформить заказ!" onClick="location.href='orderform.php'" />
</div>
</body>
</html>
Страница для удаления из корзины delete_from_basket.php :<?php
// подключение библиотек
require "inc/lib.inc.php";
require "inc/config.inc.php";
deleteItemFromBasket($_GET['id']);
header("Location: http://mysite.local/eshop/catalog.php", true, 301);
Страница для добавления в корзину add2basket.php :<?php
require "inc/lib.inc.php";
require "inc/config.inc.php";
add2Basket($_GET['id']);
header("Location: http://mysite.local/eshop/catalog.php", true, 301);
Основные функции lib.inc.php :<?php
function addItemToCatalog ($title, $author, $pubyear, $price) { // сохраняет новый товар в таблицу catalog и принимающую в виде аргументов название, автора, год издания и цену товара
global $link;
$sql = 'INSERT INTO catalog (title, author, pubyear, price) VALUES (?, ?, ?, ?)';
if (!$stmt = mysqli_prepare($link, $sql)) { // Подготавливает SQL-запрос и возвращает указатель на это выражение, который может использоваться для дальнейших операций с этим выражением. Запрос должен состоять из одного SQL выражения.
return false;
} else {
mysqli_stmt_bind_param($stmt, "ssii", $title, $author, $pubyear, $price); // Привязывает переменные к меткам параметров в SQL-выражении, которое было подготовлено фукнцией mysqli_prepare().
mysqli_stmt_execute($stmt); // Выполняет запрос, который был ранее подготовлен функцией mysqli_prepare(). Если в запросе есть метки параметров, они будут заменены привязанными к ним значениями.
mysqli_stmt_close($stmt); // Закрывает подготовленный запрос. mysqli_stmt_close() также освобождает дескриптор запроса. Если по текущему запросу получен результат, то эта функция очищает его для того, чтобы мог быть выполнен следующий запрос.
return true;
}
}
function selectAllItems() { // возвращает все содержимое каталога товаров в виде ассоциативного массива
global $link;
$sql = 'SELECT id, title, author, pubyear, price FROM catalog';
if (!$result = mysqli_query($link, $sql)) { // Выполняет запрос query к базе данных.
return false;
} else {
$items = mysqli_fetch_all($result, MYSQLI_ASSOC); // извлекает все строки из результирующего набора и помещает их в ассоциативный массив
mysqli_free_result($result); // Освобождает память, занятую результатами запроса.
return $items;
}
}
function saveBasket() { // сохраняет корзину с товарами в куки
global $basket;
$basket = base64_encode(serialize($basket)); //serialize() - генерирует пригодное для хранения представление переменной.
// Это полезно для хранения или передачи значений PHP между скриптами без потери их типа и структуры.
// base64_encode() -- кодирует в base64. Эта кодировка предназначена для корректной передачи бинарных данных по протоколам,
// не поддерживающим 8-битную передачу, например, для отправки тела письма.
setcookie('basket', $basket, 0x7FFFFFFF); // setcookie() задает cookie, которое будет передано клиенту вместе с другими HTTP-заголовками.
}
function basketInit() { // создает, либо загружает в переменную $basket корзину с товарами, либо создает новую корзину с идентификатором заказа
global $basket, $count;
if (!isset($_COOKIE['basket'])) { // определяет, была ли установлена переменная значением отличным от NULL
$basket = ['orderid' => uniqid()]; // uniqid — сгенерировать уникальный ID
saveBasket();
} else {
$basket = unserialize(base64_decode($_COOKIE['basket']));
$count = count($basket) - 1;
}
}
function add2Basket($id) { // добавляет товар в корзину пользователя и принимает к качестве аргумента идентификатор товара
global $basket;
$basket[$id] = 1;
saveBasket();
}
function myBasket() { //возвращает всю пользовательскую корзину в виде ассоциативного массива
global $link, $basket;
$goods = array_keys($basket); //возвращает все или некоторое подмножество ключей массива
array_shift($goods); // извлекает первый элемент массива
if (!$goods) {
return false;
};
$ids = implode(",", $goods); // объединяет элементы массива в строку
$sql = "SELECT id, author, title, pubyear, price FROM catalog WHERE id IN ($ids)";
if (!$result = mysqli_query($link, $sql)) {
return false;
};
$items = result2Array($result);
mysqli_free_result($result); //освобождает память, занятую результатами запроса.
return $items;
}
function result2Array($data) { //принимает результат выполнения функции myBasket и возвращает ассоциативный массив товаров, дополненный их количеством
global $basket;
$arr = [];
while($row = mysqli_fetch_assoc($data)) { //извлекает результирующий ряд в виде ассоциативного массива
$row['quantity'] = $basket[$row['id']];
$arr[] = $row;
};
return $arr;
}
function deleteItemFromBasket($id) { // удаляет товар из корзины, принимая в качестве аргумента его идентификатор
global $basket;
unset($basket[$id]); // удаляет элемент из массива
saveBasket();
}
Конфиги, подключение к БД config.inc.php :<?php
const DB_HOST = "localhost";
const DB_LOGIN = "root";
const DB_PASSWORD = "";
const DB_NAME = "eshop";
const ORDERS_LOG = "orders.log";
$basket = [];
$count = 0;
$link = mysqli_connect(DB_HOST, DB_LOGIN, DB_PASSWORD, DB_NAME);
if(!$link) {
echo 'Ошибка: ' . mysqli_connect_errno() . ':' . mysqli_connect_error();
}
basketInit ();