Задать вопрос

Почему при удалении товаров из корзины не удается добавить их вновь?

В случае, если на странице 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 ();
  • Вопрос задан
  • 138 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы