基于服务器URL路径的条件头源

时间:2012-04-02 19:15:25

标签: php url conditional

问题:我想在CMS上为每种内容类型($categoryId)加载自定义头文件。例如,如果网址是" /?action = archive& categoryId = 1",我希望它包含我的" header_medicine.html"文件。

我绝对是一个PHP菜鸟,但我已经尝试尊重这个论坛,并使用 this post about conditional code based on url上的提示解决了我的问题,但是存档页面仍然从我的'否则'条件。

以下是代码:

<?php $archive_url = parse_url($_SERVER['REQUEST_URI']);

if ($archive_url['path'] == "/?action=archive&categoryId=1")
    include "header_medicine.html"; 

    elseif ($archive_url['path'] == "/?action=archive&categoryId=2")
    include "header_science.html"; 

    elseif ($archive_url['path'] == "/?action=archive&categoryId=3")
    include "header_other.html"; 

    else 
    include "header.html";
?>

感谢您考虑我的问题!


更新:解决方案

对于任何感兴趣的人,这里是我上面发布的代码问题的工作解决方案(使用简化的文件系统语法)。我没有使用@Michael在下面的代码中推荐的isset函数。感谢所有提出建议的人,我现在距离掌握一些关于php的线索还有一步之遥。

<?php switch ($_GET['categoryId']) {
    case 1:
    include "header_medicine.html";
    break;
    case 2:
    include "header_science.html";
    break;
    case 3:
    include "header_other.html";
    break;
    default:
    include "header.html";
    }
?>

4 个答案:

答案 0 :(得分:1)

你需要花很长时间来解决PHP中实际上非常简单的问题。您只需通过the $_GET[] superglobal array查看$_GET['categoryId']的内容。 parse_url()及其表兄parse_str()将解析正确的解析网址,在您的情况下,您希望查看的部分是$archive_url['query'],但这一切都是不必要的 - 信息你需要的是$_GET

if (isset($_GET['categoryId']) {
// If this also depends on action=archive, use
// if (isset($_GET['categoryId']) && isset($_GET['action']) && $_GET['action'] == 'archive')
  switch($_GET['categoryId']) {
    case 1:
      include('/header_medicine.html');
      break;
    case 2:
      include('/header_science.html');
      break;
    case 3:
      include('/header_other.html');
      break;
    default:
      include('templates/include/header.html');
  }
}

现在,我发现你真的想要包含像/header_science.html这样的文件是多么可疑。 include()调用文件系统路径,因此除非您的文档根目录也是服务器文件根路径/,否则这些路径可能不是正确的包含路径。

您可能正在寻找类似

的内容
include($_SERVER['DOCUMENT_ROOT'] . '/header_science.html');

答案 1 :(得分:1)

您可以通过$_GET$_POSTothers访问PHP中的参数。因此,$_GET['action']会提供操作类型存档,$_GET['categoryId']会提供1。

所以你可以这样做:

<?php
  switch ($_GET['categoryId']) {
    case "1":
      include "/header_science.html"; 
      break;
    case "2":
      include "/header_other.html"; 
      break;
    default:
      include "templates/include/header.html";
  }
?>

http://php.net/manual/en/control-structures.switch.php

您的示例代码无效,因为$archive_url['path']只会为您提供路径/。从php手册看一下这个例子:

http://php.net/manual/en/function.parse-url.php

<?php
  $url = 'http://username:password@hostname/path?arg=value#anchor';
  print_r(parse_url($url));
  echo parse_url($url, PHP_URL_PATH);
?>

以上示例将输出:

Array
(
  [scheme] => http
  [host] => hostname
  [user] => username
  [pass] => password
  [path] => /path
  [query] => arg=value
  [fragment] => anchor
)

答案 2 :(得分:0)

您可以从数据库中动态获取包含路径吗? 通过post / get传递文件位置不安全。

答案 3 :(得分:-1)

使用$ _GET数组(OR $ _REQUEST),它包含在url中传递的所有参数:

例如:

page.php?aaa=1&bbb=hello
你有:

 $_GET['aaa'] 

 $_GET['bbb']  

包含其相对值