PHP – использование выпадающего списка для изменения темы сайта

У меня есть раскрывающийся список, где пользователи могут выбрать тему для сайта. Единственная проблема заключается в том, что я не совсем уверен, как правильно загружать тему, когда они нажимают «Применить». Я новичок в 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> 

Обменять $ _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. 

Надеюсь, это поможет!

вот что вам нужно:

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

Вы используете POST как метод для своей формы, а не GET, поэтому ничего не будет добавлено к URL-адресу, просто измените все $ _GET на $ _POST в вашем php-коде.

Ну, метод = «пост» – это правильный шаг, я думаю.

Однако код PHP, который у вас есть, заставляет мои будильники отключиться. Вы не должны доверять пользовательскому вводу от $ _GET, $ _POST, $ _COOKIE и т. Д.! Никогда!

Поэтому я бы предложил следующее:

  • Используйте $ _POST для получения данных из представленной формы
  • Создайте массив PHP со всеми допустимыми темами, например: $ valid_themes = array ('Default', 'Black', 'Pink', 'Green', 'Red');
  • Прежде чем вы установите setcookie () или сделайте что-нибудь еще с $ style или $ _COOKIE ['theme'] или $ _POST ['theme'], используйте http://de.php.net/manual/en/function.in-array. php, чтобы проверить, находится ли указанное имя темы в вашем массиве допустимых тем.

Без этих мер безопасности ваш сайт будет открыт для атак XSS: http://en.wikipedia.org/wiki/Cross-site_scripting

сделайте POST на страницу (скажем, themewitcher.php).

Там вы читаете тему, которую пользователь выбрал с помощью $_POST["theme"] но тема в сеансе (или, возможно, даже в базе данных)

а затем направьте пользователя обратно туда, откуда он пришел, используя

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