Как обновить количество товара в корзине

arhat78

Новичок
Всем привет! Застрял на обновлении кол-ва товара в корзине: в корзине есть 1шт товара, покупатель меняет на 2 шт, и нужно, чтобы price умножился на "2" при нажатии кнопки "обновить". Пытаюсь, но пока не могу понять принципа, чтобы при вводе "2" и обновлении в строке выполнялось условие Всего $item['price']*$item['quantity'] . Заранее благодарен.

PHP:
<td><?php echo $item['price'];?></td>
      <td><input type="text" size="2" name="quantity" class="quantity" maxlength="2" value="<?=$item['quantity']?>" /></td>
     <td><?php echo $item['price']*$item['quantity'];?></td>
 
<p align="center"><input type="submit" name="update" value="Обновить" /></p>
<?php if(isset( $_POST['quantity']))
    {
        $quantity=$_POST['quantity'];
    }
 

Valick

Новичок
Странные вы вещи спрашиваете.
В чём проблема отправить из формы на сервер значение количества?
В чём проблема принять на сервере значение из формы раньше, чем вы его хотите использовать?
В чём проблема обновить в БД значение количества товара в корзине и вывести это значение.
Зачем вы вообще делаете "магазин"?
 

arhat78

Новичок
Странные вы вещи спрашиваете.
В чём проблема отправить из формы на сервер значение количества?
В чём проблема принять на сервере значение из формы раньше, чем вы его хотите использовать?
В чём проблема обновить в БД значение количества товара в корзине и вывести это значение.
Зачем вы вообще делаете "магазин"?
Учусь в сободное от работы время, хобби.
У меня корзина на куках, в БД отправляется только составленный Заказ.
Корзина на сессиях у меня есть, но хочу просто на php, без js. Посмотрел несколько примеров с Input, но как здесь примернить, пока не понял алгоритма. как в этой корзине можно осуществить пересчёт в столбце "Всего", если меняешь количество в столбце "Количество"? Если подскажете, будет просто отлично.


Код:
<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>
   
    <th>Удалить</th>
</tr>
<?php basketInit();
    $i =1; $sum = 0;
 
if(is_array($goods)){
    if(count($goods))

    foreach($goods as $item){
?>
   <tr>
      <td><?php echo $i++; ?></td>
      <td><?php echo $item['title'];?></td>
      <td><?php echo $item['description'];?></td>
      <td><?php echo $item['price'];?></td>
      <td><input type="text" size="2" name="quantity" class="quantity" maxlength="2" value="<?=$_POST['quantity']?>" /></td>
      <td><img src="userfiles/<?php echo $item['image']; ?>"width="95" height="95" ></td>
     <td><?php echo $item['price']*$item['quantity'];?></td>
      <td><a href="delete_from_basket.php?id=<?php  echo $item['id'];?>"> Удалить </a></td>
     
   </tr>
<?php

$sum+=$item['price'] * $item['quantity'];

}} ?>

</table>
<p align="center"><input type="submit" name="update" value="Обновить" /></p>
<?php if(isset( $_POST['quantity']))
    {
        $quantity=$_POST['quantity'];
    }
?>
<p>Всего товаров в корзине на сумму: <b><?php echo $sum ?> руб.</b></p>

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

Valick

Новичок
Почитайте для начала, что такое MVC.
И научитесь использовать функции.
 

arhat78

Новичок
И научитесь использовать функции.
Функции я испльзую, в этой же корзине по ссылке "Удалить". А как к кнопке прикрепить функцию? Второй день перебираю варианты,и здесь в вышеуказанном коде какой-то бред оставил, не удалил....
 

Valick

Новичок
arhat78, изучение языка программирования как и собственно алгоритмов программирования должно быть от простого к сложному т.е. поступательным.
А как к кнопке прикрепить функцию?
у вас неправильная постановка задачи, такое ощущение вы немножко учили JS, а потом начали учить РНР.

Кроме этого учитесь структурировать код и разбивать большую задачу на более мелкие.
Даже в одном единственном файле РНР скрипта можно применить принцип MVC.
В начале файла вы описываете все функции (модель)
В середине файла вы принимаете данные из браузера и используете функции (контроллер)
В конце файла HTML вывод в браузер (вьювер)

Начните с корзины. Что должна уметь корзина?
1) Инициализация корзины, функция basket()
2) Добавлять товар в корзину и увеличивать количество в корзине если товар уже там, функция addItem($basket, $itemCode, $quantity)
3) Уменьшать количество товара в корзине и удалать его из корзины если количество равно нулю, функция robItem($basket, $itemCode, $quantity)
4) Удалять товар из корзины, функция removeItem($basket, $itemCode)
 

arhat78

Новичок
$_POST['quantity'] или $item['quantity']?

Пробовал обернуть в <form> метод post,но: во первых-из таблицы эта форма "выскакивает", и во вторых-в таблице $item['quantity'], а данные формы выводятся отдельно echo $quantity
PHP:
basketInit();
    $i =1; $sum = 0;
  
