【问题标题】:PHP Switch want to break html inside codePHP Switch 想要在代码中破坏 html
【发布时间】:2019-05-16 19:26:43
【问题描述】:

我正在使用 iukit 和 PHP 会话。

在我的站点中,我有 3 个人(角色):管理员、操作员和合作伙伴。

当我使用其中一个登录并切换到另一个页面时,如果可能,我想返回。

但我需要更改一个导航链接。

所以我尝试像这样进行 php 切换:

首先我尝试了一个简单的开关

echo '<li ..>foo</li>'; 

但我看过文档,这就是我发现的(我认为好多了)。

我尝试使用 break 而不是 exit。

<?php switch($_SESSION['person_role']): ?>
<?php case 'admin': ?>
<li class="uk-margin-left uk-margin-right"><a href="admin.html">Admin</a></li>
<?php exit;?>
<?php case 'operator': ?>
<li class="uk-margin-left uk-margin-right"><a href="operator.html">Operator</a></li>
<?php exit;?>
<?php case 'partner': ?>
<li class="uk-margin-left uk-margin-right"><a href="partner.html">Partner</a></li>
<?php exit;?>
<?php default: ?>
nothing
<?php endswitch;; ?>

结果是每个人都可以使用所有链接。 为什么交换机不能破解密码?

【问题讨论】:

  • 您不应该使用exit;,因为这将结束整个脚本,您将无法输出&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;
  • 也许你需要在大括号中添加:switch() { ... }
  • PHP 正在执行吗?文件是.php?将&lt;?php phpinfo() ?&gt;加到顶部,是否显示?
  • @JasonKLai 他使用: 代替{} 的替代语法。见php.net/manual/en/control-structures.alternative-syntax.php
  • 感谢 AbraCadaver,我错过了。

标签: php html session switch-statement uikit


【解决方案1】:

这里不需要开关盒:

$roles = array(
    'admin' => 'Admin',
    'operator' => 'Operator',
    'partner' => 'Partner'
);

if (array_key_exists($_SESSION['person_role'], $roles)) {
    echo '<li class="uk-margin-left uk-margin-right"><a href="' . $_SESSION['person_role'] . '.html">' . $roles[$_SESSION['person_role']] . '</a></li>';
}

【讨论】:

  • 嗨 parsonsbot 你的代码太棒了!非常感谢!
【解决方案2】:

这是一个可以运行的示例:https://3v4l.org/iQqqn

与其在HTML 代码中写出PHP,不如直接在HTML 代码的1 行中使用switch/case、设置变量和echo 进行评估,而不是重复它?或者,如果您正在清理您的 $_SESSION 数据,您可以像示例中一样将 echo 放在 HTML 中:

<?php
$_SESSION['person_role'] = 'admin';  // set for testing demo

// Either do your switch case and set variables...
$page = "default";
$role = "default";

// You technically don't even need the variables, but this example 
// shows that based on the case, if you need to use a different name
// for role/page this is where you would do so...
switch($_SESSION['person_role']) {
    case 'admin':
        $page = $role = "admin";
    break;
    case 'operator': 
        $page = $role = "operator";
    break;
    case 'partner':
        $page = $role = "partner";
    break;
}
?>
  Example W/ Switch Case..
  <ul>
    <li class="uk-margin-left uk-margin-right">
      <a href="<?php echo $page; ?>.html">
        <?php echo ucwords($role); ?>
      </a>
    </li>
  </ul>

或者

<?php
// Just use $_SESSION data (assuming sanitized) in the HTML...
$_SESSION['person_role'] = 'operator';  // set for testing demo
?>
    Example just using $_SESSION data..
    <ul>
      <li class="uk-margin-left uk-margin-right">
        <a href="<?php echo $_SESSION['person_role']; ?>.html">
          <?php echo ucwords($_SESSION['person_role']); ?>
        </a>
      </li>
    </ul>

【讨论】:

  • 这是如何做到这一点的两个独立示例。当您可以设置变量并回显一次时,打开和关闭 PHP 标记并重复相同的 HTML 似乎不是一个好习惯..
  • @Qirel 感谢您的编辑,抱歉没有一开始就把它分成 2 个区块!
【解决方案3】:
<?php
$roles = array("admin", "operator", "partner");
$current_role = $_SESSION['person_role'];
if(in_array($current_role, $roles)) {
   echo '<li class="uk-margin-left uk-margin-right"><a href="'.$current_role.'\.html">'.ucfirst($current_role).'</a>
     </li>';
} else {
  echo 'No role in session';
}
?>

【讨论】: