powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Изменение количества товара в корзине
12 сообщений из 12, страница 1 из 1
Изменение количества товара в корзине
    #39238774
donjohn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Недавно начал изучать ПХП и в учебных целях делаю интернет-магазин. В общем корзину сделал, но проблема с изменением количества товара, у меня получается так, что при изменении количества у одного товара, оно меняется у всех товаров в корзине и никак не разберусь где косяк. Буду благодарен за помощь. Ниже структура массива корзины и код.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
// функция корзины
function saveOrder($datetime)
{
    global $link, $basket;
    $goods = myBasket();
    $stmt = mysqli_stmt_init($link);
    $sql = 'INSERT INTO orders(
                              title,
                              author,
                              pubyear,
                              price,
                              quantity,
                              orderid,
                              datetime)
                        VALUES (?,?,?,?,?,?,?)';
    if(!mysqli_stmt_prepare($stmt, $sql))
        return false;

    foreach($goods as $item)
    {
        mysqli_stmt_bind_param($stmt, "ssiiisi", $item['title'], $item['author'], $item['pubyear'], $item['price'], $item['quantity'], $basket['orderid'], $datetime);
        mysqli_stmt_execute($stmt);
    }
    mysqli_stmt_close($stmt);
    setcookie('basket', "");
    return true;
}



Вывод корзины
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<?php
	$i=1;
	foreach ($goods as $item) {
		//if(isset($_POST['submit']))
		$item['quantity'] = $_POST['q'];
		?>
		<tr>
			<td><?= $i ?></td>
			<td><?= $item['title'] ?></td>
			<td><?= $item['author'] ?></td>
			<td><?= $item['pubyear'] ?></td>
			<td><?= $item['price'] ?></td>
<!-- Quantity input -->
			<td>
			<form action="<?= $_SERVER['PHP_SELF'] ?>" method="post">
				<input type="text" name="q" value="<?= $item['quantity'] ?>" />
				<!-- Кнопка обновления корзины -->
				<div align="right">
					<input type="submit" value="Обновить корзину" name="submit" />
				</div>
				<!-- Кнопка обновления корзины -->
			</form>
			</td>
<!-- /Quantity input -->
			<td><? echo "<a href='delete_from_basket.php?id=$item[id]'>Удалить</a>"; ?></td>
		</tr>
		<?
		$i++;
		$sum += $item['price'] * $item['quantity'];
	} // end of foreach
} // end if
?>
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39238782
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
			<form action="<?= $_SERVER['PHP_SELF'] ?>" method="post">
				<input type="text" name="q" value="<?= $item['quantity'] ?>" />
				<!-- Кнопка обновления корзины -->
				<div align="right">
					<input type="submit" value="Обновить корзину" name="submit" />
				</div>
				<!-- Кнопка обновления корзины -->
			</form>

Если правильно понимаю, то в форме и не обозначено никаким образом, количество какого именно товара (айди элемента корзины) следует изменить. Вероятно, и в запросе UPDATE отсутствует условие WHERE. Предположу, что количество меняется во всех корзинах всех пользователей. :)
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39238801
donjohn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а решение ?))
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39238831
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
donjohn,

Очевидно, кроме количества, в форме следует указать ID элемента, для которого это количество будет изменено. Ну и в скрипте обработки изменить запрос соответствующим образом.
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39238853
donjohn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в теории я понимаю как это сделать, а на практике не получается, был бы признателен за кусок правильного кода
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39238881
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
donjohnа на практике не получаетсяПоказывайте, как делали и что не получается.
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39238903
donjohn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это файл basket.php
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
<?php
// подключение библиотек
require "inc/lib.inc.php";
require "inc/config.inc.php";

//$prId = uniqid();

$bSubmit = "submit";

?>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Корзина пользователя</title>
</head>
<body>
<h1>Ваша корзина</h1>
<?php
$goods = myBasket();
$i = 1;
$sum = 0;
$q = 1;

if(!$count)
{
	echo "<p>Корзина пуста. Вернитесь в <a href='catalog.php'>каталог</a></p>
";
	exit;
}
else
	echo "<p><b>Вернуться в <a href='catalog.php'>каталог</a></b></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

		echo "<pre>";
		var_dump($goods);
		$i=1;

        $goods[$i-1]['quantity'] = $_POST['q'];
		$qua = $goods[$i-1]['quantity'];
		echo $goods[$i-1]['quantity'];
		foreach ($goods as $item) {

			?>
			<tr>
				<td><?= $i ?></td>
				<td><?= $item['title'] ?></td>
				<td><?= $item['author'] ?></td>
				<td><?= $item['pubyear'] ?></td>
				<td><?= $item['price'] ?></td>
				<!-- Quantity input -->
				<td>
					<form action="<?= $_SERVER['PHP_SELF'] ?>" method="post">
						<input type="text" name="q" value="1" />
						<!-- Кнопка обновления корзины -->
						<div align="right">
							<input type="submit" value="Обновить корзину" name="<?= $bSubmit ?>" />
						</div>
						<!-- Кнопка обновления корзины -->
					</form>
				</td>
				<!-- /Quantity input -->
				<td><? echo "<a href='delete_from_basket.php?id=$item[id]'>Удалить</a>"; ?></td>
			</tr>
			<?
			$i++;
			$sum += $item['price'] * $item['quantity'];
		} // end of foreach
		//echo $_POST['q'];
		?>

		<?

	?>

