我目前有一个网站,用户可以在其中选择自定义主题。选择主题后,会创建一个cookie。 cookie包含正确的数据并指向正确的CSS文件。出于某种原因,在重新访问该网站时,主题未加载。我应该指出我是PHP的新手,所以这可能是一个非常容易犯的错误。请帮忙。谢谢。
这是我的代码:
<?php
$stylesArr = array('Default', 'Black', 'Pink', 'Green', 'Red');
if(isset($_GET['theme']) && in_array($_GET['theme'], $stylesArr)) {
$style = 'CSS/' . $_GET['theme'] . '.css';
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';
}
}
?>
<link rel="stylesheet" href="<?php echo $style>" type="text/css"media="screen" />
答案 0 :(得分:6)
您正在将字符串CSS/Default.css
放入Cookie中,但是您正在检查来自Default
的字符串$stylesArr
。改变这一行:
$style = 'CSS/' . $_GET['theme'] . '.css';
到此:
$style = $_GET['theme'];
,没关系。
另外,我必须提醒您在应用程序中直接使用来自$ _GET的数据。你永远不应该这样做,因为它可能导致严重的安全问题。始终清理用户输入。
答案 1 :(得分:0)
尝试在setcookie()
来电中设置$ path参数。如果未设置,则默认为当前目录。在这种情况下,您希望cookie在整个网站范围内,请尝试以下操作:
setcookie("theme", $style, time()+(60*60*24*30), '/');
您还需要确保在任何其他输出之前发生<{1}}调用。如果您的页面中有一些HTML或任何其他输出(包括空格或setcookie()
标记之间的任何内容),那么<?php ?>
将无效。
答案 2 :(得分:0)
您需要确保在脚本开头就已经调用了session_start()。
答案 3 :(得分:0)
关闭主题,但我会更像这样编写代码:
define('MONTH_IN_SECONDS', 2592000);
$themes = array('Default', 'Black', 'Pink', 'Green', 'Red');
$theme = reset($themes); //first value is default
if (isset($_GET['theme']) && in_array($_GET['theme'], $themes, true)) {
$theme = $_GET['theme'];
setcookie("theme", $theme, time()+ MONTH_IN_SECONDS);
} elseif (isset($_COOKIE['theme']) && in_array($_COOKIE['theme'], $themes, true)) {
$theme = $_COOKIE['theme'];
}
$themeURL = 'CSS/' . $theme . '.css';