Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-使用下拉列表更改站点主题_Php_Css_Forms_Drop Down Menu_Cookies - Fatal编程技术网

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

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新手。我知道如果我使用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>

您正在使用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();