</table>

<p>Всего товаров в корзине на сумму: <b><?= $sum?>руб.</b></p>


<div align="center">
	<input type="button" value="Оформить заказ!"
		   onClick="location.href='orderform.php'" />
</div>
</body>
</html>



а это файл lib.inc.php
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
<?php
//require "inc/config.inc.php";
session_start();

// Добавляем в каталог
function addItemToCatalog($title, $author, $pubyear, $price, $link)
{
    global $sql;
    $sql = 'INSERT INTO catalog(title, author, pubyear, price)
                VALUES(?, ?, ?, ?)';
    $stmt = mysqli_prepare($link, $sql);
    mysqli_stmt_bind_param($stmt, "ssii", $title, $author, $pubyear, $price);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
    return true;

    if (!$stmt = mysqli_prepare($link, $sql))
        return false;
}

function selectAllItems($link)
{
    $sql = 'SELECT id, title, author, pubyear, price FROM catalog';
    if(!$result = mysqli_query($link, $sql))
    {
     return false;
    }

    $items = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_free_result($result); // освобождает память, занятую запросом, т.к. результаты запроса уже занесены в переменную $items

    return $items;
}

// Сохраняем в корзину
function saveBasket()
{
    global $basket;
    $basket = base64_encode(serialize($basket));
    setcookie('basket', $basket, 0x7FFFFFFF);
}

// Инициализация корзины
function basketInit()
{
    global $basket, $count;
    if(!isset($_COOKIE['basket']))
    {
        $basket = ['orderid' => uniqid()];
        saveBasket();
    }
    else
    {
        $basket = unserialize(base64_decode($_COOKIE['basket']));
        $count = count($basket) - 1;
    }
}

function add2basket($id)
{
    global $basket;
    $basket[$id] = 1;
    saveBasket();
}

function result2array($data)
{
    global $basket;
    $arr = [];
    while($row = mysqli_fetch_assoc($data))
    {
        $row['quantity'] = $basket[$row['id']];
        $arr[] = $row;
    }
    return $arr;
}

function myBasket()
{
    global $link, $basket;
    $goods = array_keys($basket); // функция выбирает все ключи массива и заносит в индексный массив
    array_shift($goods); // извлекает первый элемент массива

    if(!$goods)
        return false;

    $ids = implode(",", $goods); // возвращает через запятую значения массива
    $sql = "SELECT id, title, author, pubyear, price 
              FROM catalog WHERE id IN ($ids)";
    if(!$result = mysqli_query($link, $sql))
        return false;
    $items = result2array($result);
    mysqli_free_result($result); // освобождает память, занятую результатами запроса
    echo "<pre>";
    //var_dump($items[1]['id']);
    return $items;
}

function deleteFromBasket($id)
{
    global $basket;
    unset($basket[$id]);
    saveBasket();
}

function saveOrder($datetime)
{
    global $link, $basket;
    $goods = myBasket();
    $stmt = mysqli_stmt_init($link);
    $sql = 'INSERT INTO orders(
                              title,
                              author,
                              pubyear,
                              price,
                              quantity,
                              orderid,
                              datetime)
                        VALUES (?,?,?,?,?,?,?)';
    if(!mysqli_stmt_prepare($stmt, $sql))
        return false;

    foreach($goods as $item)
    {
        mysqli_stmt_bind_param($stmt, "ssiiisi", $item['title'], $item['author'], $item['pubyear'], $item['price'], $item['quantity'], $basket['orderid'], $datetime);
        mysqli_stmt_execute($stmt);
    }
    mysqli_stmt_close($stmt);
    setcookie('basket', "");
    return true;
}

function getOrders()
{
    global $link;
    if(!is_file(ORDERS_LOG))
        return false;

    /* Получаем в виде массива персональные данные пользователей из файла */
    $orders = file(ORDERS_LOG);

    /* Массив, который будет возвращен функцией */
    $allOrders= [];
    foreach ($orders as $order)
    {
        list($name, $email, $phone, $address, $orderid, $date) = explode(" | ", trim($order));

        /* Промежуточный массив для хранения информации о конкретном заказе */
        $orderInfo = [];

        /* Сохранение информацию о конкретном пользователе */
        $orderInfo['name'] = $name;
        $orderInfo['email'] = $email;
        $orderInfo['phone'] = $phone;
        $orderInfo['address'] = $address;
        $orderInfo['orderid'] = $orderid;
        $orderInfo['date'] = $date;

        /* SQL-запрос на выборку из таблицы orders всех товаров для конкретного покупателя */
        $sql = "SELECT title, author, pubyear, price, quantity
                  FROM orders
                  WHERE orderid = '$orderid'";

        /* Получение результата выборки */
        if(!$result = mysqli_query($link, $sql))
            return false;
        $items = mysqli_fetch_all($result, MYSQLI_ASSOC);
        mysqli_free_result($result);

        /* Сохранение результата в промежуточном массиве */
        $orderInfo['goods'] = $items;
        //var_dump($items);
        
        /* Добавление промежуточного массива в возвращаемый массив */
        $allOrders[] = $orderInfo;
    }
    return $allOrders;
}



