Включая страницы с $ _GET - PullRequest
1 голос
/ 13 февраля 2009

Я хочу, чтобы URL был похож на index.php? Showuser = 512, index.php? Showews = 317 для страниц, которые я получаю из базы данных ... и для обычных страниц index.php? Page = about и т. Д. БЕЗ перезаписи мода .

Invision Power Board имеет такие URL. Я просмотрел их код, но не могу понять, как они это делают.

Я мог бы сделать это так:

if (ctype_digit($_GET['shownews'])) include('shownews.php'); 
elseif (ctype_digit($_GET['showuser'])) include('showuser.php');

// regular pages
elseif ($_GET['page'] == 'about') include('about.php');
elseif ($_GET['page'] == 'help') include('help.php'); 
elseif ($_GET['page'] == 'login') include('login.php'); 

Но это слишком грязно. Просто любопытно, как IPB это делает. Есть ли лучший способ сделать это? БЕЗ любого мода-переписать. Кто-нибудь знает? Я сомневаюсь, что они делают это, как указано выше.

Я не могу сделать:

if (preg_match('/^[a-z0-9]+$/', $_GET['page'])) include('$_GET['page']');

Тогда я бы получил ссылки, такие как index.php? Showuser & id = 512 и которые мне не нравятся. (я знаю, это небезопасно, просто показывая принцип)

Мне нравится этот путь, он не самый лучший, но мне нравится, поэтому, пожалуйста, будьте спокойны с шаблонизаторами, фреймворками и т. Д. Просто будьте добры и ответьте на мой вопрос ... Я просто хочу знать, как IPB делает это.

Спасибо Томек

Ответы [ 2 ]

2 голосов
/ 13 февраля 2009

Я не знаю, как IPB это делает, давайте уберем это с пути. Но вот как I подойдет к этой проблеме:

Во-первых, я понимаю, что есть два вида параметров GET: страница / идентификатор и просто страница. Они будут проверены отдельно.

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

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

Итак, на код псевдо-y диспетчера:

$pagesWithId = array("shownews", "showuser", "showwhatever");
$justPages   = array("about", "help", "login");

foreach ($pagesWithId as $page) {
  if (isset($_GET[$page])) {
    $id = (int)$_GET[$page]; 

    include($page.'.php');
    die();
  }
}

if (in_array($_GET['page'], $justPages)) {
  include($_GET['page'].'.php');
  die();
}

// page not found
show404OrHandleOtherwise();
0 голосов
/ 13 февраля 2009

Для страниц вы просто используете простой массив.

if (isset($pages[$_GET['page']])) include $pages[$_GET['page']];

Для показанных новостей = 317 Вы можете сделать простое преобразование в своем приложении. В зависимости от того, как вы хотите расставить приоритеты на странице или показанных новостях и т. Д .:

if (isset($pages[$_GET['page']])) {
  include $pages[$_GET['page']];
} else {
  $possiblePages = array_filter(array_intersect_key($_GET, $pagesWithId), 'ctype_digit');
  if (!empty($possiblePages)) {
    $id = reset($possiblePages);
    $pageName = key($possiblePages);
    $page = $pagesWithId[$pageName];
    include $page;
  } else {
    //no valid pages
  }
}

Примечание. «Имена страниц» являются ключами массива, а значение - это путь, файл и расширение для включения. Более настраиваемый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...