Дублирование при добавлении товара в корзину (php) - PullRequest
0 голосов
/ 25 октября 2018

Вам необходимо создать счетчик товаров в корзине.Когда я добавляю товар в корзину, он дублируется.В $ _SESSION ['products'] появляется [0], который также содержит число.Я нашел способ избавиться от него: unset ($ _ SESSION ['products'] [0]);но я не уверен, что это правильно.Что мне делать?

Этот файл - order.php:

    <?php
class Order{
    static function addInOrder($id){
        $id= intval($id);
        $productsInOrder=array();
        if(isset($_SESSION['products'])){
            $productsInOrder=$_SESSION['products'];
        }

        if(array_key_exists($id, $productsInOrder)){
            $productsInOrder[$id]++;
        }

        else{
            $productsInOrder[$id]=1;
        }

        $_SESSION['products']=$productsInOrder;

    }

    static function orderCount(){
        if(isset($_SESSION['products'])){
            unset($_SESSION['products'][0]);
            $count=0;
            foreach ($_SESSION['products']as $id=>$value){
                $count+=$value;
            }
            return $count;
        }

        else{
            return 0;
        }
    }


}


?>

orderController.php:

    <?php
class OrderController{
    public function actionSend($id){
        Order::addInOrder($id);
        $referer=$_SERVER['HTTP_REFERER'];
        header("location: $referer");
    }
}
?>

1 Ответ

0 голосов
/ 25 октября 2018

Вы, вероятно, отправляете неверную информацию на addInOrder, не видя, что это за переменная, и никак не может быть.Без намного большего количества кода нет никакого способа узнать, откуда это происходит.Может быть трудно отследить эти вещи, даже когда вы можете запустить сайт (но у меня есть несколько советов, см. Ниже).

Когда вы конвертируете строку типа "foo", используя intval, она возвращает 0например.Но вы можете вызвать функцию, если идентификатор равен falsy Например:

  //this is just a simplified example to show how to bail out of the method
 function addInOrder($id){
    if(false ==($id = intval($id))) return;
    echo $id."\n";
    //.....
 }

addInOrder(1);
addInOrder("foo");

Выход (возвращается 0)

 1

Песочница

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

function addInOrder($id){
    if(false ==($id = intval($id))){
        try{
           throw new Excepton(__METHOD__." called with invalid argument[$id]");

        }catch(Exception $e){
             echo $e->getMessage()."\n";
             echo $e->getTraceAsString();
             exit;
        }
    }
    echo $id."\n";
 }

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

В основном по любой причине вы получаете 0 для переменной $id в вашемметод.Наиболее вероятной причиной (помимо отправки 0) является нечто иное, чем присвоение ему числа, а затем преобразование в 0 с intval

в $ _SESSION ['products'] появляется [0]

Если вы, например, позвоните addInOrder("foo"), вы получите элемент массива с номером и индексом 0.

. Я не могу использовать$_SESSION в песочнице, но мы можем продублировать, как это работает, используя global $session.С этим я могу воспроизвести (что, я думаю, вы говорите):

function addInOrder($id){
        global $session;
        $id= intval($id);
        $productsInOrder=array();
        if(isset($session['products'])){
            $productsInOrder=$session['products'];
        }

        if(array_key_exists($id, $productsInOrder)){
            $productsInOrder[$id]++;
        }else{
            $productsInOrder[$id]=1;
        }

        $session['products']=$productsInOrder;
}

addInOrder(1);
print_r($session);
echo "\n---------------------------------\n";
addInOrder("foo");
print_r($session);

Вывод:

Array
(
    [products] => Array
        (
            [1] => 1
        )

)

---------------------------------
Array
(
    [products] => Array
        (
            [1] => 1
            [0] => 1
        )

)

Песочница

Лично я бывыдает ошибку всякий раз, когда этот метод получает что-то, что falsy после intval только потому, что это никогда не должно произойти, если вызов не испорчен (где вы не отправляете ему идентификатор).Но я должен упомянуть, что никогда не показывать трассировку стека на рабочем сервере, так как аргументы могут содержать такие вещи, как пароли БД и т. Д. *

Надеюсь, это поможет.

...