Как я понимаю логику, то нужно задать каждому инпуту идентефикатор, равный $items['id'], затем как-то указать, что именно у этого поля изменилось значение $item['quantity'] и поменять его в массиве. Думал что-то сделать с такой переменной $q = $goods['$i -1']['quantity'], и тут я теряюсь
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39239148
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
donjohnнужно задать каждому инпуту идентефикатор, равный $items['id']Да, именно так. Можно сделать имена вида "q_123".
А можно проще - сформировать массив примерно таким образом: name="q_[{$order_item['order_item_id']}]"
Второй способ проще при разборе, хотя и гораздо менее понятен поначалу.


donjohnкак-то указать, что именно у этого поля изменилось значение $item['quantity']Зачем? Можно просто обновить существующее значение. Независимо от того, изменилось ли оно или нет.
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39239398
donjohn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так вот тут и проблема. каким образом обновить значение ? имена у инпутов такого формата "q + $item['id']", дальше я могу присвоить некой переменной значение, что-то типа $name = (int) _POST['q']; и получится переменная с айди, который можно сравнить с айди, но опять же проблема у меня в том, что как сопоставить нажатую кнопку с айдишником, а остальные товары пропустить, на которых кнопка не нажата
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39239504
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
donjohnимена у инпутов такого формата "q + $item['id']", дальше я могу присвоить некой переменной значение, что-то типа $name = (int) _POST['q']; и получится переменная с айди, который можно сравнить с айди, но опять же проблемаИменно, проблема. Потому и предлагаю менее понятный, но на порядок более простой вариант - передавать массив значений. У позиций в корзине будут имена инпутов вида q[123], q[124], q[125] и так далее, где числовые индексы есть айдишники позиций в корзине. В скрипте обработки получаете ассоциативный массив $_POST['q'], где ключами будут эти самые айдишники, а значениями - количество по соответствующей позиции. Далее в цикле по массиву выполняете UPDATE. Всё просто!


donjohnа остальные товары пропустить, на которых кнопка не нажатаОбъясните, ЗАЧЕМ это надо Вам на ДАННОМ этапе?

Если очень не хочется делать UPDATE на неизменившихся полях, что хорошо, так как на какие-то 0,001% снизит нагрузку на сервер, то можно яваскриптом сделать такую фишку (один из множества вариантов).
Делаете пустую форму, а сами инпуты оставляете вне формы. Инпуты, которые изменяются, яваскриптом копируте в форму как скрытые поля. Необходимо принять меры по защите от дубликатов на случай, если какое-то поле изменилось два или более раз.

Впрочем, по хорошему, лучше вообще обойтись без перезагрузки страницы, отправляя асинхронный запрос всякий раз, когда поле меняется. Сам по себе способ довольно прост. Аяксом отправляете POST-запрос с двумя полями - айди позиции и количество. Таким же образом реализуются и кнопочки +/- для увеличения или уменьшения к-ва по позиции. В ответе сервер может прислать сообщение об ошибке или, при успехе, айди позиции и новое количество, которые можно использовать, например, для обновления значения в поле.
Впрочем, тут возможна масса вариантов.
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39240167
donjohn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle,
Попробовал такой вариант, не получается разобраться почему в массив заносится только последний элемент, а не на каждую итерацию ?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
foreach ($goods as $item) {
		//var_dump($item);
		?>
		<tr>
			<td><?= $i ?></td>
			<td><?= $item['title'] ?></td>
			<td><?= $item['author'] ?></td>
			<td><?= $item['pubyear'] ?></td>
			<td><?= $item['price'] ?></td>

			<td><input type="text" name="q" value="<?= $i_val ?>" /></td>

			<td><? echo "<a href='delete_from_basket.php?id=$item[id]'>Удалить</a>"; ?></td>
		</tr>
		<?

		// echo "<br>-----------------".count($goods)."-----------------<br>";
		for($c = 0; $c <= count($goods); $c++)
		{
			$arr = [];
			$arr = [$item['id'] => $i_val];
			$i_val = $_POST['q'];

		}
		var_dump($arr);
		$i++;
		$sum += $item['price'] * $item['quantity'];
	} // end of foreach
} // end if
?>
...
Рейтинг: 0 / 0
Изменение количества товара в корзине
    #39240217
donjohn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по идее эта конструкция c каждым выведенным элементом массива должен выполнять цикл for, который в свою очередь должен заносить значение value данной итерации, а в итоге получается, что заносится значение последнего элемента во все значения массива, где я не правильно мыслю ?
Код: php
1.
2.
3.
4.
5.
6.
7.
for($c = 0; $c <= count($goods); $c++)
		{
			$arr = [];
			$arr = [$item['id'] => $i_val];
			$i_val = $_POST['q'];

		}
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Изменение количества товара в корзине
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]