【问题标题】:Nested PHP switch include navigation嵌套的 PHP 开关包括导航
【发布时间】:2014-08-17 04:22:16
【问题描述】:

我目前正在开发一个小型 Web 项目,我的计划是自下而上地构建它——首先创建一个仅使用 PHP、HTML 和 CSS 的功能性网站,然后,如果用户启用它,通过 Javascript 的魔力,尤其是 jQuery,逐步增强网站。但是,我在 PHP 方面遇到了一些问题,而且由于我只是该脚本语言的新手,所以我想不通的是:

如何实现一个 PHP 开关,在另一个开关中包含导航?

为了更好地阐明我想要实现的目标,让我向您展示我的网站结构的一个小模型:

  • Header.php(标题)
  • Page1.php(内容页面1)
  • Page2.php(内容页2)
  • Page3.php(内容页面3)
  • Page3.1.php(内容页面3子内容1)
  • Page3.2.php(内容页面3子内容2)
  • Page3.3.php(内容页面3子内容3)
  • Footer.php(页脚)

如您所见,当谈到这个模型时,它位于第 3 页,我打算将一个 php 导航嵌套在另一个导航中。这可以在该页面上启用一些滑块式子导航,但到目前为止,我在这方面的努力充其量是徒劳的。 就代码而言,这是我设法拼凑起来的。

<a class="link" href="index.php?id=page1">Page1</a>
<a class="link" href="index.php?id=page2"> Page2</a>
<a class="link" href=” index.php?id=page3">Page3</a>

<?php

  switch($_GET['id']) {
  default:
  include('page1.php');

  break; case "page2":
  include('page2.php');

  break; case "page3":
  include('page3.php');  // *Nested navigation goes inside this page
  }
?>

*在 page3.php 内部我放了几乎相同的代码,只是它链接到该页面的子页面(page3.1.php、page3.2 和 page3.3.php) .

不幸的是,这似乎不起作用 - 首先,当我输入 localhost/index.php 我的网络浏览器时,我收到以下通知: 注意:未定义的索引:第 26 行 C:\xampp\htdocs\php-navigation\index.php 中的 id。 但是,当我单击其中一个链接或输入诸如 index.php?id=page1 之类的 URL 时,我没有收到该通知。所以看起来我需要定义“id”变量,但是在哪里以及如何做呢?

除此之外,第 3 页上的嵌套导航根本不起作用,相反,当单击子页面的链接时,我会被重定向到索引页面。我可能与 URL:s 有关,但话说回来,我知道什么?

请帮我弄清楚如何完成这项工作 - 欢迎所有帮助,即使只是朝着正确的方向轻微推动,也非常感谢 - 在此先感谢!

/约翰·温德斯滕

【问题讨论】:

    标签: php navigation include nested switch-statement


    【解决方案1】:

    您收到的警告是关于未定义的索引 - 您正在尝试访问不存在的数组元素。你需要改变

    switch($_GET['id']) {
    

    if (isset($_GET['id'])) {
        $id = $_GET['id'];
    } else {
        $id = "page1";
    }
    
    switch($id) {
    

    对于第 3 页,首先您可能会遇到问题:

    <a class="link" href=” index.php?id=page3">Page3</a>
    

    你会注意到一个额外的空格和一个奇怪的引用( vs " - 你想要")。

    对于子页面,我们必须查看生成的 URL,但我猜它也与链接有关 - 为了保持您的操作方式,我可能会让链接看起来像:

    <a class="link" href="index.php?id=page3&subid=2">Subcontent 2</a>
    

    然后在php中:

    if (isset($_GET['subid'])) {
        $subid = $_GET['subid'];
    } else {
        $subid = 1;
    }
    
    switch($subid) {
    

    【讨论】:

    • 首先,很抱歉我的回复延迟,但我在上班前发布了这个,直到现在我还没有时间回家测试你的解决方案。说了这么多,非常感谢!多亏了您的解释,这一切现在都可以正常工作了-定义索引消除了通知,并且您对子导航的解决方案就像一个魅力。现在,只是为了澄清一下 - 我这样做的方式是我将子导航的 PHP 代码放在第 3 页内,并将您的方法用于 URL:s。你是这样打算的吗?在这种情况下,“subid”也是任意的,对吗?我选择了“幻灯片”,效果很好
    • 最后,如果您不介意,我有一个小问号,您或其他人也许可以帮我解决。在各种网页设计博客和论坛上查找这种导航方法时,我遇到一些人说它不能保存使用。真的吗?如果是这样,为什么会这样?我能做些什么来减少它的脆弱性?有了这个,再次感谢,现在我要去收获一些声誉,以便能够支持你的帖子。干杯
    • include($_GET['id']); 这样的操作是不安全的,因为这样他们就可以包含他们想要的任何文件。但是你所拥有的本质上是一个白名单,我看不出它不安全的任何理由。
    【解决方案2】:

    我的朋友英语不是我的第一语言,所以我又读了一遍,但我在你的代码中发现了一个错误。

    对于第 3 页,这就是为什么您在第 3 页链接遇到问题的原因

    <a class="link" href=” index.php?id=page3">Page3</a>
    

    href 部分错误 this one href=" 应该是 this href=" 表示你的 href 部分应该是 this

    href="index.php?id=page3"
    

    并删除 id 的错误

    像这样添加if语句

    if($_REQUEST=='GET'){ //all of your switch statement will come here }
    

    所以你的代码应该是这样的

    <?php
    
    //start of if statement  
    if($_REQUEST=='GET'){
    
    
      switch($_GET['id']) {
      default:
      include('page1.php');
    
      break; case "page2":
      include('page2.php');
    
      break; case "page3":
      include('page3.php');  // *Nested navigation goes inside this page
      }
    
    }//end of if statement
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多