Количество последнего элемента, обновленного во всей базе данных в php

0


Я делаю свой семестровый проект веб-сайта электронной коммерции с использованием php и MySQL. Я построил систему корзины с использованием обоих инструментов. Проблема возникла для меня в том, что когда корзина содержит только один элемент, она будет работать так, как предполагалось, т.е. обновлять отраженное количество в столбце "количество" базы данных. Но по мере того, как я увеличиваю количество элементов в своей корзине, он не будет работать, как я думал, т.е. он обновляет только столбец количества базы данных с последним количеством элементов.
Ниже мой код.
Любая помощь будет очень полезной, так как сейчас я изучаю этот материал.

Добро пожаловать, Гость! Корзина - Предметы: - Цена: - Перейти в корзину
            <div id="products_box"><!-- gets the products from the database section starts from here -->
                <form action="cart.php" method="post" enctype="multipart/form-data">
                    <table width="750px" align="center" bgcolor="#0099CC">
                        <tr align="center">
                            <td><b>Remove</b></td>
                            <td><b>Product(s)</b></td>
                            <td><b>Quantity</b></td>
                            <td><b>Total Price</b></td>
                        </tr>
                        <?php
                        $ip_add = getIp();
                        $total = 0;

                        $sel_price = "select * from cart where ip_add = '$ip_add'";
                        $run_price = mysqli_query($db, $sel_price);

                        while($record = mysqli_fetch_array($run_price)){
                            $product_id = $record['product_id'];

                            $pro_price = "select * from products where product_id = '$product_id'";
                            $run_pro_price = mysqli_query($con, $pro_price);

                            while($p_price = mysqli_fetch_array($run_pro_price)){

                                $product_price = array($p_price['product_price']);
                                $product_title = $p_price['product_title'];
                                $product_img = $p_price['product_img2'];
                                $single_price = $p_price['product_price'];

                                $value = array_sum($product_price);
                                $total += $value;


                        ?>
                        <tr>
                            <td><input type="checkbox" name="remove[]" value="<?php echo $product_id;?>"></td>
                            <td><?php echo $product_title;?><br><img src="admin_area/products_images/<?php echo $product_img;?>" width="80px" height="80px"></td>
                            <td><input type="text" name="qty" value="1" size="3" min="1"></td>
                            <?php 
                                if(isset($_POST['update'])){
                                    $qty = $_POST['qty'];


                                    $insert_qty = "update cart set qty='$qty' where ip_add='$ip_add' AND product_id = '$product_id'";

                                    $run_qty = mysqli_query($con, $insert_qty);


                                    $total *= $qty;
                                }
                            ?>
                            <td><?php echo  $single_price ." ". "&euro;"?></td>
                        </tr>
                        <?php
                            } // to include in the php code so it effects the whole row
                        }?> 
                        <tr>
                            <td colspan="3" align="right"><b>Sub Total:</b></td>
                            <td><b><?php echo $total ." ". "&euro;"?></b></td>
                        </tr>

                        <tr></tr>
                        <tr></tr>
                        <tr></tr>

                        <tr>
                            <td colspan="2"><input type="submit" name="update" value="Update Cart"></td>

                            <td> <input type="submit" name="continue" value="Continue Shopping"></td>
                            <td><button><a href="checkout.php" style="text-decoration:none; color:black;">Checkout</a></button></td>
                        </tr>
                    </table>
                </form>
  • 0
    Ваш код немного запутан в том, что у вас есть запрос на выбор, выполняющий цикл, а затем другой запрос на выборку, выполняющий другой цикл, и внутри него вы выводите форму и затем пытаетесь обновить. Ваш код может быть исправлен как есть (я не вижу проблему при быстром взгляде). Тем не менее, я настоятельно рекомендую немного выделить это. Проверьте вверху, нажали ли они «обновить», если это так, форма должна POST-массив, зациклить этот POST-массив и обновить каждый элемент в БД. Затем выполните цикл, чтобы получить все данные о продукте и установить его в новый массив. Затем используйте этот массив для вывода данных в вашей корзине.
Теги:
cart
shopping-cart
shopping

1 ответ

0

Когда вы отправляете HTML-форму, если она содержит несколько элементов формы с тем же именем, отправляется только последний. Так как все ваши поля ввода количества имеют имя qty, только количество последнего товара в корзине отправляется, поэтому все ваши продукты попадают в этот номер.

У PHP есть функция, которая позволяет использовать квадратные скобки в именах элементов формы и в итоге получить массив данных (см. Раздел http://php.net/manual/en/faq.html.php для получения дополнительной информации о как это работает). Вы можете использовать [] для добавления значения к массиву (которое вы уже делаете для вашего флажка "удалить элемент из корзины"), или вы можете дать ему конкретный ключ массива, назвав элемент чем-то вроде qty[foo] (которое закончилось бы в $_POST['qty']['foo']).

Есть несколько способов, которыми вы могли бы это исправить. Поскольку это проект, я просто собираюсь указать вам на одно возможное решение и предложить изменить элемент количественной формы:

<input type="text" name="qty[<?php echo $product_id;?>">]" value="1" size="3" min="1">

затем посмотрите, как выглядят данные $_POST.

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

Другие комментарии:

IP-адрес не уникален для пользователя, поэтому это не очень хороший способ однозначно идентифицировать корзину (вы, возможно, уже знаете это). На данный момент пользователи с одним и тем же IP-адресом будут иметь одну и ту же корзину покупок.

Ваш $total расчет выглядит немного подозрительным (попробуйте добавить несколько элементов в корзину с разными количествами).

Ваш скрипт также кажется уязвимым для SQL-инъекции. Посмотрите, как выглядел бы ваш SQL-запрос, если злоумышленник напечатал строку 1', product_id='123', ip_add='xxx.xxx.xxx.xxx в поле количества - это позволит им легко добавить любой продукт в любой другая тележка пользователя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню