在$ _SESSION中设置/获取变量的快捷方式?

时间:2010-02-10 23:19:31

标签: php session

我喜欢多页表单中的一百个表单元素,我必须检查是否定义了某些会话变量。

主要的是我在会话中通过CONSTANT然后使用字段键来设置子命名空间。

有一些捷径可以吗?说,

<input value="<?php echo isset($_SESSION[CONSTANT]['fields']['first_name']) ? $_SESSION[CONSTANT]['fields']['first_name'] : ''; ?>">

我怀疑我可以循环这个,因为我的结构不是由兄弟输入元素组成,而是非常非常自定义的标记,不能在循环结构中控制。

也许我可以使用Zend Session或类似的东西,最后的方法是键入一个变量以替换我的文本编辑器,例如$ s ['first_name']并替换所有$ s实例。

5 个答案:

答案 0 :(得分:6)

自己写一个快捷方式。

function s($key) {
    return isset($_SESSION[CONSTANT]['fields'][$key]) ? $_SESSION[CONSTANT]['fields'][$key] : '';
}
$foo = s('first_name');

答案 1 :(得分:3)

试试这个:

function sessionOrBlank() {
    $args = func_get_args();
    if (count($args) < 0) {
        return '';
    }
    $argCtr = 0;
    $argPtr =& $_SESSION;
    do {
        if (!isset($argPtr[$args[$argCtr]])) {
            return '';
        }
        $argPtr =& $argPtr[$args[$argCtr++]];
    } while($argCtr < count($args));
    return $argPtr;
}

然后使用:

<input value="<?php echo sessionOrBlank(CONSTANT,'fields','first_name'); ?>">

一般用法:

按照您希望搜索数组的顺序将参数传递给此函数。例如,如果您要搜索$_SESSION['foo']['bar'],请使用sessionOrBlank('foo','bar');

编辑:您提到的设置

不完全确定您的意思,但此函数的行为与前一个函数类似,不同之处在于它会将传递给它的最后一个参数视为要设置的值。它还将返回它设置的值,因此使用此函数的结果与赋值表达式(通常)的结果相同。它不应该允许覆盖整个会话变量,但如果它们确实存在,它将覆盖当前不是数组的任何键,或者如果它们不存在则将补充现有数组。享受。

function setSession() {
    $args = func_get_args();
    if (count($args) < 1) {
        return false; // don't overwrite whole session
    }
    $argCtr = 0;
    $argPtr =& $_SESSION;
    do {
        if (!isset($argPtr[$args[$argCtr]]) || !is_array($argPtr[$args[$argCtr]])) {
            $argPtr[$args[$argCtr]] = array();
        }
        $argPtr =& $argPtr[$args[$argCtr++]];
    } while($argCtr < count($args) - 1);
    $argPtr = $args[$argCtr];
    return $argPtr;
}

答案 2 :(得分:1)

我有这个类,它可以处理命名空间:

class Core_Session extends Singleton{
    /**
     * Core_Session::getVar($varname,$context='global',...mas contextos)
     *
     * @param mixed $varname nombre de la variable
     * @param mixed $context contexto en el que se llama
     * @return valor de la variable (null si no existe o si estan mal los parametros)
     */
    public static function listContextVars($context='global'){
        $contexts = func_get_args();
        if(count($contexts)==1&&is_array($contexts[0]))
            $contexts = $contexts[0];
        $values = &$_SESSION;
        foreach($contexts as $context){
            if(!isset($values[$context]))
                return(null);
            $values = &$values[$context];
        }
        return(array_keys($values));
    }

    public static function listContextValues($modo='array', $context='global'){
        $contexts = func_get_args();
        $contexts = array_slice($contexts, 1);
        if(count($contexts)==1&&is_array($contexts[0]))
            $contexts = $contexts[0];
        $values = &$_SESSION;
        foreach($contexts as $context){
            if(!isset($values[$context])){
                return(null);
            }
            $values = &$values[$context];
        }
        switch($modo){
            case 'array':{
                $ret = array();
                foreach($values as $varname=>$value){
                    $ret[] = array(
                        'varname'=>$varname,
                        'value'=>self::getVarMulticontext($varname, $contexts)
                    );
                }
                break;
            }
            case 'Core_Object':{
                $ret = array();
                foreach($values as $varname=>$value){
                    $oret = new Core_Object();
                    $oret->setVarname($varname);
                    $oret->setValue(self::getVarMulticontext($varname, $contexts));
                    //$oret->setData($varname, self::getVarMulticontext($varname, $contexts));
                    $ret[] = $oret;
                }
            }
        }
        return($ret);
    }

    public static function getVar($varname, $context='global'){
        if(isset($context)&&is_string($context)){
            $args = func_get_args();
            $contexts = array_slice($args, 1);
            return(self::getVarMulticontext($varname, $contexts));
        }
        return(null);
    }

    public static function getVarMulticontext($varname, $contexts=array()){
        if(!is_array($contexts)||!count($contexts))
            return(null);
        if($varname!=null)
            $contexts = array_merge($contexts, array($varname));
        $values = &$_SESSION;
        foreach($contexts as $context){
            if(!isset($values[$context]))
                return(null);
            $values = &$values[$context];
        }
        if($values===null)
            return($values);
        return(unserialize($values));
    }

    /**
     * Core_Session::setVar()
     *
     * @param mixed $varname nombre de la variable
     * @param mixed $value valor a setear
     * @param string $context contexto en el que se llama
     * @return true si esta bien, false si no
     */
    public static function setVar($varname, $value, $context='global'){
        if(isset($context)&&is_string($context)){
            /*if(is_object($value))*/
            $args = func_get_args();
            $contexts = array_slice($args, 2);
            return(self::setVarMulticontext($varname, $value, $contexts));
        }
        return(false);
    }

    public static function setVarMulticontext($varname, $value, $contexts=array()){
        if(!is_array($contexts)||!count($contexts))
            return(null);
        if($varname!=null)
            $contexts = array_merge($contexts, array($varname));
        $parent_context = null;
        $values = &$_SESSION;
        //var_dump($contexts);
        foreach($contexts as $context){
            $parent_context = &$values;
            $values = &$values[$context];
        }
        if($value==null){
            //$values = null;
            $find = array_search($context, array_keys($parent_context));
            if($find!==null && $find!==false){
                array_splice($parent_context, $find, 1 );
            }
        }
        else
            $values = serialize($value);
        return(true);
    }

    public function getInstance(){
        return(self::getInstanceOf(__CLASS__));
    }
}

答案 3 :(得分:0)

然后我会把那些“子命名空间”扔掉。我的意思是,在一个正确的html表单中,你会给每个输入元素一个名字(现在也是一个id),为什么不使用 - 那个?我的意思是,为什么要关心这些东西如何存储在会话中?只要您可以毫不含糊地设置和获取,我就不明白为什么您必须通过添加另一个级别来使其变得更复杂。

答案 4 :(得分:0)

$var = & $_SESSION[CONSTANT]['fields'];
echo $var['first_name'];