【问题标题】:I have a variable with another variable within its name. How do I change it into a session variable?我有一个变量,其名称中有另一个变量。如何将其更改为会话变量?
【发布时间】:2012-11-13 01:19:53
【问题描述】:

基本上就是标题所说的。我知道如何将普通变量变成会话变量($_SESSION['var']),但当它包含另一个变量时不知道

这是我的代码:

<?php
session_start();

$_SESSION["uname"] = "Tyler";

if (isset($_SESSION["coins{$uname}"])) 
{
    echo "$_SESSION["uname"] : $_SESSION["coins{$uname}"]";
}
elseif ($_SESSION["uname"] == "LOut")
{
    $_SESSION["coins{$uname}"] = "0";
    echo "Log In";
}
else
{
    $_SESSION["coins{$uname}"] = 500;
    echo "$_SESSION["uname"] : $_SESSION["coins{$uname}"]";
}
?>

我尝试了以下方法:

$_SESSION['{coins.$uname}']
$_SESSION['coins.$uname']
$_SESSION['coins.$_SESSION['uname']']

我不记得我是否尝试过其他任何方法。

【问题讨论】:

  • 欢迎来到 * 泰勒。发布代码时,请尝试仅提供相关部分。我编辑删除了所有与此问题无关的 html、css 等。
  • 您应该指定您的问题是创建还是回显会话变量。人们试图帮助您创建,但是当您尝试回显会话变量时也会出现语法错误:echo "$_SESSION["uname"] : $_SESSION["coins{$uname}"]";。详情见我的回答。

标签: php session variables


【解决方案1】:

双引号是你想要的。

$_SESSION["coins.$uname"]

或者

$_SESSION["coins.{$_SESSION['uname']}"]

其中任何一个都应该可以正常工作。

解释: 单引号将按原样封装字符串。双引号实际上会解析字符串并替换其中包含的任何变量。有时,一个变量在字符串中不会被清楚地识别,例如:

print "This is the $numberth time"; 
// Expected: 'This is the 50th time'
// Actual:   'This is the  time'

这种情况下可以用花括号来清楚地分隔一个变量,即:

print "This is the {$number}th time";

根据经验,我通常将任何对象属性或数组值用大括号括起来,即:

print "This is the {$this->number}th time";
print "This is the {$time['number']}th time";

【讨论】:

  • 解释和例子。 +1
  • 使用了这两个(将第二个中的“uname”也更改为双引号,因为我假设你只是忘记了这一点),但都没有工作。不过感谢您的快速回复。
  • 不,双引号中的单引号是正确的 - 否则它会破坏字符串。如果它仍然导致问题,您可以尝试创建一个单独的变量名称变量,即 $coinsUname = 'coins.' . $_SESSION['uname']; $_SESSION[$coinsUname];看看这是否有效。
【解决方案2】:

您说它不起作用,但您没有指定是设置它还是回显它是问题所在:根据您的原始未经编辑的问题,有两个问题:

设置会话变量

这应该可行:

$_SESSION["coins{$uname}"] = 500;

如果你不能让它工作,试着把它分解成几个步骤。

$tempname = 'coins'.$uname;
$_SESSION[$tempname] = 500;

现在测试一下。

输出会话变量

echo $_SESSION["coins{$uname}"];echo $_SESSION[$tempname];

编辑

您的代码中有语法错误:

echo "$_SESSION["uname"] : $_SESSION["coins{$uname}"]";

当您尝试为 ["uname"] 打开引号时,您错误地关闭了起始引号 (")。尝试:

echo "$_SESSION['uname'] : ".$_SESSION["coins{$uname}"];

【讨论】:

    【解决方案3】:

    试试

    $_SESSION["coins{$uname}"]

    区别是……

    1) 使用brace 语法时的双引号

    2) 我假设您在这里使用点 . 字符进行连接?如果使用大括号语法,则不需要它...

    【讨论】:

      【解决方案4】:

      你可以试试这个吗?

          $$coins = "Tyler";
      
          if (isset($$coins)) 
          {
          echo "uname : {$$coins}";
          }
          elseif ($$coins == "LOut")
          {
          $$coins = "0";
          echo "Log In";
          }
          else
          {
          $$coins = 500;
          echo "$uname : $$coins";
          }
          ?>
      
          <br>
          <a href="test.php">Test</a>
      
          </div>
      
          <div id="footer">
      
          </div>
      

      所以你的会话将是

      $_SESSION['$$coins']
      

      这就是我处理变量变量的方式...

      丁丁

      【讨论】: