2010-02-09 2 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

вы не можете код HTML внутри PHP файл без вызова 'echo' заранее, то есть.' эхо «<форма имя =" вход "action =" index .. "> '' –

+3

@ Энтони вы можете, если это не внутри тегов . – GSto

+0

D'oh! Я не видел, чтобы это было не * (ладонь на лбу) * –

ответ

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 и REMOVED, как PHP 5.4.0.

+0

он отбрасывает все значения из массива, а не синглы :( – LiveEn

+0

Если переменная, которую вы пытаетесь «отбросить»/«unset», является массивом, тогда массив будет удален, например $ _SESSION ['myarray'] = array ('key' => val, 'key2' => val2); usnet ($ _ SESSION ['myarray'] отключит массив ... но unset ($ _ SESSION ['myarray'] ['key2'] удалит второй элемент массива - (ключ, значение) пара – Andreas

+3

session_unregister() «Эта функция была DEPRECATED с PHP 5.3.0 и удалена с PHP 5.4.0. " – Lamy

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. Есть ли причина, по которой вы не можете делать формы с «именем», передаваемым в скрытом поле? Лучше не смешивать переменные 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().Если либо $ песни1 или $ песни2 содержат двойные кавычки ("), он будет нарушать ваш HTML

1

Если вы хотите удалить или отключенное все $ _SESSION«s попробуйте этот

session_destroy(); 

Если вы хотите удалить конкретный $ _SESSION [ «имя»], то попробуйте этот

session_unset('name');