需要更好的代码结构

时间:2009-07-27 17:11:03

标签: php include

这是我的前台控制器

$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?content = matches

会真正推销一些想法

谢谢!

4 个答案:

答案 0 :(得分:3)

我的建议,从我的评论是这样的:

为了检查它的ID类型,您应该使用两个$_GET参数。一个是类型(匹配,奖励,服务器等),一个是ID。这样您就不必检查500个不同的$_GET参数,只需要检查值2.更加标准化。

其次,您希望将所有内容都放在1个文件中,以显示ID。

本着编写更少代码而不是更多代码的精神,根据$ _GET ['type']是匹配,奖励,团队等来更改SQL语句以获取记录会相对容易。这是因为它们可能看起来一样。如果他们不这样做,而不是编写新代码来获取每种类型,而是编写代码以不同方式显示它

此代码中的所有变量都需要事先进行验证/保护。

// 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");

答案 1 :(得分:1)

我同意Tom的观点 - 你应该考虑使用Zend,Cake,Symfony,Kohana,CodeIgniter,ez-Components或Seagull等框架。使用框架的优势在于它们已经为您解决了很多问题,包括: 1)如何构建代码 2)如何解释漂亮的网址(即/ x / 1 / y / 2而不是?x = 1& y = 2) 3)在哪里放置某些类型的代码(html,php,configs等) 4)如何解决你无法弄清楚的事情(因为这些框架有社区) 还有更多...

话虽这么说,也许你不想要使用框架的所有开销(它确实需要你学到很多东西)。在这种情况下,我推荐Rasmus Lerdorf的“No Framework PHP Framework”。 Rasmus是PHP的创建者,所以你知道他知道他的东西。

最后,为了回答你的实际问题,我会这样做:

  
    

我可以以某种方式将标识符添加到数组中吗?     我希望页面为index.php?matchid = 9438     对于常规页面:index.php?content = matches

  

当然,但是,正如Chacha102所说,你需要2个参数:$ area(page)和$ id。 示例:index.php?area = articles& 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);
   }
}

答案 2 :(得分:0)

继续使用Zend的框架可能会有所帮助:

http://framework.zend.com/

答案 3 :(得分: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:代码没有经过测试,但我希望你能抓住我的想法