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

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

  • XoxMa

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

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

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

    index.php:

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


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

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


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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

    if (empty($_GET['mod']) or !file_exists("mods/".$_GET['mod'].".php")) {
     $_GET['mod'] = $sys_def_mod;
    }

    и

    if (isset($_GET['mod']))
    {
      include("mods/" . $_GET['mod'] . ".php");
    }

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    $p = new Pages('mypage');
    $p->GetPage();
  • XoxMa

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

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

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

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

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

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

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