3
votes

Problème avec Unset (PHP)

J'essaie de désarmer un élément du tableau de session, il est désarmé une fois puis le ramène à nouveau. par exg: -

si je clique pour supprimer itemId = 5, il supprime du tableau de session, puis je clique pour supprimer itemId = 6, alors je vois que l'ancien itemId = 5 est de retour dans le tableau.

/ *** supprimer l'article du panier *** /

       public function deleteCartItem($id, $customerId, $cartId, $wishlistFlag=false) // Param: ProductID, CustomerID, CartID, WishlistFlag
        {
            $conn = $_SESSION['conn'];
            $itemId = false;
            $chk = array();
           
                    $sql = "DELETE FROM cart_items WHERE product_id=? AND cart_id=?";
                    $stmt = mysqli_prepare($conn, $sql);//$result = $conn->query($sql);
                    $stmt->bind_param('ii', $item['id'],$cartId);
                    $stmt->execute();
                    $itemId = $i;
                    echo $itemId; 
                    $chk[] = $_SESSION['cart'];
                    echo'</br>'; 
                    print_r($chk);
                }
            }
            if (isset($_SESSION['cart'][$itemId])){
                unset($_SESSION['cart'][$itemId]);
       }    
} 





<?php

    $_SESSION['cart'] = array (
  0 => 
  array (
    'id' => 6154353459,
    'name' => 'pro one Night Out Mesh Tee',
    'display_brand' => 'Widow',
    'qty' => 1,
    'price' => '28.0000',
    'special_price' => 0,
    'rule_price' => '',
    'attributes' => 
    array (
      0 => 'BLACK',
      1 => 'XX-Large',
    ),
    'option80' => 18,
    'option125' => 3457,
    'child_product_id' => 61535897,
    'giftcard' => '',
    'whole_preorder' => 0,
    'preorder_shipping_date' => NULL,
    'available_qty' => 5,
    'isRefundable' => true,
    'max_sale_qty' => false,
    'isFree' => 0,
    'segment' => 
    array (
      'magento_product_id' => '65315459',
      'product_id' => 'P19335935',
      'quantity' => 1,
      'name' => 'pro one Night Out Mesh Tee',
      'brand' => 'Widow',
      'price' => 28.0,
      'special_price' => NULL,
      'regular_price' => 28.0,
      'size_type' => 'Regular',
      'manufacturer' => 'Widow',
      'trend' => 'WID goodie Hour 2020',
      'microcategory' => 'Mesh Shirt',
      'doll_category' => NULL,
      'stock_quantity' => 10,
      'sku' => 'S493660',
      'child_stock_quantity' => 1,
      'size' => 'XX-Large',
      'swatch' => 'BLACK',
    ),
  ),
  5 => 
  array (
    'id' => 615345465,
    'name' => 'pro one Night Out Mesh Leggings',
    'display_brand' => 'Widow',
    'qty' => 1,
    'price' => '30.0000',
    'special_price' => 0,
    'rule_price' => '',
    'attributes' => 
    array (
      0 => 'BLACK',
      1 => 'Medium',
    ),
    'option80' => 18,
    'option125' => 3454,
    'child_product_id' => 6315890,
    'giftcard' => '',
    'whole_preorder' => '',
    'preorder_shipping_date' => NULL,
    'available_qty' => 37,
    'isRefundable' => true,
    'max_sale_qty' => false,
    'isFree' => 0,
    'segment' => 
    array (
      'magento_product_id' => '64334515465',
      'product_id' => 'P193936',
      'quantity' => 1,
      'name' => 'pro one Night Out Mesh Leggings',
      'brand' => 'Widow',
      'price' => 30.0,
      'special_price' => NULL,
      'regular_price' => 30.0,
      'size_type' => 'Regular',
      'manufacturer' => 'Widow',
      'trend' => 'WID goodie Hour 2020',
      'microcategory' => 'Printed Leggings',
      'doll_category' => NULL,
      'stock_quantity' => 10,
      'sku' => 'S493664',
      'child_stock_quantity' => 10,
      'size' => 'Medium',
      'swatch' => 'BLACK',
    ),
  ),
  2 => 
  array (
    'id' => 615445348,
    'name' => 'pro two My Lashes Sunglasses',
    'display_brand' => '',
    'qty' => 1,
    'price' => '15.0000',
    'special_price' => 0,
    'rule_price' => '',
    'attributes' => 
    array (
      0 => 'BLACK',
      1 => 'ONE SIZE',
    ),
    'option80' => 18,
    'option125' => 6212,
    'child_product_id' => 6154345358,
    'giftcard' => '',
    'whole_preorder' => '',
    'preorder_shipping_date' => NULL,
    'available_qty' => 295,
    'isRefundable' => true,
    'max_sale_qty' => false,
    'isFree' => 0,
    'segment' => 
    array (
      'magento_product_id' => '6153453448',
      'product_id' => 'P19645642180',
      'quantity' => 1,
      'name' => 'pro two My Lashes Sunglasses',
      'brand' => '',
      'price' => 15.0,
      'special_price' => NULL,
      'regular_price' => 15.0,
      'size_type' => 'Regular',
      'manufacturer' => 'CIEL',
      'trend' => 'WID goodie Hour 2020',
      'microcategory' => 'Cat Eye Sunglasses',
      'category' => 'Accessories,Sunglasses,Cat Eye Sunglasses',
      'special_category' => 'What\'s New,Char Test Category,Widow',
      'doll_category' => NULL,
      'stock_quantity' => 10,
      'sku' => 'S486477',
      'child_stock_quantity' => 10,
      'size' => 'ONE SIZE',
      'swatch' => 'BLACK',
    ),
  ),
  3 => 
  array (
    'id' => 61465645461,
    'name' => 'pro one Night Out goodie Dress',
    'display_brand' => 'Widow',
    'qty' => 1,
    'price' => '45.0000',
    'special_price' => 0,
    'rule_price' => '',
    'attributes' => 
    array (
      0 => 'BLACK',
      1 => 'X-Large',
    ),
    'option80' => 18,
    'option125' => 3456,
    'giftcard' => '',
    'whole_preorder' => '',
    'preorder_shipping_date' => NULL,
    'available_qty' => 12,
    'isRefundable' => true,
    'max_sale_qty' => false,
    'isFree' => 0,
    'segment' => 
    array (
      'magento_product_id' => '616465461',
      'product_id' => 'P1935446934',
      'quantity' => 1,
      'name' => 'pro one Night Out goodie Dress',
      'brand' => 'Widow',
      'price' => 45.0,
      'special_price' => NULL,
      'regular_price' => 45.0,
      'size_type' => 'Regular',
      'manufacturer' => 'Widow',
      'trend' => 'WID goodie Hour 2020',
      'microcategory' => 'goodie Dresses',
      'category' => 'Clothing,Dresses,Mini,goodie Dresses',
      'special_category' => 'Brandsgoodie,Char Test Category,Widow,Widow',
      'doll_category' => NULL,
      'stock_quantity' => 10,
      'sku' => 'S493652',
      'child_stock_quantity' => 10,
      'size' => 'X-Large',
      'swatch' => 'BLACK',
    ),
  ),
  4 => 
  array (
    'id' => 6154566225,
    'name' => 'Feelings Maxi Dress',
    'display_brand' => 'Widow',
    'qty' => 1,
    'price' => '58.0000',
    'special_price' => 0,
    'rule_price' => '',
    'attributes' => 
    array (
      0 => 'BLACK',
      1 => 'Large',
    ),
    'option80' => 18,
    'option125' => 3455,
    'child_product_id' => 61456455677,
    'giftcard' => '',
    'whole_preorder' => '',
    'preorder_shipping_date' => NULL,
    'available_qty' => 30,
    'isRefundable' => true,
    'max_sale_qty' => false,
    'isFree' => 0,
    'segment' => 
    array (
      'magento_product_id' => '614565225',
      'product_id' => 'P1945652050',
      'quantity' => 1,
      'name' => 'Phantom Feelings Maxi Dress',
      'brand' => 'Widow',
      'price' => 58.0,
      'special_price' => NULL,
      'regular_price' => 58.0,
      'size_type' => 'Regular',
      'manufacturer' => 'Widow',
      'trend' => 'WID goodie Hour 2020',
      'microcategory' => 'Maxi Dresses',
      'category' => 'Dresses,Midi & Maxi,Maxi Dresses',
      'special_category' => 'Brandsgoodie,Char Test Category,Widow,Widow',
      'doll_category' => NULL,
      'stock_quantity' => 10,
      'sku' => 'S485794',
      'child_stock_quantity' => 10,
      'size' => 'Large',
      'swatch' => 'BLACK',
    ),
  )
  );

