2009-07-27 4 views
0

diesebrauche meine Front-Controller ist besser Struktur meines Code

$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 =("; 

konnte ich irgendwie auch die Kennungen zu dem Array hinzufügen? aber ich möchte die Seiten als index.php MatchID = 9438 und für die regelmäßige Seiten: index.php? content = Spiele

würde wirklich einige Ideen

dank aprricate!

+2

Könnten Sie nicht einfach jede ID unter einer Datei speichern und den Database-Anruf basierend darauf ändern? Wie type = match & id = 5 –

Antwort

3

Mein Vorschlag, von meinem Kommentar ist dies:

Um zu prüfen, welche Art von id ist, sollten Sie zwei $_GET Parameter zu verwenden. Einer ist der Typ (Übereinstimmung, Auszeichnung, Server usw.), einer ist die ID. Auf diese Weise müssen Sie nicht für 500 verschiedene $_GET Parameter überprüfen, nur den Wert von 2. Viel mehr standardisiert.

Zweitens möchten Sie alles unter 1 Datei für die ID zu machen.

Im Sinne des Schreibens weniger Code, nicht mehr, wäre es relativ einfach, die SQL-Anweisung zu ändern, um den Datensatz basierend auf $ _GET ['Typ'] Match, Award, Team, etc. zu greifen natürlich vorausgesetzt, dass sie wahrscheinlich gleich aussehen werden. Wenn sie dies nicht tun, anstatt neuen Code zu schreiben, um jeden Typ zu erfassen, stattdessen Code schreiben, um ihn anders anzuzeigen

Alle Variablen in diesem Code werden vorher vielmals validiert/somatisiert.

 
// 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

Es könnte voran gehen helfen und einen Rahmen wie Zend verwenden:

http://framework.zend.com/

+0

Nicht wirklich ein nützlicher Kommentar ohne eine Erläuterung, wie die Anwendung eines Frameworks es ermöglichen würde, diesen Code klarer zu strukturieren. Plus ein Framework ist eine ziemlich große Abhängigkeit hinzuzufügen. – Rafe

1

ich mit Tom einverstanden - Sie einen Rahmen in Verwendung wie Zend aussehen sollte, Kuchen, Symfony, Kohana, CodeIgniter, ez-Komponenten oder Seagull. Der Vorteil der Verwendung eines Frameworks ist, dass sie bereits viele Probleme für Sie gelöst haben, einschließlich: 1) Wie Sie Ihren Code strukturieren 2) Wie interpretieren Sie hübsche URLs (dh/x/1/y/2 statt? x = 1 & y = 2) 3) Wo bestimmte Arten von Code (html, php, configs, etc) 4) Wie Sie etwas reparieren können Sie nicht herausfinden (weil diese Frameworks Gemeinschaften haben) und viel viel mehr ...

Das heißt, vielleicht wollen Sie nicht den ganzen Overhead der Verwendung eines Frameworks (es erfordert, dass Sie viel lernen). In diesem Fall empfehle ich Rasmus Lerdorfs "No Framework PHP Framework". Rasmus ist der Schöpfer von PHP, also weißt du, dass er seine Sachen kennt.

Schließlich Ihre eigentliche Frage zu beantworten, hier ist, wie ich es tun würde:

konnte ich irgendwie die Kennungen hinzufügen zu dem Array? ich will die Seiten als index.php MatchID = 9438 und für normale Seiten: index.php? Content =

Spiele

Sicher, aber ja, wie Chacha102 sagte, werden Sie zwei Parameter benötigen: $ Bereich (Seite) und $ ID. Beispiel: index.php?area = Artikel & id = 2345

Dann können Sie wieder organisieren & Ihre 'Front-Controller' vereinfachen auf diese Weise: /index.php /areas/articles.php /areas/boards.php usw. Anstatt die Templates articleid.php zu benennen, nenne sie einfach articles.php - so sagt dir dein Gebietsname auch, welche Vorlage benutzt werden soll.

$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

Was, keine Agavi Liebe? http://www.agavi.org/ –

0

Sie können dies tun:

<?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); 

?> 

diesen Code können Sie in Ihrer Anwendung verwenden wie:

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 

Ich hoffe, dass es Ihnen gefällt

PD: Der Code ist nicht getestet, aber ich hoffe, Sie fangen meine Idee

Verwandte Themen