За последние 24 часа нас посетили 15810 программистов и 1666 роботов. Сейчас ищут 905 программистов ...

Конструкция switch

Тема в разделе "PHP для новичков", создана пользователем Talany, 25 дек 2012.

  1. Talany

    Talany Активный пользователь

    С нами с:
    20 апр 2012
    Сообщения:
    15
    Симпатии:
    0
    Доброго времени суток любители и профи php.
    Есть идея реализовать весь сайт через один файл index.php, в связи с этим есть вопросы...
    1. нормально ли это?
    2. будет больше нагрузки?
    3. насколько это актуально?
    4. есть код
    Код (Text):
    1.  
    2. switch($_SERVER['REQUEST_METHOD']){
    3.      case 'GET':
    4.           break;
    5.      case 'POST':
    6.           break;
    7. }
    Как продолжить код, чтобы в результате и получил -
    для примера: запрос (index.php?number=32)
    метод GET переменная NUMBER значение 32
    Конечно же отправлятся будет не только number, но и допустим (idex.php?set=update)

    P.S PHP увлекся не так давно, по этому пожалуйста с комментариями...
    Заранее благодарю....
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    1. нормально
    2. нагрузка не изменится
    3. вполне актуально. единая точка входа называется
    4. непонятна связь этого кода с тем что вы хотите сделать. если придет запрос index.php?number=32 то в скрипте вам автоматически будет доступна переменная $_GET['number'], и в ней будет лежать '32'. чтобы пришло методом POST нужно отправлять из формы например
    <form method="post" action="">
    <input type="text" value="32" name="number" />
    <input type="submit">
    </form>

    а вообще это самые основы. читайте документацию и статьи. без этого вы не сможете нормально начать программировать
     
  3. Talany

    Talany Активный пользователь

    С нами с:
    20 апр 2012
    Сообщения:
    15
    Симпатии:
    0
    runcore я знаю что это основа....
    понятное дело что $GET['number'] равно 32 и про POST запросы я знаю...
    дело в том что хотелось бы код понятней сделать....
    мне что постоянно перебирать if(){}else{}???
    Код (Text):
    1.  
    2. if(isset($_GET['number'])){//действие}
    3. if(isset($_GET['text'])){//действие}
    4. if(isset($_GET['act'])){//действие}
    5. // и т.д
    это нормально так перебирать???
    не легче все получить
    Код (Text):
    1. switch(//не знаю какое условие){
    2.     case 'number':
    3.             // действие
    4.             break;
    5.     case 'text':
    6.             // действие
    7.             break;
    8. // и т.д
    9. }
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Есть такое правило, оно выжжено каленым железом на жопе каждого веб-программиста: никогда не доверяй данным пользователя.
    Поэтому да, обязательно if(isset($_GET['number'])) или что-то аналогичное. Ну чуть-чуть элегантнее может получиться с тернарным оператором.

    Нужного параметра может и не быть или он может содержать совсем не то, что ожидается. Это интернет, детка! Плохишей полно и постоянно будут испытывать твои скрипты на прочность с помощью автоматизированных ковырялок.
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ну можете определить в массиве все возможные модули и просто проверять через in_array() например.
    если запрос один из тех что есть в массиве, значит он валидный и нужно запускать функцию, или инклюдить файл .
    тоесть обработка логики будет одна общая на все запросы. а далее уже особенности каждого действия будут подгружаться через инклюд или через вызов отдельной функции. тут уже на что фантазии хватит
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    runcore говорит о т.н. "белых списках". гугль много об этом знает.

    Добавлено спустя 46 секунд:
    срань господня! ну почему на этом форуме такой ущербный парсер bbcode!
     
  7. Talany

    Talany Активный пользователь

    С нами с:
    20 апр 2012
    Сообщения:
    15
    Симпатии:
    0
    Все ясно...
    Да artoodetoo я первым делом и задумался о безопасности... (читал о безопасности php...) но с фреймворками еще не дорос работать... так что ручками, когда обожгусь тогда и буду лопатить литературу.
    Благодарю artoodetoo и runcore за помощь...
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Можешь ввести переменную типа mode, например.
    site.ru?mode=main
    site.ru?mode=guestbook
    site.ru?mode=gallery
    и т.д.
    Код (PHP):
    1. <?php
    2. $mode = isset($_REQUEST['mode']) ? $_REQUEST['mode'] : '';
    3. switch($mode) {
    4.     case 'main':
    5.         // действия для главной
    6.         break;
    7.     case 'goestbook':
    8.         // инклудим гостевую книгу
    9.         break;
    10.     // ... и т.д.
    11.     default:
    12.         // в переменной оказалась какая-то хрень
    13.         header('HTTP/1.1 404 Not Found');
    14.         echo('Запрошенная страница отсутствует на сервере');
    15.         exit;
    16. }
    17. ?>
     
  9. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород

    Можно вот так
    Код (Text):
    1.  
    2. switch (true)
    3. {
    4.   case isset($_GET['number']):
    5.     // include
    6.     break;
    7.   case isset($_GET['number3']):
    8.     // include
    9.     break;
    10. }
     
  10. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    зачем делать миллион ветвлений, когда можно сделать одно место обработки:
    Код (PHP):
    1. $modules = array('home','news','forum'); // допустимые имена модулей
    2. //
    3. $mode = in_array($_GET['mode'],$modules) ? $_GET['mode'] : array_shift($modules);
    4. include( './modules/'.$mode.'.php' );
    5.  
     
  11. Колбася

    Колбася Активный пользователь

    С нами с:
    12 дек 2011
    Сообщения:
    722
    Симпатии:
    0
    А я вот чета isset не использую думаете поставить коллеги?
     
  12. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    в этом сезоне модно его использовать. так что торопись, а то потом говорят trim() в моду войдет
     
  13. Talany

    Talany Активный пользователь

    С нами с:
    20 апр 2012
    Сообщения:
    15
    Симпатии:
    0
    Благодарю всех, очень интересные примеры....
    Сам смотрю в сторону "Белого списка".... правда не знаю на сколько это правильно...
    Еще раз спасибо за помощь.

    P>S I like php.It`s cool.
     
  14. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    Колбася, ну еже ли скрипт еще не заколбасило, тогда можно и не ставить...
     
  15. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. //?number=&text=&act=
    2. if(isset($_GET['number'],$_GET['text'],$_GET['act'])) {
    3.     echo'Переменные существуют';
    4. }