$itemId = 5; // comes dybamically;
   if (   isset($_SESSION['cart'][$itemId])) {
            unset($_SESSION['cart'][$itemId]);
    }
?>

Je ne comprends pas, des pensées?

Vous pouvez également jeter un œil au bac à sable - http://sandbox.onlinephpfunctions.com/code/6bab394d1da39a301ce82b974022da7b7efaface

Veuillez consulter le code complet ici - PROBLÈME DE MISE À JOUR DE LA SESSION PHP

Merci


16 commentaires

Il n'y a pas d'article 5 dans votre panier


Vous devez démontrer un peu plus l'architecture. Que se passe-t-il lorsque vous «cliquez pour supprimer»? Veuillez partager tout le code impliqué.


Vos questions ne sont pas claires


Si vous soumettez à nouveau la même page ou si vous avez codé en dur l'élément dans le tableau de session, il est normal qu'il revienne.


oui, il reviendra car il remplacera à nouveau les données


Jerson, tu as le problème?


J'ai ajouté un lien sandbox.


Faites-moi savoir si je peux encore clarifier la question. Merci beaucoup


Des pensées à ce sujet?


@Rambarun Komaljeet comment l'empêcher?


Est-ce le même problème que vous avez décrit dans votre question précédente ?


Oui @El_Vanja à droite


