За последние 24 часа нас посетили 17592 программиста и 1723 робота. Сейчас ищут 1922 программиста ...

Как сделать переключатель, с помощью оператора switch в php

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 17 апр 2017.

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Всем привет, хочу сделать единый переключатель для модулей сайта, например: регистрация, авторизация, профили, и т.д. Переключатель должен перенаправлять пользователя, в зависимости куда он нажал. И я просто не могу понять при условии таком:
    PHP:
    1. //Определяем переменную для переключателя
    2. $go = isset($_GET['go'])  ? $_GET['go'] : false;
    3. //Структура  переключателя.
    4. switch($go){
    5.     //Регистрация
    6.     case "register":
    7.         include '/system/modules/register.php';
    8.     break;
    9.     //Авторизация
    10.     case "login":
    11.         include '/system/modules/login.php';
    12.     break;
    13.     //Профиль пользователя
    14.     case "profile":
    15.         include '/system/modules/profile.php';
    16.     break;
    17. /*тут идут другие  подключаемые модули*/
    18. default:
    19. /*любая страница которые вы хотите по умолчанию*/
    20. }
    Как направить данного пользователя на страницу если он нажал на ту или иную ссылку или кнопку.
    Пробовал сделать так:
    PHP:
    1.    <!-- если в сессии не загружены логин и id -->
    2.    <?php if (!isset($_SESSION['login']) || !isset($_SESSION['user_id'])) { ?>
    3.    <li><a href="?go=login" title="Войти">Войти </a></li>
    4.    <li><a href="?go=register" title="Регистрация">Регистрация</a></li>
    5.    <?php } ?>
    Но он не хочет переходить по ссылкам, может кто подскажет, свои аргументы, что не так делаю.
     
    #1 _ne_scaju_, 17 апр 2017
    Последнее редактирование: 17 апр 2017
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Отлаживай, что ещё сказать можно?
    --- Добавлено ---
    Я бы, конечно, без switch обошёлся вообще
    PHP:
    1. //Определяем переменную для переключателя
    2. $go = isset($_GET['go']) ? basename($_GET['go']) : false; // basename - чтоб нам не передали лишнего
    3.  
    4. if ($go && file_exist(__DIR__ . "/system/modules/$go.php")) {
    5.    include __DIR__ . "/system/modules/$go.php";
    6. } else {
    7.    /* Что-то по-дефолту */
    8. }
    PHP динамический язык, надо этим пользоваться.
     
    #2 mkramer, 17 апр 2017
    Последнее редактирование: 17 апр 2017
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    То-есть решение какое было бы твое?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @_ne_scaju_, в смысле? Я тебе же код привёл.
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Ты забыл закрыть )
    Ну не понял как с ним работать(
    Объясни пожалуйста строки эти, которые ты написал.

    Я просто не хочу указывать в ссылках вот например вот так:
    PHP:
    1. <li><a href="site/system/mod.php?go=login" title="Войти">Войти </a></li>
    То есть мы показываем папку, как называется скрипт ну и далее уже обработка другого скрипта.
    Может есть другой способ в ссылках указать как то по лучше, с использованием switch.

    Или это и есть нормальное использование в ссылке на другие скрипты?
     
    #5 _ne_scaju_, 17 апр 2017
    Последнее редактирование: 17 апр 2017
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну забыл и забыл - я это даже ошибкой не считаю. Интерпретатор ругнётся - я закрою :)
    1. В get-параметре go передаётся имя файла, который надо включить
    2. От него отрезается всё лишнее, чтобы нельзя было передать путь и запустить те файлы, которые не следует
    3. Проверяется, существует ли в нужной папке такой файл
    4. Если существует - он включается (include в php может принимать переменные, поскольку включение происходит во время выполнения, а не во время компиляции, как в языках типа C++)
    5. Если не существует, или не передан - отрабатывает какое-то поведение по умолчанию.
    И что я такого сложного и непонятного написал?
    --- Добавлено ---
    Почему там у тебя что-то где-то не переходит, можно выяснить только отлаживая по частям твой код. У меня телепатического доступа к твоему компу нема.
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Через программу TeamViewer можешь подключится))) если не сложно и посмотреть))) И подсказать если не сложно конечно.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    За это деньги берут
    Дался тебе switch, показал же, как без него обойтись, минимальным количеством строчек. Уже и алгоритм разжевал :) Потом делаешь ссылки типа
    Код (Text):
    1. /index.php?go=register
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Вот в том то и дело не понял, ну например написал, я пример твой, а дальше что?
    На любой странице я могу потом указывать ссылки такого типа? Или только в этом файле?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Скучный ты. Вообще думать не желаешь. Конечно, на любой странице, ты указываешь адрес этого скрипта с нужным параметром go и другими параметрами, а он разруливает. Ты вообще в курсе, как работает php? Как работает браузер и веб-сервер? http://phpfaq.ru/na_tanke

    В принципе, ты switch-ем пытался сделать ровно тоже самое, только строчек больше, поэтому и странно, что не можешь понять, как пользоваться этим.
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Ты не думай что я не думаю, все я думаю просто не с первого раза получается понять.
    Fatal error: Call to undefined function file_exist() in
    Ругается на функцию.
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Да я понял)))
    Но все же я указываю в ссылке с твоим кодом вот так:
    HTML:
    1. <li><a href="/system/mod.php?go=register" title="Регистрация">Регистрация</a></li>
    И переходит по ссылке)
    Но эта запись есть правильной?
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну раз переходит, то "правильной" :)
    Я же не знаю, куда ты код залил. Если в /system/mod.php, то да, такие ссылки.
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Да именно так я залил код, сделал по другому, в index.php указал include 'полный путь/mod.php';
    Теперь при переходе по ссылке, я использую все го лишь:
    HTML:
    1. <li><a href="?go=register" title="Регистрация">Регистрация</a></li>
    Не показывая папку и не показывая скрипта что отвечает за этот переключатель.
    И он переходит как мне хотелось бы.
    Будет ли логично так использовать?

    И сразу добавлю, вопросик, как лучше создавать файл или файлы. Имея один обработчик и форму для него, или все в одном файле?
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Если работает, почему бы нет?
    Можно и так и так. Как тебе будет понятнее. Правило одно: успешная (а некоторые считают, что любая) обработка POST-запроса должна заканчиваться редиректом, а не выводить данные.
     
  17. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Так один или два или вообще без разницы?
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Конечно без разницы. Я же написал: как удобнее. Делают и так, и так.
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Понятно спасибо!
    Переделываю не много, базу данных.
    Кстати этот медок который ты предложил и о котором я писал switch.
    Сравнения такое:
    В switch можно добавить еще условия там какие-то еще данные. А в твой метод как можно что добавить?
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    В файлах на которые он разруливает могут быть условия. В switch ты же можешь в сам вынести только одно условие, а остальное будет в case-ах, вот те условия, которые в case-ах ты бы писал, пишешь в файлах, на которые разруливает мой код. А вообще, развиваться, конечно надо, приходить к MVC, фреймворкам. Но для начала предложенный мной роутер лучше, чем куча case-ов, поскольку для нового функционала нужно просто добавить файлик с нужным именем куда надо, а не раздувать до гигантских размеров switch. Его конечно можно ещё развить, для обработки остальной части строки, ну тут уже твоя фантазия должна включиться, там можно много чего наворотить, главное понять принцип.
     
    #20 mkramer, 19 апр 2017
    Последнее редактирование: 19 апр 2017
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Уже сплю не чего не понимаю, понять как работает switch? Или что? Я спать)
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    У меня вопрос, а от куда он знает что это например выход ссылка?
    Ваш кусок кода?
    Вот например на выход я вещаю так:
    cayt.ru/?go.logout
    От куда он знает что это выход я этого не понял?
    Я протестировал, и понял, что данный код обрезает кусок PHP и просто можно будет названия скрипта писать без PHP в конце. Так ли это?
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    во первых, cayt.ru/?go=logout
    Во-вторых, ему вообще похрен, выход это или вход, или форматирование жёсткого диска на сервере. Я же по шагам описал алгоритм.
    Да, расширение php в ссылках не указывается - скрипту его не сложно подставить. Имя включаемого файла в php может формироваться динамически, благодаря этому можно делать вот такие штуки. Как объяснить проще я не знаю
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Так значит свитч вы мне не рекомендуете из-за того что много строк получается?
    За то я обращаюсь к файлам не много по другому)
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ох, не рекомендовал бы я новичкам такие вещи. Это ж верная брешь в безопасности - инклудить то, что в гете придет, не задумываясь. Я понимаю, что пример "академический", но если он его возьмет "как есть", это будет дыра размером с марианскую впадину.