Domanda Come rimuovere una variabile da un array di sessione PHP


Ho un codice PHP che viene utilizzato per aggiungere variabili a una sessione:

<?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>

Voglio rimuovere la variabile mostrata in $list2 dall'array di sessione quando l'utente sceglie 'Rimuovi'.

Ma quando disattivo, TUTTE le variabili nell'array vengono cancellate.

Come posso cancellare solo una variabile?


44
2018-02-09 18:11


origine


risposte:


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

Da $_SESSION['name'] è un array, devi trovare la chiave dell'array che punta al valore del nome che ti interessa. L'ultima riga riorganizza l'indice dell'array per il prossimo utilizzo.


49
2018-02-09 19:03



Per rimuovere una variabile specifica dalla sessione, utilizzare:

session_unregister('variableName');

(vedere la documentazione) o

unset($_SESSION['variableName']);

NOTA: session_unregister() è stato DEPRECATO dal PHP 5.3.0 e RIMOSSO a partire da PHP 5.4.0.


40
2018-02-09 18:18



La variabile $ _SESSION ['name'] è una matrice? Se si desidera eliminare una chiave specifica da una matrice, è necessario fare riferimento a quella chiave esatta nella chiamata unset (), altrimenti si elimina l'intero array, ad es.

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

Un altro piccolo problema con lo snippet: stai mescolando i parametri di query GET con un modulo POST. C'è qualche ragione per cui non si possono fare i moduli con il "nome" passato in un campo nascosto? È meglio non mischiare le variabili get e post, specialmente se usi $ _REQUEST altrove. È possibile imbattersi in tutti i tipi di divertimento cercando di capire perché $ _GET ['name'] non viene visualizzato come $ _POST ['name'], perché il server ha un diverso ordine di EGPCS impostato in 'variables_order' impostazione .ini.

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

E nota la chiamata htmlspecialchars (). Se $ list1 o $ list2 contengono una doppia citazione ("), si romperà il codice HTML


5
2018-02-09 20:13



Attualmente stai cancellando l'array del nome, devi chiamare l'array e poi l'indice che vuoi disinserire all'interno dell'array:

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

unset ($ar[2])

Due modi per disattivare i valori all'interno di un array:

<?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>';
?> 

Quindi, unset non ha alcun effetto sul contatore dell'array interno !!!

http://us.php.net/unset


1
2018-02-09 18:19



Se vuoi rimuovere o rimuovere tutti $ _SESSION 's, prova questo

session_destroy();

Se vuoi rimuovere $ _SESSION ['nome'] specifico, prova questo

session_unset('name');

1
2017-08-13 10:52



Prova questo:

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

0
2018-02-09 18:19