web-dev-qa-db-ja.com

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つだけ削除するにはどうすればよいですか?

48
LiveEn
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']は配列です。目的の名前の値を指す配列キーを見つける必要があります。最後の行は、次の使用のために配列のインデックスを再配置します。

56
dnagirl

セッションから特定の変数を削除するには、次を使用します。

_session_unregister('variableName');
_

ドキュメントを参照 )または

_unset($_SESSION['variableName']);
_

注:session_unregister()は、PHP 5.3.0で廃止され、=で削除されましたPHP 5.4.0。

44
Andreas

$ _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'でフォームを実行できない理由はありますか?特に、他の場所で$ _REQUESTを使用する場合は、get変数とpost変数を混在させないことをお勧めします。 ['name']。これは、サーバーの 'variables_order' .ini設定で異なるEGPCS順序が設定されているためです。

<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が破損します

6
Marc B

すべての$ _SESSIONを削除または設定解除する場合は、これを試してください

session_destroy();

特定の$ _SESSION ['name']を削除する場合は、これを試してください

session_unset('name');
3
Asad Ali

現在、名前の配列をクリアしています。配列を呼び出してから、配列内で設定解除するインデックスを呼び出す必要があります:

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

unset ($ar[2])

配列内の値を設定解除する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

2
James Campbell

これを試してください:

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