ФорумПрограммированиеPHP для идиотов → Написал мини-портал, а он не работает

Написал мини-портал, а он не работает

  • XoxMa

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 16 февраля 2008 г. 15:27

    Я нашёл в инете небольшие статьи о написании маленьких портальчиков, и примерно их объединив и убрав лишнее, получилось это:

    index.php:

    <?php
    $sys_def_mod = &quot;mod1&quot;;
    if (!isset($mod) || ($mod==&quot;&quot;) || (!file_exists (&quot;mods/$mod.php&quot;))) {
    $mod = $sys_def_mod;
    }
    include(&quot;mods/$mod.php&quot;);
    ?>


    Модули mod1.php и mod2.php одинаковы:

    <?php
    if (!eregi(&quot;index.php&quot;, $_SERVER[&#39;PHP_SELF&#39;])) { die (&quot;Access denied&quot;); }
    echo &quot;Это модуль номер 1!<br>&quot;;
    echo &quot;А <a href=&#39;index.php?mod=mod2&#39;>здесь</a> можно посмотреть на модуль номер 2&quot;;
    ?>


    У меня такое ощущение, что вот это: include(&quot;mods/$mod.php&quot;); влияет на безопасность.
    Вообщем, когда я захожу на index.php, там отображается mod1 (потому что модуль по умолчанию $sys_def_mod = &quot;mod1&quot;;), а если я введу такой адрес index.php?mod=mod2, то ничего не изменится, и всё равно будет отображаться mod1.php

    Нужна помощь.
  • disc

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 16 февраля 2008 г. 16:49, спустя 1 час 22 минуты 14 секунд

    $mod откуда берется? опять вопрос про $_GET[&#39;mod&#39;]. Для начала общие понятия про php необходимо получить, потом уже к написанию минипорталов переходить. Проблема register_globals и старых книг про PHP3(4) на лицо.
  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 17 февраля 2008 г. 2:27, спустя 9 часов 38 минут 5 секунд

    Я несовсе мпонял что ты хочешь, но может так:
    index.php
    <?php
    define(&quot;PROTECTION&quot;, true);
    if (isset($_GET[&#39;mod&#39;]))
    {
    include(&quot;mod&quot; . $_GET[&#39;mod&#39;] . &quot;.php&quot;);
    }
    ?>


    mod1.php
    <?php
    if (!defined(&quot;PROTECTION&quot;))
    {
    exit(&quot;Forbidden&quot;);
    }
    echo &quot;Это mod1&quot;;
    ?>
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 17 февраля 2008 г. 3:25, спустя 57 минут 51 секунду


    <?php
    $sys_def_mod = &quot;mod1&quot;;
    // не проще ли обрабатывать поле функцией empty()?
    if (empty($mod) or !file_exists(&quot;mods/$mod.php&quot;)) {
    $mod = $sys_def_mod;
    }
    include(&quot;mods/$mod.php&quot;);
    ?>

    Но тут серьезное упущение в безопасности (строка 6), ведь в переменную $mod можно забить путь к какому-угодно файлу.
    В общем, еще есть к чему стремиться.
  • XoxMa

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 17 февраля 2008 г. 14:47, спустя 11 часов 21 минуту 43 секунды

    Всё, спасибо, получилось. Надо было прото сделать так:

    if (empty($_GET[&#39;mod&#39;]) or !file_exists(&quot;mods/&quot;.$_GET[&#39;mod&#39;].&quot;.php&quot;)) {
     $_GET[&#39;mod&#39;] = $sys_def_mod;
    }

    и

    if (isset($_GET[&#39;mod&#39;]))
    {
      include(&quot;mods/&quot; . $_GET[&#39;mod&#39;] . &quot;.php&quot;);
    }

    Правдо я не понимаю, почему всегда надо писать $_GET, но постепенно начинаю привыкать..
  • XoxMa

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 17 февраля 2008 г. 15:11, спустя 24 минуты 12 секунд

    Кстати, а как мне сделать заголовок в тексте, типа:
    $PAGE_TITLE=&quot;модуль &quot;.$_GET[&#39;mod&#39;].&quot; &quot;;

    где $PAGE_TITLE - это переменная которую я задал где-то так &lt;title>$PAGE_TITLE&lt;/title> ?
    Я много вариантов перепробывал, но ничего не получилось.
  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 17 февраля 2008 г. 15:39, спустя 27 минут 40 секунд

    Нихрена не понял ничего в последней месаге.
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 17 февраля 2008 г. 15:43, спустя 3 минуты 56 секунд

    не совсем понятен вопрос, ты про шаблоны?

    в коде даешь значение переменной и подключаешь шаблон через include или require
    $PAGE_TITLE = &#39;abcde&#39;;
    require_once &#39;template.php&#39;;


    template.php:
    <title><?=$PAGE_TITLE?></title>
  • sap

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 17 февраля 2008 г. 16:44, спустя 1 час 49 секунд

    Правдо я не понимаю, почему всегда надо писать $_GET, но постепенно начинаю привыкать..

    Жесть. XoxMa, с таким подходом советую забыть про программирование, как про страшный сон.
  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 17 февраля 2008 г. 17:27, спустя 43 минуты 54 секунды


    Жесть. XoxMa, с таким подходом советую забыть про программирование, как про страшный сон.
    Да подход нормальный. Если ты раньше писал просто $id, а теперь тебе говорят пиши $_GET[&#39;id&#39;], то естественно возникают разные &quot;не понимаю, нахрена мне так жизнь усложняют&quot;.

    Другой вопрос, что писать везде $_GET не надо.
    Достаточно один раз написать в начале скрипта, что-то типа
    $id = isset($_GET[&#39;id&#39;]) ? (int)$_GET[&#39;id&#39;] : 0;
    Тем самым убивая трех зайцев:
    1. в дальнейшем везде используем просто $id
    2. отрабатываем случай, если id отсутствует в урле
    3. защищаемся от SQL инжекции
  • sap

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 17 февраля 2008 г. 17:51, спустя 23 минуты 47 секунд

    Да подход нормальный. Если ты раньше писал просто $id, а теперь тебе говорят пиши $_GET[&#39;id&#39;], то естественно возникают разные &quot;не понимаю, нахрена мне так жизнь усложняют&quot;.

    А что, трудно открыть ман и почитать? Да что ман, на каждом втором (если не на каждом) сайте, связанным с PHP это рассказывается.
  • XoxMa

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 февраля 2008 г. 16:16, спустя 3 дня 22 часа 25 минут

    У меня опять вопрос:

    Что мне нужно изменить в коде, чтобы работала эта вещь .$Pages->GetPage(). ?
    То есть я хочу, чтобы эта вещи вызывала функцию GetPage, но код, приведённый ниже почему-то не работает..

    class Pages {
     private $PageGo = &#39;&#39;;
     public function __construct() {
     $this->PageGo = $page;
     }

    public function GetPage() {
    if (isset($page))
    {
      include(&quot;pages/$page/index.php&quot;);
    }
     return $this->PageGo;
     }
    }

    Если я написал полный бред (скорее всего так и есть), то привидите плз нормальный пример.
    Тока не пишите мне здесь, что проще написать функцию и её так вызвать GetPage();
  • disc

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 21 февраля 2008 г. 16:21, спустя 4 минуты 19 секунд

    сам конструктор класса даолжен принимать ее public function __construct($page);

    if (isset($page))
    $page в данном методе не определен, надо юзать $this->PageGo

    class Pages {
     private $PageGo = &#39;&#39;;
     public function __construct($page) {
       $this->PageGo = $page;
     }

    public function GetPage() {
       if (isset($this->PageGo))
       {
          include(&quot;pages/&quot; . $this->PageGo . &quot;/index.php&quot;);
       }
     return $this->PageGo;
     }
    }

    $p = new Pages(&#39;mypage&#39;);
    $p->GetPage();
  • XoxMa

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 февраля 2008 г. 16:24, спустя 3 минуты 42 секунды

    Что-то не очень понял.
    Можешь написать код?
  • disc

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 22 февраля 2008 г. 2:45, спустя 10 часов 20 минут 58 секунд

    Код увидел? Он в моем предыдущем посте.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!