Je ne sais vraiment pas quel code peut provoquer ce type de comportement. J'ai besoin de quelques suggestions. comment puis-je le déboguer.


Dans votre question précédente, vous avez déclaré: "J'ai constaté que lorsque je supprime rapidement des produits l'un après l'autre, cela pose problème". Cela ressemble à peu près à un problème avec les requêtes AJAX simultanées. L'action est-elle déclenchée via AJAX?


Oui @El_Vanja en utilisant AJAX, mais maintenant je supprime le produit après 20 secondes d'intervalle, même problème. en passant merci d'avoir montré votre intérêt à remettre en question.


Je peux voir que leur requête ismany ajax a "aysnc async: true". Si c'est vraiment un problème avec la session, lorsque je supprime certains éléments en session, il revient. Cette requête ajax est appelée avant que je souhaite créer une requête ajax de suppression d'un élément de la session. Quand pour une fonctionnalité, mais je ne suis pas sûr que ce soit leur inconvénient de "falseasync: true, ça marche bien". Je ne sais pas comment et pourquoi Quels sont les inconvénients de "async: true" en ajax?


5 Réponses :


1
votes

La meilleure approche consiste à récupérer le tableau mis à jour à partir de la session et à le déclarer à nouveau

$cart_array = array (
    0 => 
    array (
        'id' => 6154353459,
        'name' => 'pro one Night Out Mesh Tee',
        'display_brand' => 'Widow',
        'qty' => 1,
        'price' => '28.0000',
        'special_price' => 0,
        'rule_price' => '',
        'attributes' => 
        array (
        0 => 'BLACK',
        1 => 'XX-Large',
        ),
        'option80' => 18,
        'option125' => 3457,
        'child_product_id' => 61535897,
        'giftcard' => '',
        'whole_preorder' => 0,
        'preorder_shipping_date' => NULL,
        'available_qty' => 5,
        'isRefundable' => true,
        'max_sale_qty' => false,
        'isFree' => 0,
        'segment' => 
        array (
        'magento_product_id' => '65315459',
        'product_id' => 'P19335935',
        'quantity' => 1,
        'name' => 'pro one Night Out Mesh Tee',
        'brand' => 'Widow',
        'price' => 28.0,
        'special_price' => NULL,
        'regular_price' => 28.0,
        'size_type' => 'Regular',
        'manufacturer' => 'Widow',
        'trend' => 'WID goodie Hour 2020',
        'microcategory' => 'Mesh Shirt',
        'doll_category' => NULL,
        'stock_quantity' => 10,
        'sku' => 'S493660',
        'child_stock_quantity' => 1,
        'size' => 'XX-Large',
        'swatch' => 'BLACK',
        ),
    ),
    5 => 
    array (
        'id' => 615345465,
        'name' => 'pro one Night Out Mesh Leggings',
        'display_brand' => 'Widow',
        'qty' => 1,
        'price' => '30.0000',
        'special_price' => 0,
        'rule_price' => '',
        'attributes' => 
        array (
        0 => 'BLACK',
        1 => 'Medium',
        ),
        'option80' => 18,
        'option125' => 3454,
        'child_product_id' => 6315890,
        'giftcard' => '',
        'whole_preorder' => '',
        'preorder_shipping_date' => NULL,
        'available_qty' => 37,
        'isRefundable' => true,
        'max_sale_qty' => false,
        'isFree' => 0,
        'segment' => 
        array (
        'magento_product_id' => '64334515465',
        'product_id' => 'P193936',
        'quantity' => 1,
        'name' => 'pro one Night Out Mesh Leggings',
        'brand' => 'Widow',
        'price' => 30.0,
        'special_price' => NULL,
        'regular_price' => 30.0,
        'size_type' => 'Regular',
        'manufacturer' => 'Widow',
        'trend' => 'WID goodie Hour 2020',
        'microcategory' => 'Printed Leggings',
        'doll_category' => NULL,
        'stock_quantity' => 10,
        'sku' => 'S493664',
        'child_stock_quantity' => 10,
        'size' => 'Medium',
        'swatch' => 'BLACK',
        ),
    ),
    2 => 
    array (
        'id' => 615445348,
        'name' => 'pro two My Lashes Sunglasses',
        'display_brand' => '',
        'qty' => 1,
        'price' => '15.0000',
        'special_price' => 0,
        'rule_price' => '',
        'attributes' => 
        array (
        0 => 'BLACK',
        1 => 'ONE SIZE',
        ),
        'option80' => 18,
        'option125' => 6212,
        'child_product_id' => 6154345358,
        'giftcard' => '',
        'whole_preorder' => '',
        'preorder_shipping_date' => NULL,
        'available_qty' => 295,
        'isRefundable' => true,
        'max_sale_qty' => false,
        'isFree' => 0,
        'segment' => 
        array (
        'magento_product_id' => '6153453448',
        'product_id' => 'P19645642180',
        'quantity' => 1,
        'name' => 'pro two My Lashes Sunglasses',
        'brand' => '',
        'price' => 15.0,
        'special_price' => NULL,
        'regular_price' => 15.0,
        'size_type' => 'Regular',
        'manufacturer' => 'CIEL',
        'trend' => 'WID goodie Hour 2020',
        'microcategory' => 'Cat Eye Sunglasses',
        'category' => 'Accessories,Sunglasses,Cat Eye Sunglasses',
        'special_category' => 'What\'s New,Char Test Category,Widow',
        'doll_category' => NULL,
        'stock_quantity' => 10,
        'sku' => 'S486477',
        'child_stock_quantity' => 10,
        'size' => 'ONE SIZE',
        'swatch' => 'BLACK',
        ),
    ),
    3 => 
    array (
        'id' => 61465645461,
        'name' => 'pro one Night Out goodie Dress',
        'display_brand' => 'Widow',
        'qty' => 1,
        'price' => '45.0000',
        'special_price' => 0,
        'rule_price' => '',
        'attributes' => 
        array (
        0 => 'BLACK',
        1 => 'X-Large',
        ),
        'option80' => 18,
        'option125' => 3456,
        'giftcard' => '',
        'whole_preorder' => '',
        'preorder_shipping_date' => NULL,
        'available_qty' => 12,
        'isRefundable' => true,
        'max_sale_qty' => false,
        'isFree' => 0,
        'segment' => 
        array (
        'magento_product_id' => '616465461',
        'product_id' => 'P1935446934',
        'quantity' => 1,
        'name' => 'pro one Night Out goodie Dress',
        'brand' => 'Widow',
        'price' => 45.0,
        'special_price' => NULL,
        'regular_price' => 45.0,
        'size_type' => 'Regular',
        'manufacturer' => 'Widow',
        'trend' => 'WID goodie Hour 2020',
        'microcategory' => 'goodie Dresses',
        'category' => 'Clothing,Dresses,Mini,goodie Dresses',
        'special_category' => 'Brandsgoodie,Char Test Category,Widow,Widow',
        'doll_category' => NULL,
        'stock_quantity' => 10,
        'sku' => 'S493652',
        'child_stock_quantity' => 10,
        'size' => 'X-Large',
        'swatch' => 'BLACK',
        ),
    ),
    4 => 
    array (
        'id' => 6154566225,
        'name' => 'Feelings Maxi Dress',
        'display_brand' => 'Widow',
        'qty' => 1,
        'price' => '58.0000',
        'special_price' => 0,
        'rule_price' => '',
        'attributes' => 
        array (
        0 => 'BLACK',
        1 => 'Large',
        ),
        'option80' => 18,
        'option125' => 3455,
        'child_product_id' => 61456455677,
        'giftcard' => '',
        'whole_preorder' => '',
        'preorder_shipping_date' => NULL,
        'available_qty' => 30,
        'isRefundable' => true,
        'max_sale_qty' => false,
        'isFree' => 0,
        'segment' => 
        array (
        'magento_product_id' => '614565225',
        'product_id' => 'P1945652050',
        'quantity' => 1,
        'name' => 'Phantom Feelings Maxi Dress',
        'brand' => 'Widow',
        'price' => 58.0,
        'special_price' => NULL,
        'regular_price' => 58.0,
        'size_type' => 'Regular',
        'manufacturer' => 'Widow',
        'trend' => 'WID goodie Hour 2020',
        'microcategory' => 'Maxi Dresses',
        'category' => 'Dresses,Midi & Maxi,Maxi Dresses',
        'special_category' => 'Brandsgoodie,Char Test Category,Widow,Widow',
        'doll_category' => NULL,
        'stock_quantity' => 10,
        'sku' => 'S485794',
        'child_stock_quantity' => 10,
        'size' => 'Large',
        'swatch' => 'BLACK',
        ),
    )
    );

