2010-02-09 91 views
41

我有一個用於變量添加到會話PHP代碼:如何從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> 

我想刪除了在$list2從會話陣列時顯示的變量用戶選擇'刪除'。

但是當我取消設置時,數組中的所有變量都被刪除。

如何刪除一個變量?

+1

可以將PHP文件裏沒有代碼的HTML,而無需調用'echo'事前,即'回聲「<表格名稱=「輸入「action =」index ..「>'' – 2010-02-09 18:14:02

+3

@Anthony如果它不在標籤內,則可以。 – GSto 2010-02-09 18:26:11

+0

D'oh!我沒有看到它不是*(額頭上的手掌)* – 2010-02-09 18:31:23

回答

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"]); 
} 

由於$_SESSION['name']是一個數組,你需要找到一個指向名稱值你感興趣的陣列的關鍵。最後一行重新排列數組的索引,以便下次使用。

39

爲了從會話中使用的刪除特定變量:

session_unregister('variableName'); 

see documentation)或

unset($_SESSION['variableName']); 

注: session_unregister()已被棄用的PHP 5.3.0和除去的PHP 5.4.0。

+0

它將從陣列中刪除所有值,而不是單曲:( – LiveEn 2010-02-09 19:26:39

+0

)如果您試圖「放下」/「未設置」的變量是一個數組, ($ _SESSION ['myarray'] = array('key'=> val,'key2'=> val2); usnet($ _ SESSION ['myarray']將取消設置數組...'但是 未設置($ _ SESSION ['myarray'] ['key2']將刪除第二個數組元素 - (鍵值)對 – Andreas 2010-02-09 22:32:07

+3

session_unregister()「此功能自PHP 5.3.0開始已被拒絕, 5.4.0。「 – Lamy 2012-10-11 11:55:20

0

試試這個:

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

目前你正在清理名稱數組,你需要調用數組,那麼你想在陣列內撤消該指數:

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

unset ($ar[2]) 

在陣列中取消設置值的兩種方法:

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

所以,unset對內部數組計數器沒有任何影響!

http://us.php.net/unset

4

$ _SESSION ['name']變量是一個數組嗎?如果要從數組中刪除特定的鍵,則必須在unset()調用中引用該確切鍵,否則刪除整個數組,例如,

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

您的代碼片段的另一個小問題:您正在將GET查詢參數與POST表單混合在一起。是否有任何理由不能在隱藏字段中傳遞'姓名'的表單?最好不要混合獲取和發佈變量,尤其是在其他地方使用$ _REQUEST的情況下。試圖找出$ _GET ['name']與$ _POST ['name']不一樣的原因,因爲服務器在'variables_order'中設置了不同的EGPCS順序, .ini設置。

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

並注意htmlspecialchars()調用。如果任一$列表1或$ list2中包含雙引號(「),它會破壞你的HTML

1

如果你想刪除或取消所有$ _SESSION的那就試試這個

session_destroy(); 

如果要刪除特定$ _SESSION [「名」]那就試試這個

session_unset('name');