if(is_array($goods)){
    if(count($goods))

    foreach($goods as $item){
?>
   <tr>
      <td><?php echo $i++; ?></td>
      <td><?php echo $item['title'];?></td>
      <td><?php echo $item['description'];?></td>
      <td><?php echo $item['price'];?></td>
      <form method="POST">
      <td><input type="text" size="2" name="quantity" class="quantity" maxlength="2" value="<?=[B]$item['quantity'][/B]?>" /></td>

<p align="center"><input type="submit" name="update" value="Обновить" /></p>
</form>
<?php if(isset($_POST['quantity']))
    {
        $quantity=$item['price']*$_POST['quantity'];
        [B]echo $quantity[/B];     
    }?>
      <td><img src="userfiles/<?php  $item['image']; ?>"width="95" height="95" ></td>
     <td><?php echo $item['price']*$item['quantity'];?></td>
      <td><a href="delete_from_basket.php?id=<?php  echo $item['id'];?>"> Удалить </a></td>
      
   </tr>
<?php

$sum+=$item['price'] * $item['quantity'];

}} ?>

</table>
<p align="center"><button onclick="ChangQty()">Update</button></p>
 
<p>Всего товаров в корзине на сумму: <b><?php echo $sum ?> руб.</b></p>

<div align="center">
    <input type="button" value="Оформить заказ!"
                      onClick="location.href='orderform.php'" />
Посмотреть вложение Магаз2.jpg
 

arhat78

Новичок
arhat78, как вы храните корзину в куках?
PHP:
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;
    }
}
 

Valick

Новичок
норм, только я бы посоветовал JSON взамест serialize()
и откажитесь от global от слова совсем
basketInit() - должна возвращать массив корзины
в saveBasket() - массив корзины должен передаваться аргументом
для определения $count лучше сделать отдельную функцию countItem($basket) где аргументом всё тот же массив корзины

вот это при инициализации тоже лишнее
$basket=['orderid'=>uniqid()];
saveBasket();
не надо хранить пустоту
если в куках корзина есть, то возвращаем её, если нет, то просто инициализируем пустой массив корзины
и basketId вместо orderid - корзина и готовый заказ - это далеко не одно и то же
 
Последнее редактирование:

arhat78

Новичок
arhat78, изучение языка программирования как и собственно алгоритмов программирования должно быть от простого к сложному т.е. поступательным.

у вас неправильная постановка задачи, такое ощущение вы немножко учили JS, а потом начали учить РНР.

Начните с корзины. Что должна уметь корзина?
1) Инициализация корзины, функция basket()
2) Добавлять товар в корзину и увеличивать количество в корзине если товар уже там, функция addItem($basket, $itemCode, $quantity)
3) Уменьшать количество товара в корзине и удалать его из корзины если количество равно нулю, функция robItem($basket, $itemCode, $quantity)
4) Удалять товар из корзины, функция removeItem($basket, $itemCode)
Нет, в js пока страшно заглядывать

У вас слишком уж для меня на данном этапе сложносоставные фукнции с несколькими переменными :(
 

Valick

Новичок
А каким образом каждый раз инициировать подключение и массив корзины???
PHP:
<?php
    function basketInit(){
    if(isset($_COOKIE['basket'])){
        return json_decode(base64_decode($_COOKIE['basket']), true);
    }
    return [];
}

function saveBasket($basket){
    $basket=base64_encode(json_encode($basket));
    setcookie('basket',$basket, 0x7FFFFFFF);
}

// инициализация корзины
$basket = basketInit();
// сохранение корзины
saveBasket($basket);
 

arhat78

Новичок
PHP:
<?php
    function basketInit(){
    if(isset($_COOKIE['basket'])){
        return json_decode(base64_decode($_COOKIE['basket']), true);
    }
    return [];
}

function saveBasket($basket){
    $basket=base64_encode(json_encode($basket));
    setcookie('basket',$basket, 0x7FFFFFFF);
}

// инициализация корзины
$basket = basketInit();
// сохранение корзины
saveBasket($basket);
Примерно понятна логика, кроме "
если в куках корзина есть, то возвращаем её, если нет, то просто инициализируем пустой массив корзины
и basketId вместо orderid - корзина и готовый заказ - это далеко не одно и то же
".
А как это применить в реализации того же "количества" в самой корзине?
 

Valick

Новичок
кстати покажете структуру массива корзины
раз уж вы храние идентификатор корзины (хотя на данном этапе это лишнее)
то наверно
инициализация вот так должна быть
return ['basketId' => uniqid(), 'item' => [] ];
 

arhat78

Новичок
кстати покажете структуру массива корзины
раз уж вы храние идентификатор корзины (хотя на данном этапе это лишнее)
Без сессий, из различных уроков получилось реализовать таким образом:
PHP:
function myBasket(){
    global $link,  $basket;
    $goods=array_keys($basket);
    array_shift($goods);
    if(!$goods)
       return array();
    $ids=implode(",",$goods);
    $sql = "SELECT id, prod_id, title, description, price, image 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){
    global $basket;
    $arr=array();
    while($row=mysqli_fetch_assoc($data))
    {
        $row['quantity']=$basket[$row['id']];
        $arr[]=$row;
    }
    return $arr;
}
 
Сверху