создание корзины и обновление значений в ней с помощью php

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

<?php
    include("includes/db.php");
    include("includes/functions.php");

    if(isset($_REQUEST['command'])=='delete' && $_REQUEST['pid']>0){
        remove_product($_REQUEST['pid']);
    }
    elseif(isset($_REQUEST['command'])=='clear'){
        $_SESSION["cart"] = array();
    }
    elseif($_REQUEST['command']=='update'){
        $max=count($_SESSION['cart']);
        for($i=0;$i<$max;$i++){
            $pid=$_SESSION['cart'][$i]['productid'];
            $q=intval($_REQUEST['product'.$pid]);
            if($q>0 && $q<=999){
                $_SESSION['cart'][$i]['qty']=$q;

            }
            else{
                $msg='Some proudcts not updated!, quantity must be a number between 1 and 999';
            }
        }
    }

?>

вот мой джаваскрипт

function update_cart(){
    document.form1.command.value='update';
    document.form1.submit();
}

вот мой код

<?php
            if(is_array($_SESSION['cart'])){
                echo '<tr bgcolor="#FFFFFF" style="font-weight:bold"><td>Serial</td><td>Name</td><td>Price</td><td>Qty</td><td>Amount</td><td>Options</td></tr>';
                $max=count($_SESSION['cart']);
                for($i=0;$i<$max;$i++){
                    $pid=$_SESSION['cart'][$i]['productid'];
                    $q=$_SESSION['cart'][$i]['qty'];
                    $pname=get_product_name($pid);
                    if($q==0) continue;
            ?>
                    <tr bgcolor="#FFFFFF"><td><?php echo $i+1?></td><td><?php echo $pname?></td>
                    <td>$ <?php echo get_price($pid)?></td>
                    <td><input type="text" name="product<?php echo $pid?>" value="<?php echo $q?>" maxlength="3" size="2" /></td>                    
                    <td>$ <?php echo get_price($pid)*$q?></td>
                    <td><a href="javascript:del(<?php echo $pid?>)">Remove</a></td></tr>
            <?php                   
                }
            ?>
                <tr><td><b>Order Total: $<?php echo get_order_total()?></b></td><td colspan="5" align="right"><input type="button" value="Clear Cart" onclick="clear_cart()"><input type="button" value="Update Cart" onclick="update_cart()"><input type="button" value="Place Order" onclick="window.location='billing.php'"></td></tr>
            <?php
            }
            else{
                echo "<tr bgColor='#FFFFFF'><td>There are no items in your shopping cart!</td>";
            }
        ?>

person suhail    schedule 23.03.2013    source источник
comment
Второй раз задаю вопрос?   -  person Bhavin Rana    schedule 23.03.2013
comment
да теперь кнопка обновления не работает сэр   -  person suhail    schedule 23.03.2013
comment
Задавая другой вопрос, Бхавин. Первый был о чистом варианте. Я посоветовал ему открыть еще один вопрос об обновлении, потому что это было расширение оригинального, и разрешение было другим.   -  person Radiotrib    schedule 23.03.2013
comment
да сэр так какое решение для запроса на обновление   -  person suhail    schedule 23.03.2013
comment
и задать вопрос принципиально другим сценарием, чем тот, который задавал 10 минут назад. Он не реализовал решение предыдущего вопроса, и код не совпадает с кодом, опубликованным ранее.   -  person Radiotrib    schedule 23.03.2013


Ответы (2)


isset($_REQUEST['command']) дает либо true, либо false. Сравнение этого значения с 'delete' дает то же значение, что и isset($_REQUEST['command']), потому что 'delete' преобразуется в логическое значение true для сравнения с другим логическим значением.

Особенно в результате

isset($_REQUEST['command'])=='clear'

всегда совпадает с

isset($_REQUEST['command'])=='update'

поэтому, если выполняется условие второго elseif, выполняется и условие первого elseif. Поэтому тело второго elseif никогда не выполняется (вместо этого выполняется тело первого elseif).

person Oswald    schedule 23.03.2013
comment
Совершенно верно, и в опубликованном случае ничего, кроме опции удаления, никогда не вызывалось. Недавно ОП опубликовал еще один вопрос... см. stackoverflow.com/questions/15584300/ ... и я сделал ошибочное предположение, что имею дело с тем же кодом, который он опубликовал 10 минут ранее в том. Спасибо за внимание. - person Radiotrib; 23.03.2013
comment
Опция удаления пропускается, если $_REQUEST['pid'] <= 0. - person Oswald; 23.03.2013

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

    $max=count($_SESSION['cart']);
    for($i=0;$i<$max;$i++){

никогда не запустится, потому что в начальном условии $max установлено на 0, а ограничивающее условие цикла $max ‹ 0, т. е. 0‹0 ..

Ваша первоначальная предпосылка в корне неверна, если вы пытаетесь обновить только количество, потому что в корзине сеанса никогда не будет продуктов для обновления, и из решения первого вопроса, который вы подняли, настройка $_SESSION['cart'] для array() всегда будет гарантировать пустую корзину _SESSION.

Эти строки:

elseif(isset($_REQUEST['command'])=='clear'){
    unset($_SESSION['cart']);
}

Произойдет сбой с неопределенной ошибкой в ​​строке unset(), если корзина изначально не определена. Смотрите ответ на свой первый вопрос для уточнения этого.

В коде отображения вашей страницы вверху у вас есть

        if(is_array($_SESSION['cart'])){

Если вы реализовали решение вопроса «очистить», это всегда будет возвращать true, поскольку вы инициализируете корзину пустым массивом. (Кстати, обновите приведенный выше код, чтобы отразить «чистое» решение этого вопроса)

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

Если, с другой стороны, это только один из набора сценариев, и если он ожидает, что корзина будет заполнена другим, прежде чем он что-либо сделает, вам нужно будет явно добавить тест, чтобы убедиться, что $max не ноль и ничего не делать, если это так.

    $max=count($_SESSION['cart']);
    if ($max > 0) {
      for($i=0;$i<$max;$i++){
        $pid=$_SESSION['cart'][$i]['productid'];
        $q=intval($_REQUEST['product'.$pid]);
        if($q>0 && $q<=999){
          $_SESSION['cart'][$i]['qty']=$q;
        } else {
           $msg='Some proudcts not updated!, quantity must be a number between 1 and 999';
        }
      }
    } else {
      // handle the error your way
    }
person Radiotrib    schedule 23.03.2013
comment
См. Нечеткое сравнение с == для того, что происходит, когда вы сравниваете логическое значение и строку в PHP. - person Oswald; 23.03.2013
comment
Извините, Освальд .. Я пропустил это :) ... тот факт, что isset() вообще использовался, был ошибкой. но, конечно, если isset() возвращает TRUE, и я сравниваю его со «строкой», используя ==, он возвращает значение TRUE для условия, но не если я использую === ... мой плохой. - person Radiotrib; 23.03.2013