if(!isset($_SESSION['cart'])) {
    $_SESSION['cart'] = $cart_array;
} else {
    $_SESSION['cart'] = (array) $_SESSION['cart'];
}

$itemId = 3;

if (isset($_SESSION['cart'][$itemId])) {
    unset($_SESSION['cart'][$itemId]);
}

print_r($_SESSION['cart']);

Maintenant, il ne sera pas de nouveau en arrière l'élément de suppression, sauf si vous détruisez la session


9 commentaires

que sera ici - $ cart_array = // Votre tableau par défaut de session ici? tableau par défaut lequel? vous voulez dire tableau de panier de session?


Je veux dire votre ensemble de tableaux de vos données


Cela ne semble pas fonctionner. pouvez-vous s'il vous plaît revoir le code en réponse. J'espère que vous comprenez le problème. Lorsque je déplace le produit à supprimer sur le frontend, il désactive un élément du tableau de session. Ensuite, je déplace un autre élément à supprimer. l'élément qui n'était pas défini est de retour dans le tableau de session.


j'ai modifié ma réponse


Je l'apprécie, merci laissez-moi le tester.


oui car le tableau en session récupère le tableau d'origine, donc le précédent supprimé est inutile, vous devez enregistrer le tableau modifié dans le tableau et supprimer un autre élément


