我有用于向会话添加变量的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
中显示的变量。
但是当我取消设置时,数组中的所有变量都将被删除。
如何删除一个变量?
答案 0 :(得分:53)
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']
是一个数组,您需要找到指向您感兴趣的名称值的数组键。最后一行重新排列数组的索引以供下次使用。
答案 1 :(得分:44)
要从会话中删除特定变量,请使用:
session_unregister('variableName');
unset($_SESSION['variableName']);
注意:强>
自PHP 5.3.0开始,session_unregister()
已被弃用,自PHP 5.4.0起已被删除。
答案 2 :(得分:6)
$ _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表单混合在一起。你有什么理由不能在隐藏字段中传递'name'的表单吗?最好不要混合使用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()调用。如果$ list1或$ list2包含双引号(“),它将破坏您的HTML
答案 3 :(得分:2)
如果您要删除或取消设置所有$ _SESSION,请尝试
session_destroy();
如果您要删除特定的$ _SESSION [&#39;名称&#39;],请尝试此
session_unset('name');
答案 4 :(得分: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对内部数组计数器没有影响!!!
答案 5 :(得分:0)
试试这个:
if(FALSE !== ($key = array_search($_GET['name'],$_SESSION['name'])))
{
unset($_SESSION['name'][$key]);
}
答案 6 :(得分:0)
只需使用此方法。
<?php
$_SESSION['foo'] = 'bar'; // set session
print $_SESSION['foo']; //print it
unset($_SESSION['foo']); //unset session
?>