【问题标题】:1. Using switches for multiple url variables1.对多个url变量使用开关
【发布时间】:2012-12-14 04:50:48
【问题描述】:

好吧,说我有这些页面,

  • /admin/admin.php
  • /admin/blogger.php

在我的主 index.php 中,我有一个运行“如果存在 $page”函数的开关数组,它工作正常。我的所有页面都是从 site.com/index.php?page=about、site.com/index.php?page=misc 等调用的。

在我的 admin.php 页面内是一个 php 选项卡式导航,它使用 4 个选项卡用于我的管理部分(博主/图像管理器/文件管理器/引用管理器)。它为 4 个页面使用了选项卡功能的切换。

blogger.php 是我的开关有问题的地方。

现在回答我的问题: 而不是为博客系统设置多个页面,“delete.php、add.php、edit.php 等”并使用“删除点击(delete.php?id=1)here”,我想尝试运行这一切都来自博客页面。例如,“site.com/admin.php?page=blogger&act=dp/ep/ap”将获取正在传递的任何 $act,然后使用开关完成操作。

我的 PAGE 开关工作正常,但是当我尝试调用更多开关时,它不起作用。我尝试使用它作为我的代码

if(isset($_SESSION['id'])) {  
  $act = $_GET['act'];  
  switch ($act) {  
    case 'ap':  
      addPost();  
      break;  
    case 'ep':  
      editPost();  
      break;  
    case 'dp':  
      delPost();  
      break;  
    default:  
      ~table setup  
      ~$query, $result  
      ~if / while loops
      ~echo $row->article_id/title/author/date  
      echo "<a href=\"index.php?page=admin&amp;tabindex=0&amp;act=ep&amp;id={$row->article_id}\">Edit</a>"  
      ...  
      ...  
      ...  

这是我遇到的问题。页面正确,tabindex 正确,然后停止工作。我只是得到一个空白页面,而不是我应该的编辑页面。我的 editPost 函数是正确的,因为我已经从 editpost.php?id=1 方式对其进行了测试,这是我试图避免的。是的,我的功能也包括在这里。

url 没有被正确传递吗?还是我的动作开关设置不正确。也许在切换之前设置 isset($_GET['act']) ?我很茫然。

谢谢。

【问题讨论】:

  • 您的错误是否可见?如果 error_reporting(E_ALL); 被隐藏,请尝试将它们置于启动位置。
  • 是的,出于开发目的,我有 error_reporting(E_ALL);在我的 header.inc.php 文件中。
  • 我想这都是我在这里看到的伪代码,你从 _GET 接收到 act=del/edit/add,并且有实际情况 'del/edit/add': break;部分?
  • 对不起,我刚刚在这篇文章中更正了它。 add/edit/del 应该是 ap/ep/dp 以匹配我的 switch case.. 感谢您向我指出这一点。所以是的,&act=ap/ep/dp 开关就在这里。
  • 好的,谢谢。我会在我回到我的开发文件所在的家后尝试这个,让你知道它是否有效。

标签: php


【解决方案1】:

你想像这样一次传递多个动作吗?

//test.php?action=add/update/notify
if(isset($_GET['action'])) {

  $act = $_GET['action'];

  //split actions
  $actions = explode('/', $_GET['action']);

  foreach( $actions as $action ){
      switch ($action) {  
        case 'add':  
          echo "add<br />\n";
          break;  
        case 'update':  
          echo "update<br />\n";
          break;  
        case 'notify':  
          echo "notify<br />\n";  
          break;  
        default:
        // default action if no match  (runs for every item of $actions array)
        break;
      }
  }
}

【讨论】:

  • // 如果不匹配则默认操作(为 $actions 数组的每个项目运行)-------- 这是否意味着如果他们使用 say $act=xDfklj43qrADF 它将显示默认不管他们在我的情况下放了什么?还是我应该使用 foreach?
  • 你不必在default中添加任何东西,但是在switch语句中,无论何时运行,如果没有找到匹配项,就会调用default。
  • 好吧,我就是这么想的。但不,我不是说一次性给他们打电话。甚至不确定这将如何工作。 act=ap/ep/dp 表示act=ap,或act=ep,或act=dp。抱歉,我应该对此进行更多说明。我仍然没有运气显示页面,因此您的第一个回复。我可能需要清理我的网站,看看周围有哪些额外的杂项可能会导致它无法清理。我宁愿让我所有的开关都关闭一个页面,用于传递的 2-4 个变量。会尝试 bobtheasian 的想法,看看是否有帮助。
【解决方案2】:

site.com/admin.php?page=blogger&act=dp/ep/ap

你不能那样做。特别是act=dp/ep/ap。我会推荐 mod_rewrite 和多个 $_GET 的组合,这样你就可以像 WordPress 那样做:

site.com/admin/blog/edit

Mod_rewritten to:

site.com/admin.php?page=blog&act=edit

从那里你只需要使用 $_GET 并且只有一个 switch 与依赖项。

 $page = $_GET['page']; 
 $action = $_GET['act'];

  switch ($page) {  
    case 'blog':  
          do($action);  
      break;  
    case 'news':  
          do($action);
      break;  
    case 'users':  
          do($action);
      break;  
    default: echo 'Try again.';
      break;
    }

    function do($act) {
     switch($act) {
       case 'delete': confirmDelete();
       break;
       case 'update': updateConfirm();
       break;
       }
    }

你明白了。

【讨论】:

  • 我很喜欢这个想法,让它更简洁,而且在一个页面上。我可能误读了您,但我的意思不是 act=dp/ep/ap,只是为了澄清一下,它们是 act=dp 或 act=ep 或 act=ap。但我确实喜欢这个主意..会玩弄它..谢谢你的主意
  • 我也假设没有 E_NOTICE 我会在 $page 和 $action 上得到未定义的错误,如果它们不是首先设置的,对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多