PHP-使用下拉列表更改站点主题
我有一个下拉列表,用户可以在其中选择网站的主题。唯一的问题是,我不太确定在他们按下“应用”后如何正确加载主题。我是PHP新手。我知道如果我使用GET,它将通过当前页面的一个链接传递变量,并将它们添加到URL的末尾。我真的想避免这样。所以,我想我的问题是,如何避免使用GET更新主题?多谢各位 下面是我加载正确主题的代码:PHP-使用下拉列表更改站点主题,php,css,forms,drop-down-menu,cookies,Php,Css,Forms,Drop Down Menu,Cookies,我有一个下拉列表,用户可以在其中选择网站的主题。唯一的问题是,我不太确定在他们按下“应用”后如何正确加载主题。我是PHP新手。我知道如果我使用GET,它将通过当前页面的一个链接传递变量,并将它们添加到URL的末尾。我真的想避免这样。所以,我想我的问题是,如何避免使用GET更新主题?多谢各位 下面是我加载正确主题的代码: <?php $stylesArr = array('Default', 'Black', 'Pink', 'Green', 'Red'); if(isset($_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>
您正在使用POST作为表单的方法,而不是GET,因此不会向url追加任何内容,只需将php代码中的所有$\u GET更改为$\u POST。将$\u GET替换为$\u POST即可。如果是我,我会发布到一个单独的文件,例如theme_manager.php,然后将其存储在会话或cookie中,然后重新加载另一个页面
header("Location: xxxxx.php");
exit(); # exit is important as page needs to exit and reload for cookie to work.
希望有帮助
以下是您需要的:
选择_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
我想,method=“post”是正确的一步
然而,你在那里得到的PHP代码让我的警钟响了。您不能信任来自$\u GET、$\u POST、$\u COOKIE等的用户输入。!从来没有
因此,我建议:
- 使用$\u POST从提交的表单中获取数据
- 创建一个包含所有有效主题的PHP数组,如下所示:
$valid_themes=数组('Default','Black','Pink','Green','Red')李>
- 在设置COOKIE()或使用$style或$\u COOKIE['theme']或$\u POST['theme']执行任何其他操作之前,请使用检查提交的主题名称是否在有效主题数组中
如果没有这些安全措施,您的站点将面临XSS攻击:对页面进行发布(比如themeswitcher.php)
在这里,您可以阅读用户使用$\u POST[“theme”]
但是会话中的主题(或者甚至数据库中的主题)
然后使用
header("Location: xxxxx.php");
exit();
好的,我只是想问为什么当我点击“应用”时,它加载的页面没有任何主题。将标题(“位置:xxxxx.php”);退出();解决这个问题?是的,只有在下一页加载时才能读取cookie!好运气,我会把标题放在哪里(“Location:xxxxx.php”);退出();?您需要在结束之前编写所有代码之后再添加这些内容?>唯一的问题是,在用户选择主题后,我希望它显示他们所在的页面以及更新的主题。我当前使用的PHP数组确实包含所有有效的主题。我可能听起来很笨,但我对PHP非常陌生。我该如何使用in_数组来检查它是否是一个有效的主题呢?天哪,你已经在检查了。我没有正确阅读。所以,不要介意警钟的评论,这很好。很抱歉只需使用$\u POST而不是$\u GET,就可以设置为::-)
header("Location: xxxxx.php");
exit();