Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > насколько правильный и безопасный способ навигации


Автор: SAnatoliy 18.10.2007, 14:56
Цитата


ссылки меню такие: 
ndex.php?con=s
ndex.php?con=y
ndex.php?con=m

if($con==4) { include ($inclu_files['s']); }
if($con==5) { include ($inclu_files['y']); }
if($con==6) { include ($inclu_files['m']); }

имя в массиве $inclu_files['s']

P.S.
Прочитал тут на сайте, про глобальные переменные. понял что способ этот с этой точки зрения не безопасный. 

но придумать как иначе не могу наверно.  Посоветуйте кто как делает и как надо.

Автор: Pokoinik 18.10.2007, 15:22
SAnatoliy, 
во первых,
код будет работать только с включенным регистр глобалс, что уже не безопасно,
используй $_GET['con']
во вторых,
быстре работать будет конструкция 
if ... else if...
или switch
в третьих с какого такого перепугу, если у тебя con ровна буквам, она будет ровняться цифрам 4 5 6

Автор: olegop 18.10.2007, 15:47
index.php?con=1
index.php?con=2
index.php?con=3

Код

if(isset($_GET['con'])) { 
    switch ($_GET['con']) {
        case 1: //Набор команд
            break;
        case 2: //Набор команд
            break;
        case 3: //Набор команд
            break;
         }
} else {
        //набор команд
            }

Автор: MoLeX 19.10.2007, 11:25
Для дальнейшего развития темы  smile: как воот такая навигация
Код

$page = htmlspecialchars($_GET['page']);    
$DIR=empty($page)?null:$page; 
$DIR = substr($DIR, 0, 17);

if(empty($DIR)) 
    require("./include/index/index.php"); 
elseif(file_exists("./include/".basename($DIR)."/index.php")) 
    require("./include/".basename($DIR)."/index.php"); 
else 


Автор: flashaa 19.10.2007, 11:37
Вариант olegop, имхо, наиболее правильный. Ещё можно упростить, если 
Код

switch ($_GET['con'])

заменить на 
Код

switch (@$_GET['con'])

В этом случае, нам не придется проверять внешнее условие isset:


Код

    switch (@$_GET['con']) {
        case 1: //Набор команд
            break;
        case 2: //Набор команд
            break;
        case 3: //Набор команд
            break;
        default: 
            // Тут будут те операторы, которые были после else
            break;
         }


Автор: MoLeX 19.10.2007, 12:11
flashaa, а если нужен модульный движок? в смысле кинул в папку новый модуль и фсе к нему можно обращаться и он работает, что тогда?

Автор: flashaa 19.10.2007, 12:31
Цитата(MoLeX @ 19.10.2007,  12:11)
flashaa, а если нужен модульный движок? в смысле кинул в папку новый модуль и фсе к нему можно обращаться и он работает, что тогда?

Мой скрипт чему-то противоречит? Это же общая структура скрипта-контроллера, когда имеется некоторая переменная, идентифицирующая действие пользователя и как её можно обработать. Задача  скрипта разграничить эти самые действия, а дальше после любой метки case помести свои дейтсвия для какого-угодно движка.

Для твоего примера туда надо посестить reqire (нужный файл) 

Автор: MoLeX 19.10.2007, 12:49
да приваильно нужно поместить файл smile. Лано сформулирую: ты пишешь большой проект который будет развиваться и в дальнейшем (появлеются новые блоки и т.д.), согласись каждый раз открывать файлик (index.php или что там у тебя будет) искать нужное место править\добавлять и т.д. неудобно же. так вот что ты в таком случае делать будешь?

Автор: flashaa 19.10.2007, 13:28
MoLeX твой вариант действительно хороший в том, что нужно редактировать один файл дял каждого действия. Ты разделяешь скрипт на блоки, это тоже хорошо - облегчает редактирование/замену. 
Но у твоего варианта также есть и минусы. Допустим у тебя есть несколько схожих действий пользователя, получается, что ты должен будешь писать во включаемых файлах одинаковый код. Скприты конечно много весить не будут, но зато в избыточности кода сразу затрудняется редактирование. Допустим написал 2 похожих файла и раскидал их в свою папку. А потом обнаружил, что у тебя была какая-то ошибка или нехорошее решение. Ты будешь редактировать каждый файл поочереди, если файлов много, запутаешься, пропустишь какие-то файлы... Это не говоря уже о глобальной переделке всей системы. Тогда тебе надо будет все файлы удалять и писать заново.

У меня другой подход в скрипте,  он работает как и твой в плане блочности, но лишен избыточности - каждый кусок кода повторяется в нем только 1 раз. Захочу поменять что-то в крупном проекте, поменяю исходный файл и все автоматически модернизируется. 
Я храню общую функциональность в одном месте, но это не значит, что я храню в этом index.php ВЕСЬ код, как раз наоборот.
Я использую ООП на php5. Всю функциональность разбита на классы. А в заголовке скрипта прописан автолоадер.

Код

public function __autoload($c) {
      require_once('classes/class' . $c .'.php');
}


Допустим я хочу работать с базой, тогда включаю класс Database

Код

сase 'add':
    $work = new Database(); // вызывается автолоадер и включается файл class.Database.php
    $work->add($_REQUEST['record']);
    
    break;

case 'delete':
    ...
    break;


Как видишь кода не так уж много, все так же блочно и разделено. К тому же оно сосредоточено в одном файле и видна ВСЯ логика работы (в общих чертах) проекта и не надо для того чтобы разобраться лазить по всем файлам. 

Выше мы рассматривали только гет запросы.
А если у тебя есть также POST и AJAX запросы, которые к тому же могут обрабатываться вместе?

В моем случае это просто ещё одна секция кода в index.php а в твоем случае ты должен будешь писать файлы так, чтобы они получали информацию о действиях и переменных друг друга, что сомневаюсь, что получиться и ты скорее всего запутаешься - перепутаешь какие переменные были в одном файле, какие в другом, какие в глобальном скрипте.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)