Как удалить переменную из массива сессии PHP - PullRequest
48 голосов
/ 09 февраля 2010

У меня есть PHP-код, который используется для добавления переменных в сеанс:

<code><?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); ?>  
" method = "post"> " method = "post">

Я хочу удалить переменную, показанную в $list2, из массива сеансов, когда пользователь выбирает «Удалить».

Но когда я сбрасываю, ВСЕ переменные в массиве удаляются.

Как я могу удалить только одну переменную?

Ответы [ 6 ]

53 голосов
/ 09 февраля 2010
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'] - это массив, вам нужно найти ключ массива, который указывает на интересующее вас имя. Последняя строка переупорядочивает индекс массива для следующего использования.

44 голосов
/ 09 февраля 2010

Чтобы удалить конкретную переменную из сеанса, используйте:

session_unregister('variableName');

( см. Документацию ) или

unset($_SESSION['variableName']);

Примечание: session_unregister() УСТАРЕЛО с PHP 5.3.0 и УДАЛЕНО с PHP 5.4.0.

6 голосов
/ 09 февраля 2010

Является ли переменная $ _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, установленный в 'variable_order' .ini setting.

<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

2 голосов
/ 13 августа 2016

Если вы хотите удалить или сбросить все $ _SESSION, попробуйте это

session_destroy();

Если вы хотите удалить определенный $ _SESSION ['name'], попробуйте это

session_unset('name');
1 голос
/ 09 февраля 2010

В настоящее время вы очищаете массив имен, вам нужно вызвать массив, а затем индекс, который вы хотите сбросить в массиве:

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

unset ($ar[2])

Два способа сбросазначения в массиве:

<code><?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),
     '
';# Например, свекла и морковь не являются фруктами ... $ fruit_inventory = array_remove_key ($ fruit_inventory, "beets", "carrots");echo "
Array after key removal:\n",
     print_r($fruit_inventory,TRUE),
     '
'; # Давайте также удалим фрукты" вне сезона "и" больше не продаются "... $ fruit_inventory = array_remove_value ($ fruit_inventory," вне сезона "," больше не продается "); echo"
Array after value removal:\n",
     print_r($fruit_inventory,TRUE),
     '
';?>

Итак, unset не влияет на внутренний счетчик массива !!!

http://us.php.net/unset

0 голосов
/ 09 февраля 2010

Попробуйте это:

if(FALSE !== ($key = array_search($_GET['name'],$_SESSION['name'])))
{
    unset($_SESSION['name'][$key]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...