【问题标题】:Conditional HTML class depending on page取决于页面的条件 HTML 类
【发布时间】:2016-03-15 22:15:54
【问题描述】:

我正在寻找一种方法将其导入 PHP:

如果用户在“contact.php”上,则插入“...”

现在,我有这个:

<?php
if(stripos($_SERVER['REQUEST_URI'], '/contact.php'))
{echo '<li class="current">';}
else{echo '<li>';} ?>

但是,由于某种原因,这似乎不起作用。

另外,我想知道是否有办法让它应用于多个页面(在一个目录中)而不使用“数组”,所以基本上说:

如果用户在目录 A 中的文件上,则回显“...”。如果不是,则回显“...”。

编辑: 我想通了为什么它不起作用,但我不明白。基本上,我编辑了一个 HTML5 模板,并将每个页面的通用脚本替换为 header.php 和 footer.php。但是,class="current" 在每个单独的 HTML 页面上的位置不同,现在是 1 个常见的 PHP 标头。当我像这样链接到标题时,我的 header.php 中的函数起作用:

<?php
require "header.php";
?>

但是当我像这样链接到我的标题时它不起作用:

<?php
require "http://localhost/header.php";
?>

但是,我的 header.php 中的所有其他信息都在通过.. 我相信只是这个功能停止工作。 我在这里错过了一些非常简单的东西吗?如果是这样,请原谅我......

【问题讨论】:

  • 您想要的是将另一个源文件包含到当前文件中。第一个版本是正确的,因为它通过本地文件系统访问所需的文件。第二个选项是实际的 HTTP 请求,例如您的浏览器将执行的,但在这种情况下,它运行在服务器的本地网络系统上。这意味着 header.php 中的 PHP 代码会像来自浏览器的原始请求一样执行,因此 REQUEST_URI 包含 /header.php 并且只有处理后的内容会包含在当前文件中。

标签: php class if-statement directory


【解决方案1】:

您的代码可能不起作用,因为如果在开头找到字符串“/contact.php”,则 stripos 将返回 0,然后将其解释为 false。您应该使用 !== 运算符检查 stripos 的结果是否为 false。

if(stripos($_SERVER['REQUEST_URI'], '/contact.php') !== false) { ... }

关于您的其他问题: 只需将 REQUEST_URI 字符串拆分为其部分,然后检查倒数第二个元素是否与您的目录匹配。虽然一般来说可能有更好的方法来解决您的问题。

编辑: 根据 Can Celik 的评论,我建议您使用 parse_url() 函数 [1] 来分解整个请求 URI。然后您可以从返回的数组中访问 URL 的任何部分,并按照我之前的建议拆分“路径”部分:

$parts = parse_url($_SERVER['REQUEST_URI']);
$segments = explode("/", $parts["path"]);
$parent_dir = ""
if(count($segments) > 1) {
    $parent_dir = $segments[count($segments)-2]
}
if($parent_dir == "my_parent_dir") {
    echo '<li class="current">';
} else {
    echo '<li>';
}

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

【讨论】:

  • 如果他在一个带有像 www.test.com/login.php?redirectuURL=/contact.php 这样的 url 参数的页面上怎么办?
  • 确实如此。最好的方法是分解整个路径,例如使用 parse_url() 函数。
【解决方案2】:

stripos() 应该与 FALSE 进行硬比较以确定它是否真的找到了该项目。

和数组一样,字符串的第一个字符是 0(零),而不是 1。如果 needle 字符串的位置在 haystack 字符串的开头,那么 stripos() 将返回 0,因为 0 是第一个位置大海捞针。但是 if() 会将 0 视为 false。

所以你应该说

if(stripos($_SERVER['REQUEST_URI'], '/contact.php') !== false)

http://php.net/manual/en/function.stripos.php

【讨论】:

  • 如果他在一个带有像 www.test.com/login.php?redirectuURL=/contact.php 这样的 url 参数的页面上怎么办?
  • 我不认为这是一个带有url参数的页面,但我不确定。 URL 至少看起来不像这样。
  • 也许,但这不是他遇到的问题,我想回答具体问题,而不是试图预测他可能需要或不需要的其他场景。编辑:顺便说一句,登录后重定向的设计会让我非常担心,并且似乎会带来一些真正的潜在安全问题,更不用说可能会严重破坏用户流量。
  • @KeithTyler:+1 用于回答具体问题;而且我也同意,如果您添加参数,这最终会导致 URI 损坏,尽管我认为在登录后提供所需的重定向 URL 作为参数是一个潜在的安全问题。你会澄清你的疑虑吗?
  • @agent_harris:不知道应用程序的其余安全考虑因素,我担心攻击者可以通过“url hacking”重定向找到未经授权的页面 - 甚至通过破坏流程来制造问题争论。最好使用一些不直接用作路径的标识符,并使用一些查找表将这些标识符映射到所需的目的地。假设我有一个基本的访问登录名并登录到 url “login.php?redirect=admin.php”,然后当我登录时它会将我带到 admin.php,因为我不是管理员,所以我不应该看到它!
【解决方案3】:

试试这个:

if($_SERVER['REQUEST_URI'] == 'contact.php'){
    echo '<li class="current">';
} else{
    echo '<li>';
}

如果您的联系页面包含任何参数,您可以去掉这些参数。

$urlParts = explode('?', $_SERVER['REQUEST_URI'], 2);
$page = $urlParts[0]; // <-- This will give you just contact.php for your example.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 2011-10-26
    • 1970-01-01
    • 2022-10-17
    • 2015-09-27
    • 2021-12-20
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多