Continuons cette discussion en chat .


Malheureusement, cela n'a pas fonctionné.


Des pensées à ce sujet?



2
votes

Vous relisez probablement les données de session afin que la suppression que vous effectuez soit annulée.

$cart = &$_SESSION['cart'];

BON À SAVOIR PHP passe la plupart des variables par valeur par défaut, ce qui signifie que

$ cart = $ _SESSION ['panier'];

copie le contenu de $ _SESSION ['cart'] dans $ cart.

Toute modification apportée à $ cart ne sera pas automatiquement mise à jour dans $ _SESSION ['cart'].

Si vous ne voulez pas une copie mais une référence, vous pouvez utiliser:

<?php
$cart = $_SESSION['cart'];
unset($cart[5]);
echo 'deletion confirmed';

//later in execution..
//accidental re-read of cart from session-variable.
$cart = $_SESSION['cart']; //oops..
//calc totals in basket or something..
$totals = 0;
foreach($cart as $item) {
  $totals = $totals + $item['qty'] * $item['price'];
}

//somewhere in the script, the session variable is updated.
$_SESSION['cart'] = $cart;

et vous n'aurez pas besoin de sauvegarder $ cart dans $ _SESSION.

(Assurez-vous simplement que $ _SESSION ['cart'] est initialisé lors de la référence)


