Не могу удалить мой первый товар в корзине - PullRequest
0 голосов
/ 01 марта 2019

В настоящее время я выполняю свое задание по вычислительной технике, и я решил создать интернет-магазин. Я использовал учебник, чтобы сделать корзину покупок, и все работает, за исключением того, что я могу удалить только каждый элемент, кроме первого, добавленного в мою корзину.,Я бы очень признателен за любую помощь, если это возможно.

Здесь отображаются товары в моей корзине (cart.php):

<?php 
session_start();
require_once('db.php'); 
include('common.php');
 ?>

 <?php getHeader(); ?>

<div class="container">
    <div class="row">
      <table class="table">
            <?php 
                $items = $_SESSION['cart'];
                $cartitems = explode(",", $items);
            ?>

            <?php
                $total = '';
                $i=1;
                 foreach ($cartitems as $key=>$id) {
                    $sql = "SELECT * FROM products WHERE id = $id";
                    $res = mysqli_query($con, $sql);
                    $r = mysqli_fetch_assoc($res);
            ?>      
                <tr>
                    <td><?php echo $i; ?></td>
                    <td><a href="delcart.php?remove=<?php echo $key; ?>">Remove</a> <?php echo $r['name']; ?></td>
                    <td>£<?php echo $r['price']; ?></td>
                </tr>
            <?php 
                $total = $total + $r['price'];
                $i++; 
                } 
            ?>

            <tr>
                <td><strong>Total Price</strong></td>
                <td><strong>£<?php echo $total; ?></strong></td>
                <td><a href="#" class="btn btn-info">Checkout</a></td>
            </tr>
        </table>
    </div>
</div>
<?php getFooter(); ?>

Это мой код, который добавляет товар в мою корзину(addtocart.php):

    <?php
session_start();
if(isset($_SESSION['cart']) & !empty($_SESSION['cart'])){
    $items = $_SESSION['cart'];
    $cartitems = explode(",", $items);
    $items .= "," . $_GET['id'];
    $_SESSION['cart'] = $items;
    header('location: index.php?status=success');
}else{
    $items = $_GET['id'];
    $_SESSION['cart'] = $items;
    header('location: index.php?status=success');
}


if(in_array($_GET['id'], $cartitems)){
    header('location: index.php?status=incart');
}else{
    $items .= "," . $_GET['id'];
    $_SESSION['cart'] = $items;
    header('location: index.php?status=success');   
}   
?>

Это мой код удаления элемента (delcart.php):

<?php 
session_start();
$items = $_SESSION['cart'];
$cartitems = explode(",", $items);
if(($_GET['remove']) & !empty($_GET['remove'])){
    $delitem = $_GET['remove'];
    unset($cartitems[$delitem]);
    $itemids = implode(",", $cartitems);
    $_SESSION['cart'] = $itemids;
}
header('location:cart.php');
?>

Ответы [ 4 ]

0 голосов
/ 01 марта 2019

Проблема в следующей строке:

if ($_GET['remove'] & !empty($_GET['remove']))

Когда вы хотите удалить первый элемент, $_GET['remove'] - это 0, что ложно и также считается пустым, поэтому код, который должен удалитьэто не работает.Измените его на:

if (isset($_GET['remove']) && is_numeric($_GET['remove']))

Кроме того, во всех ваших сценариях вы используете &, когда вы должны использовать &&.& - побитовое И, && - логическое И.

0 голосов
/ 01 марта 2019

Ваш цикл, а затем использование переменных является проблемой:

                 foreach ($cartitems as $key=>$id) {
...
                      <td><a href="delcart.php?remove=<?php echo $id; ?>">Remove</a> <?php echo $r['name']; ?></td>
...
                 }                    

Значение $key должно быть $id

При использовании foreach таким образом, $key var - это индекс массива, а $id - это значение (которое может быть строкой, массивом, объектом, int ...).

http://php.net/manual/en/control-structures.foreach.php

Но так как вы неЗдесь нет никакого дела до индекса массива, вы можете просто опустить его в объявлении foreach:

                 foreach ($cartitems as $id) {

, и он будет работать идентично.

0 голосов
/ 01 марта 2019

В вашем коде есть несколько ошибок:

1) $ _SESSION ['cart'] выглядит как строка id s, разделенных запятыми, то есть string(10) "1, 2, 3, 4"

Таким образом, $cartitems = explode(",", $items) вернет массив этих идентификаторов, т.е. array(4)[ 1, 2, 3, 4 ]

2) Предполагая, что $_GET['remove'] является строкой, содержащей элемент id, т.е. 3

Вызов unset($cartitems[$delitem]) удалит последний элемент моего примера массива, 4, так как массивы индексируются с нуля.

Чтобы удалить значение 3, вам нужно вызвать:

$delitem = array_search($_GET['remove'], $cartitems);
unset($cartitems[$delitem]);

(см. http://php.net/array_search)

3) Могу ли я предложить использовать PDO?http://php.net/manual/en/book.pdo.php

Редактировать: поскольку я не могу комментировать, Бармар:

Учитывая, что элементы OP хранятся в базе данных, а id, вероятно, является первичным ключом, маловероятно, что онУ меня был бы предмет с id из 0, поэтому empty () должен был бы идеально подходить для его нужд.Объясняя по этому пункту, однако, OP, Barmar является правильным, что если являются на самом деле на основе id s, вы бы хотели использовать isset($_GET['remove']), а не !empty($_GET['remove'])

См. http://php.net/isset и http://php.net/empty для различий.

0 голосов
/ 01 марта 2019

Если у вас есть только один элемент в сеансе,

$cartitems = explode(",", $items);

- это массив с индексом "0", поэтому, если вы хотите удалить последнее значение, $ _GET ['remove'] должно быть равнона «0» (пример: www.site.loc /? remove = 0)

Я надеюсь, что вы покажете нам только пример (не рабочий) код, потому что это очень неправильно написанный и опасный пример:

$ sql = "ВЫБРАТЬ * ИЗ ПРОДУКТОВ ГДЕ id = $ id";НЕ ДОЛЖНО ИСПОЛЬЗОВАТЬСЯ!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...