Как удалить переменную из массива сеансов 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
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']
- это массив, вам нужно найти ключ массива, который указывает на интересующее вас имя. Последняя строка перестраивает индекс массива для следующего использования.
Ответ 2
Чтобы удалить определенную переменную из сеанса, используйте:
session_unregister('variableName');
(см. документацию) или
unset($_SESSION['variableName']);
Примечание:
session_unregister()
был DEPRECATED с PHP 5.3.0 и удалены с PHP 5.4.0.
Ответ 3
Является ли переменная $_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. Есть ли причина, по которой вы не можете делать формы с "именем", передаваемым в скрытом поле? Лучше не смешивать переменные get и post, особенно если вы используете $_REQUEST в другом месте. Вы можете столкнуться во всевозможные забавы, пытаясь понять, почему $_GET ['name'] не отображается так же, как $_POST ['name'], потому что сервер получил отличный набор настроек EGPCS в 'variables_order'.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
Ответ 4
В настоящее время вы очищаете массив имен, вам нужно вызвать массив, а затем индекс, который вы хотите отменить в массиве:
$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 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
Ответ 5
Если вы хотите удалить или удалить все $_SESSION, попробуйте
session_destroy();
Если вы хотите удалить конкретную $_SESSION ['name'], попробуйте
session_unset('name');
Ответ 6
Попробуйте следующее:
if(FALSE !== ($key = array_search($_GET['name'],$_SESSION['name'])))
{
unset($_SESSION['name'][$key]);
}