създаване на пазарска количка и актуализиране на стойностите в нея с помощта на 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';
            }
        }
    }

?>

ето го моят javascript

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="/bgjavascript: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
Задаване на въпрос 2-ри път?   -  person Bhavin Rana    schedule 23.03.2013
comment
да, сега бутонът за актуализиране не работи, сър   -  person suhail    schedule 23.03.2013
comment
Задаване на различен въпрос Bhavin. Първият беше за ясния вариант. Посъветвах го да отвори друг въпрос за актуализацията, защото беше exetnion на оригиналната и резолюцията беше различна.   -  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
Много вярно и в публикувания случай никога няма да бъде извикано нищо друго освен опцията за изтриване. OP публикува друг въпрос наскоро ... вижте stackoverflow.com/questions/15584300/ ... и направих погрешното предположение, че имам работа със същия код, който той публикува 10 минути преди това в този. Благодаря за подкрепата. - person Radiotrib; 23.03.2013
comment
Опцията за изтриване се пропуска, ако $_REQUEST['pid'] <= 0. - person Oswald; 23.03.2013

Няколко точки. Първо, не виждам никъде в кода, където всъщност да добавяте каквито и да било продукти към масива на вашата сесия. Това означава, че никога няма да имате продукти за актуализиране. Също така цикълът for

    $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, тъй като инициализирате количката в празен масив. (BTW - моля, актуализирайте кода по-горе, за да отразява "ясното" решение от този въпрос)

Що се отнася до останалата част от кода за актуализация, бих могъл да предложа няколко подобрения, но освен ако не можете да приложите метод за попълване на количката си, тогава всичко е малко академично.

Ако, от друга страна, това е само един от набор от скриптове и ако очаква кошницата да бъде попълнена от друг, преди да направи нещо, тогава ще трябва изрично да добавите тест, за да се уверите, че $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 и аз го сравня с 'string', използвайки ==, той ще върне TRUE стойност за условието, но не и ако използвам === ... лошото ми. - person Radiotrib; 23.03.2013