10 commentaires

Merci pour la réponse mais qu'est-ce que "$ cart = $ _SESSION ['cart']; // oups .."?


C'est là que les pensées tournent mal depuis votre suppression si l'index [5] est invalidé en relisant les données de session.


Pouvez-vous s'il vous plaît mettre à jour la réponse avec le code correct et supprimer le code infecté? Ce serait utile


Malheureusement, cela ne fonctionne pas, je peux voir $ _SESSION ['cart']; avoir d'anciennes données qui n'étaient pas définies lors de la deuxième suppression du produit


Des pensées Teson?


unset créera des trous dans le tableau indexé et peut créer des erreurs étranges, veuillez consulter sandbox.onlinephpfunctions.com/code/...


Quelle peut être la solution alternative pour cela? Ou une solution?


Pouvez-vous me dire que ce type de code peut être à l'origine de ce problème "$ cart = $ _SESSION ['cart']; // oups .."?


J'ai mis à jour la question et ajouté le code.


@dev - vous pouvez avoir une erreur dans votre logique ($ itemId entrant à supprimer), car il devrait plutôt être appelé $ cart_row_id. C'est le ROW que vous passez - pas de PK ou itemNo - le problème pourrait être ici). Si vous supprimez une ligne dans le tableau indexé, puis utilisez $ cart = array_values ($ cart), tout devrait bien se passer à moins que vous n'ayez plus d'erreurs / problèmes dans votre code.



1
votes

Pourquoi $item['id'] utilisé dans $stmt->bind_param( (au lieu de $id ?). $item n'est pas un paramètre de la fonction.

De même, d'où vient la variable $i dans $itemId = $i; ?

J'ai écrit une version simplifiée de votre problème et cela fonctionne comme prévu. Il utilise un formulaire et des boutons pour donner les indices du tableau au script PHP. Si vous avez une configuration différente (comme utiliser Ajax), vous devez clarifier cela.

session_start();

if (!isset($_SESSION['cart']) || sizeof($_SESSION['cart']) === 0)
 {
  echo('Resetting cart.' . PHP_EOL);
  $_SESSION['cart'] = [0 =>'zero', 1 =>'one', 2 =>'two', 3 =>'three', 4 =>'four'];
 }

echo('<pre>before ' . print_r($_SESSION['cart'], TRUE) . '</pre>');

$itemId = isset($_GET['itemid']) ? $_GET['itemid'] : FALSE;
if ($itemId !== FALSE)
 {
  if (isset($_SESSION['cart'][$itemId]))
   {
    echo('Unsetting &raquo;' . $itemId . '&laquo;.' . PHP_EOL);
    unset($_SESSION['cart'][$itemId]);
   }
  else
    echo('&raquo;' . $itemId . '&laquo; not in cart.' . PHP_EOL);
 }
else
  echo('No item ID given.' . PHP_EOL);

echo('<pre>after ' . print_r($_SESSION['cart'], TRUE) . '</pre>');

echo('<form method="get" action="' . $_SERVER['PHP_SELF'] . '">' . PHP_EOL);
foreach ($_SESSION['cart'] as $key=>$value)
  echo('<button name="itemid" value="' . $key .  '">' . $value . '</button>' . PHP_EOL);
echo('</form>' . PHP_EOL);


0 commentaires

-1
votes
$stmt->bind_param('ii', $item['id'],$cartId);
$stmt->execute();
where is $item['id'] from?Try using different variable names on your bind_param and declare their value before query execute() method.

0 commentaires

0
votes

Le manuel l'a précisé

Si une variable globalisée n'est pas définie () à l'intérieur d'une fonction, seule la variable locale est détruite. La variable dans l'environnement appelant conservera la même valeur qu'avant l'appel de unset ().

Pour annuler () une variable globale à l'intérieur d'une fonction, utilisez le tableau $ GLOBALS pour le faire:

<?php
function foo() 
{
    unset($GLOBALS['bar']);
}

$bar = "something";
foo();
?>


0 commentaires