PHP - 使用下拉列表更改网站主题

时间:2009-09-07 08:31:26

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

我有一个下拉列表,用户可以在其中为网站选择主题。唯一的问题是,我不太确定如何按“应用”后正确加载主题。我是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>

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

嗯,我猜是方法=“发布”是正确的步骤。

你到那里的PHP代码让我的警钟响起。你不能相信来自$ _GET,$ _POST,$ _COOKIE等的用户输入!从未!

所以我建议的是:

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

如果没有这些安全措施,您的网站将对XSS攻击持开放态度:http://en.wikipedia.org/wiki/Cross-site_scripting

答案 2 :(得分:0)

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

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

希望有所帮助!

这就是你需要的:

choose_style.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.

?>

答案 3 :(得分:0)

对页面执行POST(假设为themeswitcher.php)。

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

然后使用

将用户引导回他来自的地方
header("Location: xxxxx.php"); 
exit();