2009-07-27 3 views
0

это мой фронт-контроллерНужна лучшую структуру моего кода

$pages = array("matches", "boards", "search", "articles", "interviews", "userlist", "teams", "servers", "awards", "gallery", "qids"); 

if (!$_SERVER['QUERY_STRING']) include('home_en.php'); 
elseif (isset($_GET['matchid'])) include('matchid.php'); 
elseif (isset($_GET['boardid'])) include('boardid.php'); 
elseif (isset($_GET['articleid'])) include('articleid.php'); 
elseif (isset($_GET['interviewid'])) include('interviewid.php'); 
elseif (isset($_GET['userid'])) include('profi.php'); 
elseif (isset($_GET['teamid'])) include('teamid.php'); 
elseif (isset($_GET['serverid'])) include('serverid.php'); 
elseif (isset($_GET['awardid'])) include('awardid.php'); 
elseif (isset($_GET['galleryid'])) include('galleryid.php'); 
elseif (isset($_GET['threadid'])) include('threadid.php'); 
elseif (isset($_GET['blogid'])) include('blogid.php'); 
.. 

elseif (in_array($_GET['content'], $pages)) include($_GET['content']); 

else echo "File not found =("; 

может я как-то добавить идентификаторы в массив тоже? но я хочу, чтобы страницы, как index.php matchid = 9438 и для регулярных страниц: index.php? содержания = соответствует

действительно aprricate некоторым идеи

спасибо!

+2

Не могли бы вы просто сделать каждый идентификатор под одним файлом и изменить вызов базы данных на основе какого именно? Подобно type = match & id = 5 –

ответ

3

мое предложение, от моего комментария это:

Для того, чтобы проверить, какой тип идентификатора это, вы должны использовать два $_GET параметров. Один из них - тип (совпадение, награда, сервер и т. Д.), Один - идентификатор. Таким образом, вам не нужно проверять 500 различных параметров $_GET, просто значение 2. Более стандартизировано.

Во-вторых, вы хотите сделать все это под 1 файлом для показа ID.

В духе написания меньше кода, а не более, было бы относительно легко изменить инструкцию SQL, чтобы захватить запись на основе if $ _GET ['type'] было совпадением, наградой, командой и т. Д. Это конечно, учитывая, что они, вероятно, будут выглядеть одинаково. Если они этого не делают, вместо того, чтобы писать новый код для захвата каждого типа, вместо этого напишите код, чтобы отобразить его по-разному.

Все переменные в этом коде многократно проверяются/санатируются заранее.

 
// First Get the Type 
$type = $_GET['type']; 
// Then the ID 
$id = $_GET['id']; 

// SANITIZE YOUR DATA. Replace this with your sanitization. 
die("SANITIZE YOUR DATA HERE"); 

// Get Data Here 
$sql = "SELECT * FROM table WHERE type=".$type." AND id=".$id; 
$data = mysql_query($sql); 

// Next, Include a template based on the data. 

// Global the variable so it can be used in the file 
Global $data; 

include($type."-template.php"); 
0

Это может помочь, чтобы идти вперед и использовать рамки, такие как Zend:

http://framework.zend.com/

+0

Не очень полезный комментарий без объяснения того, как применение фреймворка позволит сделать этот код более реорганизованным. Кроме того, фреймворк представляет собой довольно большую зависимость для добавления. – Rafe

1

Я согласен с Томом - вы должны смотреть на использование среды, таких как Zend, торт, Symfony, Kohana, CodeIgniter, ez-Components или Seagull. Преимущество использования структуры заключается в том, что они уже решили много проблем для вас, в том числе: 1) Как структурировать код 2) Как интерпретировать красивые URL-адреса (т.е./x/1/y/2 вместо? x = 1 & y = 2) 3) Где поставить определенные типы кода (html, php, configs и т. д.) 4) Как исправить что-то, что вы не можете понять (потому что в этих средах есть сообщества) и многое гораздо больше ...

Если вы говорите, возможно, вам не нужны все накладные расходы на использование фреймворка (это требует, чтобы вы многому научились). В этом случае я рекомендую Rasmus Lerdorf's «No Framework PHP Framework». Расмус - создатель PHP, поэтому вы знаете, что он знает свои вещи.

Наконец, чтобы ответить на ваш актуальный вопрос, вот как я бы это сделать:

может я как-то добавить идентификаторы в массив тоже? я хочу, чтобы страницы, как index.php matchid = 9438 и обычные страницы: index.php? Содержание = соответствует

Конечно, но да, как сказал Chacha102, вам потребуется 2 параметра: $ (страница) и $ id. Пример: index.php?площадь = & статьи ID = 2345

Тогда вы можете повторно организовать & упростить 'фронт-контроллер' так: /index.php /areas/articles.php /areas/boards.php и т.д. Вместо того, чтобы называть шаблоны articleid.php, просто назовите его articles.php - таким образом ваше имя области также сообщит вам, какой шаблон использовать.

$valid_areas = array("matches", "boards", "search", "articles", 
        "interviews", "userlist", "teams", "servers", 
        "awards", "gallery", "qids"); 

$area = strtolower(trim($_REQUEST['area'])); //if you are not posting any forms, use $_GET instead 
$id = (int)$_REQUEST['id']; //if you are not posting any forms, use $_GET instead 

if(!$id) 
{ 
    include('home_en.php'); 
} 

if(!in_array($area), $valid_areas)) 
{ 
    echo 'Sorry, the area you have requested does not exist: '.$area; 
    exit(); 
} 
else 
{ 
    $template = '/templates/'.$area.'.php'; 

    if(!file_exists($template)) 
    { 
     echo 'Sorry, the file you have requested does not exist: '.$area.' '.$id); 
    } 
    else 
    { 
     include($template); 
    } 
} 
+0

Что, нет любви Агави? http://www.agavi.org/ –

0

Вы можете сделать это:

<?php 
    $controllerDefault = 'home'; 

    function sanitize($str) 
    { 
     return str_replace(array('.', '/', '\\'), '', $str); 
    } 
    //Prevent of Remote File Inclusion 
    $controller = sanitize($_GET['controller']); 
    $id = intval($_GET['id']); 

    if (empty($controller)) 
    { 
     $controller = $controllerDefault; 
    } 

    if (!empty($id)) 
    { 
     $controller .= 'id'; 
    } 

    $controllerFile = $controller . '.php'; 

    if (!file_exists($controllerFile) 
      || $controller == 'index') //for not recursive index.php include :) 
    { 
     exit('Controller "'.$controllerFile.'" not exists'); 
    } 
    include($controllerFile); 

?> 

Используя этот код вы можете использовать приложение как:

http://yoursite.com/index.php //include('home.php') 
http://yoursite.com/index.php?id=285230 //include('homeid.php') 
http://yoursite.com/index.php?controller=matches //include('matches.php') 
http://yoursite.com/index.php?controller=matches&id=28410 //include('matchesid.php') 
http://yoursite.com/index.php?controller=notexists //ERROR! Controller "notexists" not exists 
http://yoursite.com/index.php?controller=../../etc/passwd //ERROR! Controller "etcpasswd" not exists 

Я надеюсь, вам понравится

PD: код не проверено, но я надеюсь, что вы поймаете мою идею

Смежные вопросы