【问题标题】:PHP - Using a drop down list to change site themePHP - 使用下拉列表更改网站主题
【发布时间】:2010-11-26 04:04:39
【问题描述】:

我有一个下拉列表,用户可以在其中选择网站的主题。唯一的问题是,一旦他们按下“应用”,我不太确定如何正确加载主题。我是 PHP 新手。我知道如果我使用 GET,它将通过当前页面传递变量并将它们添加到 URL 的末尾。我真的很想避免这种情况。所以,我想我的问题是,我怎样才能避免使用 GET 来更新主题?谢谢。

这是我加载正确主题的代码:

<?php
$stylesArr = array('Default', 'Black', 'Pink', 'Green', 'Red');
if(isset($_GET['theme']) && in_array($_GET['theme'], $stylesArr)) {
    $style = $_GET['theme'];
    setcookie("theme", $style, time()+(60*60*24*30));
} else {
    if(isset($_COOKIE['theme']) && in_array($_COOKIE['theme'], $stylesArr)) {
        $style = 'CSS/' . $_COOKIE['theme'] . '.css';
    } else {
        $style = 'CSS/Default.css';
    }
}
?>

这是我选择主题的下拉列表:

<form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="post">
<p>Site Theme:
<select name="theme">
<option value="Default">Default</option>
<option value="Black">Black</option>
<option value="Pink">Pink</option>
<option value="Green">Green</option>
<option value="Red">Red</option>
</select>
<input type="submit" value="Apply" />
</form>

【问题讨论】:

    标签: php css forms drop-down-menu cookies


    【解决方案1】:

    您使用 POST 作为表单的方法,而不是 GET,因此不会将任何内容附加到 url,只需将您的 php 代码中的所有 $_GET 更改为 $_POST。

    【讨论】:

      【解决方案2】:

      将 $_GET 换成 $_POST。如果是我,我会发布到单独的文件,例如 theme_manager.php 然后将其存储在会话或 cookie 中,然后重新加载另一个页面

      header("Location: xxxxx.php");
      exit(); # exit is important as page needs to exit and reload for cookie to work.
      

      希望有帮助!

      这是你需要的:

      选择样式.php
      <?
      $stylesArr = array('Default', 'Black', 'Pink', 'Green', 'Red');
      if(isset($_COOKIE['theme']) && in_array($_COOKIE['theme'], $stylesArr)) {
          $style = 'CSS/' . $_COOKIE['theme'] . '.css';
      } else {
          $style = 'CSS/Default.css';
      }
      ?>
      <link rel="stylesheet" href="<? echo $style; ?>">
      
      ## drop down code with form posting to theme_switch.php
      

      theme_switch.php

      <?
      $stylesArr = array('Default', 'Black', 'Pink', 'Green', 'Red');
      if(isset($_POST['theme']) && in_array($_POST['theme'], $stylesArr)) {
          $style = $_POST['theme'];
          setcookie("theme", $style, time()+(60*60*24*30));
      }
      
      header("Location: choose_style.php"); # this will reload your theme selector
      exit(); # this will make sure the cookie gets loaded next time.
      
      ?>
      

      【讨论】:

      • 好的,我只是想问为什么当我点击“应用”时,它加载的页面没有任何主题。将 header("位置:xxxxx.php");出口();解决这个问题?
      • 是的,cookie 只会在下一页加载时读取!祝你好运
      • 我应该把 header("Location: xxxxx.php");退出();?
      • 你需要在结束之前写完所有代码?>
      • 唯一的问题是,在用户选择主题后,我希望它显示他们所在的页面以及更新后的主题。
      【解决方案3】:

      嗯,method="post" 是正确的一步,我猜。

      然而,你得到的 PHP 代码让我的警钟响了。您不能相信来自 $_GET、$_POST、$_COOKIE 等的用户输入!从来没有!

      所以我的建议是:

      • 使用 $_POST 从提交的表单中获取数据
      • 创建一个包含所有有效主题的 PHP 数组,如下所示: $valid_themes = array('Default', 'Black', 'Pink', 'Green', 'Red');
      • 在您设置cookie() 或使用$style 或$_COOKIE['theme'] 或$_POST['theme'] 执行任何其他操作之前,请使用http://de.php.net/manual/en/function.in-array.php 检查提交的主题名称是否在您的有效主题数组中.

      如果没有这些安全措施,您的网站将容易受到 XSS 攻击:http://en.wikipedia.org/wiki/Cross-site_scripting

      【讨论】:

      • 我当前使用的 PHP 数组确实包含所有有效的主题。我可能听起来很愚蠢,但我对 PHP 很陌生。我将如何使用 in_array 来检查它是否是一个有效的主题?
      • 啊耶稣,你正在已经检查过了。我没有正确阅读。所以别介意警钟评论,没关系。对不起。只需使用 $_POST 而不是 $_GET 就可以了。 :-)
      【解决方案4】:

      对页面执行POST(比如说themeswitcher.php)。

      在那里您阅读了用户使用$_POST["theme"] 选择的主题 但是会话中的主题(甚至可能在数据库中)

      然后通过使用将用户引导回他来自的地方

      header("Location: xxxxx.php"); 
      exit();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-29
        • 2011-09-20
        • 1970-01-01
        • 2014-11-16
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 2017-09-10
        相关资源
        最近更新 更多