За последние 24 часа нас посетили 17643 программиста и 1720 роботов. Сейчас ищут 1873 программиста ...

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

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

  1. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Fell-x27, ничего подобного, я всё правильно сделал, и несколько раз на этом сакцентировал внимание в постах:
    basename() всё лишнее отрежет. Или хочешь сказать, что можно его обмануть?
     
  2. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А, ок, проморгал. Но вообще, если не выставлена setlocale(), там можно через кодировку, потенциально, намутить всякого. Но это будет больше похоже на нейрохирургию с закрытыми глазами со стороны злоумышленника. Если, конечно, он не знает архитектуру твоего проекта.
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Fell-x27
    Честно парни вы меня запутали, мне бы правильное решение сделать)
    Буду благодарен)
    Если ваш приведенный пример, очень хорош, то можно и его использовать.
     
  4. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А вот ты разберись, что в нем происходит, и сделай для себя вывод, хорош или нет. Никогда не используй копипасту из интернета, не разобравшись.
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Fell-x27
    дак а switch($go){}
    это же не копипасте.
     
  6. ArsNet

    ArsNet Новичок

    С нами с:
    24 май 2016
    Сообщения:
    288
    Симпатии:
    24
    Адрес:
    Владивосток
    Передавай различные значения в switch а через case обрабатывай их. Че сложного то? Или я чет не правильно понял?
    --- Добавлено ---
    Передавай различные значения в switch а через case обрабатывай их. Че сложного то? Или я чет не правильно понял?
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @ArsNet
    Нет ты не понял, в switch я указываю путь к файлу, и значения записываю в case например:
    case 'loader':
    /*путь*/
    break;
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Люди, ну роутер на switch - это очень плохо. @_ne_scaju_, вот тебе ещё один способ убрать switch, на этот раз даже у @Fell-x27 не возникнет вопросов по безопасности (хотя и в прошлый раз, если бы @Fell-x27 сразу заметил basename, у него бы вопросов не возникло), и никакая слепая игра с кодировками не поможет взломать. И даже в чём-то более гибкий:
    1. Делаешь файлик типо config.routes.php, в нём:
    Код (PHP):
    1. $routes = [
    2.      "login" => "/system/modules/login.php",
    3.      "logout" => "/system/modules/logout.php"
    4.      // и т.д., сколько тебе нужно
    5. ];
    И сам роутер:
    PHP:
    1. require_once(__DIR__ . "/config.routes.php");
    2. $go = isset($_GET["go"]) ? $_GET["go"]: false;
    3.  
    4. if (!empty($go)  && isset($routes[$go])) {
    5.      include __DIR__ . $routes[$go];
    6. } else {
    7.    // дефолтное поведение
    8. }
    Мне так меньше нравится, поскольку, избавившись от проблем безопасности, мы получили необходимость добавлять руками элементы в массив $routes, но, с другой стороны, гибкость в том, что бы теперь можем целевые файлы держать где угодно, а не только в system/modules, ну и всё равно - при добавлении новой фитчи мы модифицируем конфиг, и не трогаем сам роутер. switch-ей и if-ов в программе должно быть как можно меньше, поскольку они затрудняют чтение кода. Совсем без них не обойтись, но если возможно - лучше писать что-то другое. Опять же, строчек в этом решении меньше, масштабируемость лучше.
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Ой спасибочки, благодарочка, за такой хороший ответ.
    Вот теперь я понял, например чтобы добиться перехода на определенный скрипт нужно в роутере указать все скрипты куда, можно переключатся.
    PHP:
    1. "login" => "/system/modules/login.php",
    2. "logout" => "/system/modules/logout.php"
    3. /*И т. д.*/
    Подставлять именно "login" "logout" вот эту часть, в ссылки и т. д. Правильно ли я понял?
    Ну ссылка будет выглядеть как то так: ?go=login без .php???
    И вопрос номер 2: Этот роутер и подключения скриптов это 2 файла???
     
  10. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ну да, этот роутинг железобетонный.
    А еще застраховались от атаки, которая может, таки пробить и твой предыдущий пример. Допустим, через уязвимость в аплоаде кто-то умудрился пропихнуть тебе шелл в каталог, откуда идут инклуды. Basename тут не спасет. А роутер с вайтлистом спасет.
    --- Добавлено ---
    Вложенные тернрарные операторы!11 Шучу. Хотя, порой, и такое решение в кассу заходит.
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Без php, да. В go ключик от массива надо передавать, ясно же :) Ну только перед ?go=login надо указать имя файла с роутером, если это не index.php

    Я же написал, список скриптов и их ключей я вынес в отдельный файл, config.routes.php, чтоб менять его, но не менять файл с роутером для добавления новых маршрутов. Можно было и в одном файле, но мне так больше нравится, конфиги - отдельно, работа - отдельно.
    --- Добавлено ---
    Чтобы что-то туда пропихнуть, поскольку аплоады никто по умолчанию в этот каталог не будет делать, надо не просто шелл закачать мне, а ещё его и исполнить. А если у меня папка аплоадов не защищена от исполнения скриптов, то нафига злоумышленнику что-то куда-то переписывать? Он его выполнит прямо из каталога для аплоадов, и возьмёт всё, что ему нужно. Или запишет вредоносный код мне прямо в index.php :)
     
  12. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Совершенно верно, но тем не менее, папка апплоада может быть и закрыта, а системная нет. Чисто вот в сферическом вакууме - вероятность проблемы есть. Ну и мб просто я параноик, что уж там.
     
  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну с другой стороны, ТС зато столько умных вещей почитал :)))
     
    mahmuzar нравится это.
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Fell-x27
    @mkramer
    Спасибо, я сейчас буду проводить эксперимент со скриптом)
    а куда делась функция basename из скрипта?
    Подскажите куда лучше эти файлы поместить в папку system или уже в system/modules???
     
    #39 _ne_scaju_, 21 апр 2017
    Последнее редактирование: 21 апр 2017
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    А во втором варианте он не нужен, если туда какую-нибудь хрень типа ../../../etc передать, он просто её не найдёт в массиве, и сделает дефолтное поведение. basename нужен только в первом варианте скрипта, как подстраховка от таких случаев.

    А вообще, чувак, серьёзно, ни в первом, ни во втором случае не написано ничего сверхсложного, в чём нельзя разобраться самому (при условии, что знаешь основы синтаксиса php).....
     
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Понятно, а как же по поводу, куда правильно скрипты положить, если я правильно понял то рядом с папкой modules?
    А если я ту функцию оставлю? то что будет мешать чему либо?
    Не получается указать ссылку для перехода по скриптам, что ж не так. Может подскажешь как теперь с этого скрипта указывать, правильный путь?
    HTML:
    1. <li><a href="/system/modules/login.php?go=login" title="Войти">Войти </a></li>
    Вот так указываю он переходит, но хотелось бы без полного пути)
     
    #41 _ne_scaju_, 21 апр 2017
    Последнее редактирование: 21 апр 2017
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @_ne_scaju_, ёлки, ну ты такие глупые вопросы задаёшь, будто вообще ни слова ни из кода ни из сообщений не понял. Зачем тебе ссылку ставить на login.php ? Ты можешь роутер разместить прямо в index.php в корне
    --- Добавлено ---
    Мы зачем всё это дело городили - чтоб тебе не приходилось писать полный путь к login. Он уже есть в массиве $routes. Включай голову :) Или поспи, и перечитай весь тред на свежую голову.
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Хорошая мысль глаза уже болят, от нарезки лука)))
    Смотри я в индекс пишу путь ко шаблону всему и к самому роутеру.
    PHP:
    1.  <?php
    2. include($_SERVER['DOCUMENT_ROOT'].'/templates/default/header.php');
    3. include($_SERVER['DOCUMENT_ROOT'].'/templates/default/menu.php');
    4. include($_SERVER['DOCUMENT_ROOT'].'/templates/default/content.php');
    5. /*Подключаем роутер*/
    6. include($_SERVER['DOCUMENT_ROOT'].'/system/config.routes.php');
    7. include($_SERVER['DOCUMENT_ROOT'].'/templates/default/footer.php');
    8. ?>
    Но когда я хочу создать ссылку ну нефига не переходит как хочется(
    Уже пробовал по разному подставить данные для перехода(
    Что вы имели в веду?
    только перед ?go=login надо указать имя файла с роутером
     
    #43 _ne_scaju_, 21 апр 2017
    Последнее редактирование: 21 апр 2017
  19. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну так я не знаю, где у тебя роутер, он не обязательно в файле index.php может быть. И если ты подключаешь именно, как сейчас нарисовал, то конечно не переходит - ты же конфиг подключаешь после роутера. У тебя вообще по ходу каша жуткая. Если в index.php роутер, то всё остальное из него нафиг убираешь, для шаблона главной делаешь какой-нибудь home.php. Ну и думай головой, как можно сначала подключить код, использующий массив, а потом - код, его инициализирующий? Я тебе разве так написал? Программа выполняется сверху вниз, если что :) Потому что не просто копипастить надо чужой код, а разобрать, что каждая строчка делает, посмотреть в доках незнакомые функции и т.п. А ты пробуешь подставлять туда-сюда, вместо того, чтобы подумать :(
    --- Добавлено ---
    Логику своей программы сначала словами надо написать :)

    Куда хочешь :)
     
  20. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Из всех слов я понял, что в файле index.php нельзя указывать роутер, а надо еще создать файл home.php не знаю для чего.
    А на счет каши в голове, это правда.
    Короче создал 2 файла как вы написали, в файле router.php указал все пути которые использоваться будут.
    Файл index.php это как бы главная страница сайта, я там просто указываю шаблон который разделен по файлам.
    И думал если я укажу путь к роутеру в индексе я смогу ссылку просто указать go=login или так router[go]=login короче как то так.
     
    #45 _ne_scaju_, 21 апр 2017
    Последнее редактирование: 21 апр 2017
  21. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну я сдаюсь :(
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Вы мне намекните не много прямо, я лучше понимаю. Я же не професионал сейчас в php. Мне еще учится и учится.
    Не сдавайся пожалуйста не все ж так плохо.(
    Ты мне прямей напиши пожалуйста.
     
    #47 _ne_scaju_, 21 апр 2017
    Последнее редактирование: 21 апр 2017
  23. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Да куда уже прямее....
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Ну ладно, укажите на ошибку что я не так делаю? Прямо.
     
  25. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Я уже указал. конфиг надо включать раньше кода роутера. Чувак, ну разбери ты мой код сначала. Вот возьми ниже, напиши по-русски, как мой код работает, по шагам. Потом как твой код. Причём здесь профессионал-непрофессионал в php. 4 строчки разобрать - не нужен большой уровень.