Редактор сессий PHP - PullRequest
       2

Редактор сессий PHP

2 голосов
/ 29 марта 2011

Существуют ли какие-либо инструменты, которые позволят мне редактировать содержимое моего $ _SESSION?Я пытаюсь отладить сценарий, который зависит от состояния сеанса, и я хотел бы просто иметь возможность изменять переменные сеанса, а не изменять базу данных, уничтожать сеанс и заново создавать его.Возможно, я мог бы создать специальный редактор сессий, если бы у меня было время, но сейчас у меня нет свободного времени.

Ответы [ 7 ]

2 голосов
/ 29 марта 2011

Ну, информация в $_SESSION просто хранится в виде сериализованной строки на диске.(Если вы не используете что-то вроде хранилища сессий memcached)

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


Если вы не хотите иметь дело с этим, вы можете установить session_id() до session_start(), затем отредактируйте значения с помощью php и затем вызовите session_write_close(), чтобы снова сохранить его на диске.


Пример сценария для идентификатора сеанса:

<?php

session_id("838c4dc18f6535cb90a9c2e0ec92bad4");
session_start();
var_dump($_SESSION);
$_SESSION["a"] = "foo";
session_write_close();

Пример сценария для десериализации (функция взята из комментариев на странице unserialze php.net )

<?php

session_save_path("./session");

session_start();

$_SESSION["x"] = 1;

$id = session_id();
var_dump($id);

session_write_close();

$session = file_get_contents("./session/sess_$id");

var_dump($session);
function unserialize_session_data( $serialized_string ) {
    $variables = array(  );
    $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
    for( $i = 0; $i < count( $a ); $i = $i+2 ) {
        $variables[$a[$i]] = unserialize( $a[$i+1] );
    }
    return( $variables );
}

var_dump(unserialize_session_data($session));

Собрать его вместе - не сложный эфир.

2 голосов
/ 02 мая 2011

Чтобы немного расширить его, просто добавьте возможность добавлять новые сеансовые переменные:

<?php

function listData (array $data, array $parents = array ())
{
    $output = '';
    $parents    = array_map ('htmlspecialchars', $parents);
    $fieldName  = $parents?
        '[' . implode ('][', $parents) . ']':
        '';
    foreach ($data as $key => $item)
    {
        $isArr  = is_array ($item);
        $output .= $isArr?
            '<li><h4>' . htmlspecialchars ($key) . '</h4>':
            '<li><label>' . htmlspecialchars ($key) . '</label>: ';
        $output .= $isArr?
            '<ul>' . listData ($item, array_merge ($parents, array ($key))) . '</ul>': 
            '<input type="text" name="fields' . $fieldName . '[' . htmlspecialchars ($key) . ']" value="' . htmlspecialchars ($item) . '" />';
        $output .= "</li>\n";
    }
    return ($output);
}

session_start ();

if ($_POST ['fields'])
{
    $_SESSION   = $_POST ['fields'];
    session_commit ();
}

if ($_POST['newfield'])
{
    $_SESSION[$_POST['newfield']] = $_POST['newfieldvalue'];
    session_commit ();
}


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Session Editor</title>
        <style type="text/css">
        label {
            display: inline-block;
            min-width: 8em;
            text-align: right;
            padding-right: .3em;
        }
        </style>
    </head>
    <body>
        <h2>Session Editor</h2>
        <form action="<?php echo ($_SERVER ['SCRIPT_NAME']); ?>" method="post">
            <ul>
                <?php echo (listData($_SESSION)); ?>
            </ul>
            <div>
                <input type="submit" />
            </div>
        </form>
        -------------------------
        <form action="<?php echo ($_SERVER ['SCRIPT_NAME']); ?>" method="post">
            New Session Var:<input type="text" name="newfield" /><br />
            Session Var Value:<input type="text" name="newfieldvalue" />
            <div>
                <input type="submit" />
            </div>
        </form>


    </body>

</html>
1 голос
/ 29 марта 2011

Исходный код для чрезвычайно простого редактора сессий (да, нашел немного времени, чтобы реально поработать над ним).

<?php

function listData (array $data, array $parents = array ())
{
    $output = '';
    $parents    = array_map ('htmlspecialchars', $parents);
    $fieldName  = $parents?
        '[' . implode ('][', $parents) . ']':
        '';
    foreach ($data as $key => $item)
    {
        $isArr  = is_array ($item);
        $output .= $isArr?
            '<li><h4>' . htmlspecialchars ($key) . '</h4>':
            '<li><label>' . htmlspecialchars ($key) . '</label>: ';
        $output .= $isArr?
            '<ul>' . listData ($item, array_merge ($parents, array ($key))) . '</ul>': 
            '<input type="text" name="fields' . $fieldName . '[' . htmlspecialchars ($key) . ']" value="' . htmlspecialchars ($item) . '" />';
        $output .= "</li>\n";
    }
    return ($output);
}

session_start ();

if ($_POST ['fields'])
{
    $_SESSION   = $_POST ['fields'];
    session_commit ();
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Session Editor</title>
<style type="text/css">
label {
    display: inline-block;
    min-width: 8em;
    text-align: right;
    padding-right: .3em;
}
</style>
</head>
<body>
    <h2>Session Editor</h2>
    <form action="<?php echo ($_SERVER ['SCRIPT_NAME']); ?>" method="post">
        <ul>
        <?php echo (listData ($_SESSION)); ?>
        </ul>
        <div>
            <input type="submit" />
        </div>
    </form>
</body>
</html>

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

0 голосов
/ 30 марта 2011

Вы также можете сделать это в режиме реального времени в сеансе отладки, если вы используете PHPEdit

0 голосов
/ 29 марта 2011

Как упоминает полковник Шрапнель, я бы просто установил новый скрипт PHP на том же сервере, который выглядел так:

<?php
session_start();
$_SESSION['key'] = 'value'; // repeat for every value you need to change

Затем выполняйте скрипт каждый раз, когда вам нужно обновить переменные сеанса. Просто откройте свое приложение в одной вкладке браузера и скрипт обновления сеанса в другой. Простой.

Я бы никогда не стал вмешиваться в временные файлы сессии.

0 голосов
/ 29 марта 2011
var_dump( $_SESSION );

для просмотра сеанса

и

$_SESSION['variabletoset'] = 'value';

для завершения сеанса

Обычно вы хотите var_dump сеанса, чтобы увидеть, что это такое, когдаотладить его.

0 голосов
/ 29 марта 2011

любые инструменты, которые позволят мне редактировать содержимое моего $ _SESSION?

$_SESSION['var']="whatever value";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...