web-dev-qa-db-fra.com

Comment supprimer une variable d'un PHP tableau de session

J'ai le code PHP utilisé pour ajouter des variables à une session:

<?php
    session_start();
    if(isset($_GET['name']))
    {
        $name = isset($_SESSION['name']) ? $_SESSION['name'] : array();
        $name[] = $_GET['name'];
        $_SESSION['name'] = $name;
    }
    if (isset($_POST['remove']))
    {
        unset($_SESSION['name']);
    }
?>
<pre>  <?php print_r($_SESSION); ?>  </pre>

<form name="input" action="index.php?name=<?php echo $list ?>" method="post">
  <input type="submit" name ="add"value="Add" />
</form>

<form name="input" action="index.php?name=<?php echo $list2 ?>" method="post">
  <input type="submit" name="remove" value="Remove" />
</form>

Je souhaite supprimer la variable indiquée dans $list2 du tableau de session lorsque l'utilisateur choisit "Supprimer". 

Mais lorsque je désactive, TOUTES les variables du tableau sont supprimées.

Comment puis-je supprimer une seule variable?

46
LiveEn
if (isset($_POST['remove'])) {
    $key=array_search($_GET['name'],$_SESSION['name']);
    if($key!==false)
    unset($_SESSION['name'][$key]);
    $_SESSION["name"] = array_values($_SESSION["name"]);
} 

Puisque $_SESSION['name'] est un tableau, vous devez trouver la clé de tableau qui pointe vers le nom qui vous intéresse. La dernière ligne réorganise l'index du tableau pour la prochaine utilisation.

51
dnagirl

Pour supprimer une variable spécifique de la session, utilisez:

session_unregister('variableName');

( voir documentation ) ou 

unset($_SESSION['variableName']);

NOTE:session_unregister() a été déprécié à partir de PHP 5.3.0 et a été supprimé à partir de PHP 5.4.0.

43
Andreas

La variable $ _SESSION ['name'] est-elle un tableau? Si vous souhaitez supprimer une clé spécifique dans un tableau, vous devez faire référence à cette clé exacte dans l'appel unset (), sinon vous supprimez le tableau entier, par exemple.

$name = array(0 => 'a', 1 => 'b', 2 => 'c');
unset($name); // deletes the entire array
unset($name[1]); // deletes only the 'b' entry

Un autre problème mineur avec votre extrait de code: vous mélangez les paramètres de requête GET avec un formulaire POST. Y a-t-il une raison pour laquelle vous ne pouvez pas faire passer les formulaires avec 'nom' dans un champ caché? Il est préférable de ne pas mélanger les variables get et post, surtout si vous utilisez $ _REQUEST ailleurs. Vous pouvez rencontrer toutes sortes de choses amusantes en essayant de comprendre pourquoi $ _GET ['nom'] ne s'affiche pas de la même manière que $ _POST ['nom'], car le serveur a un ordre différent pour EGPCS défini dans la commande 'variables_order' réglage .ini.

<form blah blah blah method="post">
  <input type="hidden" name="name" value="<?= htmlspecialchars($list1) ?>" />
  <input type="submit" name="add" value="Add />
</form>

Et notez l'appel htmlspecialchars (). Si $ list1 ou $ list2 contient un guillemet double ("), cela cassera votre code HTML

5
Marc B

Actuellement, vous effacez le tableau de noms, vous devez appeler le tableau, puis l'index que vous souhaitez supprimer dans le tableau:

$ar[0]==2
$ar[1]==7
$ar[2]==9

unset ($ar[2])

Deux façons de supprimer les valeurs d'un tableau:

<?php
# remove by key:
function array_remove_key ()
{
  $args  = func_get_args();
  return array_diff_key($args[0],array_flip(array_slice($args,1)));
}
# remove by value:
function array_remove_value ()
{
  $args = func_get_args();
  return array_diff($args[0],array_slice($args,1));
}

$fruit_inventory = array(
  'apples' => 52,
  'bananas' => 78,
  'peaches' => 'out of season',
  'pears' => 'out of season',
  'oranges' => 'no longer sold',
  'carrots' => 15,
  'beets' => 15,
);

echo "<pre>Original Array:\n",
     print_r($fruit_inventory,TRUE),
     '</pre>';

# For example, beets and carrots are not fruits...
$fruit_inventory = array_remove_key($fruit_inventory,
                                    "beets",
                                    "carrots");
echo "<pre>Array after key removal:\n",
     print_r($fruit_inventory,TRUE),
     '</pre>';

# Let's also remove 'out of season' and 'no longer sold' fruit...
$fruit_inventory = array_remove_value($fruit_inventory,
                                      "out of season",
                                      "no longer sold");
echo "<pre>Array after value removal:\n",
     print_r($fruit_inventory,TRUE),
     '</pre>';
?> 

Donc, non défini n'a aucun effet sur le compteur de tableau interne !!!

http://us.php.net/unset

1
James Campbell

Si vous voulez supprimer ou désélectionner tous les $ _SESSION, essayez ceci

session_destroy();

Si vous souhaitez supprimer des $ _SESSION ['name'] spécifiques, essayez ceci

session_unset('name');
1
Asad Ali

Essaye celui-là:

if(FALSE !== ($key = array_search($_GET['name'],$_SESSION['name'])))
{
    unset($_SESSION['name'][$key]);
}
0
dev-null-dweller