2010-02-09 9 views
41

Ho codice PHP che viene utilizzato per aggiungere variabili a una sessione:Come rimuovere una variabile da un array di sessione di PHP

<?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 che viene mostrato nel $list2 dalla matrice sessione quando l'utente sceglie 'Rimuovi'.

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

Come posso cancellare solo una variabile?

+1

non è possibile il codice HTML all'interno di un file PHP senza chiamare echo' anticipo, vale a dire. echo ' '' –

+3

@Anthony puoi se non è all'interno dei tag . – GSto

+0

D'oh! Non ho visto che non era * (palmo sulla fronte) * –

risposta

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

Dal $_SESSION['name'] è un array, è necessario trovare la chiave dell'array che punta al valore del nome che ti interessa. L'ultima riga riorganizza l'indice della matrice per l'uso prossima .

39

Per rimuovere una variabile specifica dall'utilizzo sessione:

session_unregister('variableName'); 

(see documentation) o

unset($_SESSION['variableName']); 

NOTA: session_unregister() è stato deprecato a partire dal PHP 5.3.0 e rimosso come di PHP 5.4.0.

+0

rilascia tutti i valori dall'array, non i singoli :( – LiveEn

+0

Se la variabile che stai cercando di "rilasciare"/"unset" è un array allora la matrice verrà rimossa. es. $ _SESSION ['myarray'] = array ('chiave' => val, 'chiave2' => val2); usnet ($ _ SESSION ['myarray'] disinserisce l'array ... ma unset ($ _ SESSION ['myarray'] ['key2'] rimuoverà il secondo elemento dell'array - (chiave, valore) coppia – Andreas

+3

session_unregister() "Questa funzione è stata DEPRECATED dal PHP 5.3.0 e RIMOSSA da PHP 5.4.0. " – Lamy

0

Prova questo:

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

Attualmente si sta cancellando la matrice nome, è necessario chiamare la matrice allora l'indice che si desidera disinserire all'interno della matrice:

$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

4

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 prendere nota della chiamata htmlspecialchars().Se sia $ lista1 o $ lista2 contengono una doppia citazione ("), si romperà il codice HTML

1

Se si desidera rimuovere o sciolte tutte $ _SESSION 's quindi provare questo

session_destroy(); 

Se si desidera rimuovere specifica $ _SESSION [ 'name'] quindi provare questo

session_unset('name'); 
Problemi correlati