这是我的前台控制器
$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
会真正推销一些想法
谢谢!
答案 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的框架可能会有所帮助:
答案 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:代码没有经过测试,但我希望你能抓住我的想法