Частично удалить / уничтожить данные $ _SESSION? PHP - PullRequest
3 голосов
/ 24 января 2012

Я ищу способ удалить только определенные объемы данных SESSION, которые сохраняются при сохранении данных сеанса, связанных с пользователем, вошедшим в систему.

В данный момент я делаю это с помощью отдельных неустановленных операторов для переменных SESSION, которые я хочу удалить.

Однако я надеялся, что может быть более умный способ просто удалить целый раздел массива SESSION, сохранив при этом определенные переменные

, например

$_SESSION['username'];
$_SESSION['user_id'];
$_SESSION['ttl'];

Вариант использования этого процесса:

Вход пользователя в систему -> Пользователь выполняет задачу -> После завершения задачи удалите данные сеанса, связанные с задачей -> Пользователь все еще вошел в систему!

Возможно, я подумал об использовании таблицы в моих логинах мониторинга базы данных, что вы думаете об этом?

Спасибо за ваше время!

Ответы [ 4 ]

3 голосов
/ 24 января 2012

Невозможно удалить «весь раздел массива SESSION при сохранении определенных переменных». Вместо этого вы можете использовать двумерный массив для задачи и удалить этот массив.

$_SESSION["task1"]["username"] = "name"
$_SESSION["task1"]["pass"] = "pass"

$_SESSION["task2"]["name"] = "name";

когда задача 1полное удаление, например

  unset($_SESSION["task1"]);

, теперь $ _SESSION ["task2"] все еще существует.

1 голос
/ 24 января 2012

Ну, вы можете хранить все эти изменчивые данные в другом ключе:

$_SESSION['volatile'] = array(
   'one' => 'value'
);

Если вы не хотите этого делать, вы можете использовать функции сравнения массивов, такие как:

// specify what keys to keep
$_SESSION = array_intersect_key($_SESSION, array('keepme1', 'keepme2', 'etc'));

//specify what keys to remove
$_SESSION = array_diff_key($_SESSION, array('deleteme1', 'deleteme2', 'etc'));

Насколькокак БД, вы можете сделать это, но это не обязательно для достижения вашей цели, и, если в исходном вопросе нет движущихся частей, которые вы не перечислили, то, возможно, вам не нужно делать ничего сложного прямо сейчас.

0 голосов
/ 17 мая 2017

Мне придется не согласиться с @sathishkumar, следующий метод частично уничтожает переменные сеанса.

public static function destroyPartial($keys)
{

    if (session_status() === \PHP_SESSION_NONE) {
        session_start();
    }

    if (!is_array($keys)) {
        $keys = [$keys];
    }
    foreach ($_SESSION as $k => $v) {
        if (in_array($k, $keys, true)) {
            unset($_SESSION[$k]);
        }
    }



    $recoveringSession = $_SESSION;
    session_destroy();
    session_start();
    $_SESSION = $recoveringSession;
}

В документации php для функции session_destroy мы можем прочитать это:

session_destroy () уничтожает все данные, связанные с текущим сессия. Он не сбрасывает ни одну из глобальных переменных, связанных с сеанс или сброс файла cookie сеанса. Чтобы использовать переменные сеанса снова, session_start () должен быть вызван.

Итак, «хитрость» заключается в вызове session_start ПОСЛЕ session_destroy.

Надеюсь, это поможет.

0 голосов
/ 24 января 2012

Структурируйте данные вашего сеанса в иерархии:

$_SESSION['loggedIn'] = TRUE;

// Temporary session data
$_SESSION['temporary'] = array(
    'temp_var1' => 'foo',
    'temp_var2' => 'bar',
    // ...
    'temp_var99' => 'baz'
);

echo $_SESSION['temporary']['temp_var2']; // bar

// Remove all temporary session data
unset($_SESSION['temporary']);

echo $_SESSION['loggedIn'] ? 'yes' : 'no'; // yes
...