PHP会话编辑器

时间:2011-03-29 07:37:51

标签: php debugging session

是否有任何工具可以让我编辑$ _SESSION的内容?我正在尝试调试依赖于会话状态的脚本,我希望能够更改会话变量,而不必更改数据库,销毁会话并重新创建它。我可能会在给定的时间内建立一个临时会话编辑器,但我现在没有时间。

7 个答案:

答案 0 :(得分:2)

$_SESSION中的信息只是作为序列化字符串存储在磁盘上。 (如果你不使用类似memcached会话存储的东西)

因此,阅读该文件,对其内容进行反序列化,更改适当的值然后将其序列化应该是您需要的所有内容。


如果您不想处理,可以在session_id()之前设置session_start(),然后使用php编辑值,然后再调用session_write_close()将其存储在磁盘上。


会话ID的示例脚本:

<?php

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

反序列化的示例脚本(function taken from the comments on the unserialze php.net page

<?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));

将它重新组合起来并不困难。

答案 1 :(得分:2)

要稍微扩展一下,只需添加添加新会话变量的功能:

<?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>

答案 2 :(得分:1)

非常基本的会话编辑器的源代码(是的,找到了一点时间来实际工作)。

<?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>

显然非常简单,但它至少允许我编辑任意会话数据而无需每次都编写新代码。可能会在某些方面对此进行更多的工作,将其构建成一个功能齐全的编辑器,但它现在可以做到。

答案 3 :(得分:0)

  

那里有哪些工具可以让我编辑$ _SESSION的内容?

$_SESSION['var']="whatever value";

答案 4 :(得分:0)

var_dump( $_SESSION );

查看您的会话

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

安排会议

您通常希望var_dump会话以查看调试时的内容。

答案 5 :(得分:0)

就像Col. Shrapnel提到的那样,我只需在同一服务器上设置一个新的PHP脚本,如下所示:

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

然后每次需要更新会话变量时执行脚本。只需在一个浏览器选项卡中打开您的应用程序,在另一个浏简单。

我自己也不会费心篡改会话临时文件。

答案 6 :(得分:0)

如果您使用PHPEdit

,也可以在调试会话中实时执行此操作