2012-04-19 48 views
5

我有很多定义页面的用户会看到,例如用于获取值的“个人资料”我将显示个人资料页等..

找出页面显示我试图做这样的事情:

switch ($_GET) { 
    case 'profile': 
     require_once('function/profile.php'); 
     break; 
    case 'team': 
     require_once('function/team.php'); 
     break; 

,但它没有显示出结果..

我发送这样的GET请求:index.php的配置文件,例如..

什么这里的问题是什么,我怎样才能设法做类似的工作。先谢谢你!

+0

可你打电话的print_r($ _ GET),并显示是什么印? – 2014-02-03 15:26:05

回答

9

为了让你的榜样的工作,你可以用key($_GET)

更换$_GET要知道,虽然key()将返回的第一关键一个数组,所以如果你改变你的URL的变量顺序,这条线会停止运行。

+0

多数民众赞成在惊人的,谢谢! – 2012-04-19 23:47:00

+0

不客气:) – stewe 2012-04-19 23:48:50

+0

谢谢!太棒了!从来没有那样。这种方法有什么不好吗? – 2014-01-27 19:39:24

1

它是一个数组,所以你需要使用一个循环迭代的值:

foreach($_GET as $key => $val){ 
    switch ($key) { 
     case 'profile': 
      require_once('function/profile.php'); 
      break; 
     case 'team': 
      require_once('function/team.php'); 
      break; 
    } 
} 
+0

这应该是foreach($ _ GET为$ key => $ val),然后切换($ key),谢谢,帮助我很多.. – 2012-04-19 23:41:28

+0

再次检查,我指定'key => value' – Michelle 2012-04-19 23:43:57

1

$ _GET是一个超级全局变量,其中作为存储阵列中的数据被发送。所以,你必须把它利用 进入指数

假设你您要包括在数据都是这样发送的页面页面:

domain.com?page=product

然后,你必须使用开关这样

switch($_GET['page']) { 
    .... 
} 

注意:可能我没有提醒你这个代码对注射是多么的脆弱。

+0

对此的任何评论投票? – Starx 2012-04-19 23:37:29

5

$_GET是根据URL的查询字符串填充的数组或变量。你需要做的是这样的:

switch ($_GET['myVar']) { ... } 

在您的URL看起来像:

http://www.domain.com/index.php?myVar=value 

欲了解更多信息,请参阅PHP Manual for $_GET

0

用foreach你可以得到键值对

foreach ($_GET as $switchkey => $switchval) { 
    switch ($switchkey) { 
    case 'profile': 
     require_once('function/profile.php'); 
     break; 
    case 'team': 
     require_once('function/team.php'); 
     break; 
    } 
} 
+0

这应该是foreach($ _GET为$ key => $ val),然后切换($ key),谢谢,帮了我很多.. – 2012-04-19 23:41:10

+0

该死的我30秒太慢了。 :) – user1289347 2012-04-19 23:44:39

8

$ _GET是从查询字符串中找到的键值对(脚本名称和问号之后的部分url)中的数组。

例如,查询字符串test=1&foo=bar将转化为:

Array(
    test => 1 
    foo => 'bar' 
) 

在OP例子,index.php?profile,你会结束了一个$ _GET数组,如:

Array(
    profile => null 
) 

问题与做这样的网址是非标准的。当你以非标准的方式做事情时,你必须想出解决问题的非标准解决方案。

以下是与每个人都有问题,沿着几个选项:

  1. 您可以使用$_SERVER['QUERY_STRING']这将让你在URL中?后的一切。如果在URL中传递的唯一东西只是profile(或其他单个值),这很好。在这种情况下,$_SERVER['QUERY_STRING']将只有profile。但是你也失去了在get字符串中传递额外参数的能力。

  2. 您可以使用@stewe描述的方法。 php key函数将从传入的数组中的当前位置返回键。如果没有执行任何循环,则当前位置是第一个元素。这对于多个get参数也可以很好地工作。您的查询字符串将看起来像index.php?profile&test=1&foo=bar。问题是profile(或任何页面)必须是第一个或其他键将返回传递的第一个参数的密钥。

  3. 另一种选择是使用键和值的标准方法。无论页面如何,您都使用相同的密钥,只是数值发生变化。然后您的网址看起来像index.php?page=profile,您可以随时使用$_GET['page']访问该网页。可以使用mod_rewrite。安装很简单,大多数主机都支持它(或者其他一些类似的东西),并且有数以百万计的教程和例子来说明如何让它起作用。您最终会使用最干净的网址,并且它可以与查询字符串参数一起使用。例如,/profile/可以重写为指向/index.php?page=profile。用户看到/profile/和php看到标准。这使您可以使用$_GET['page']来获取请求的页面,而不必额外解析以获取php内的其他值。

+0

+1替代方案和警告,但为什么传递空值查询字符串元素将是非标准的?我同意你必须特权重写,但在某些情况下,它是过度的。 你可以使用像'switch(true){case in_array('profile',array_keys($ _ GET)):...; break;}'这样的东西来解决“总是处于第一位”问题 – Capsule 2014-01-31 10:24:23

+0

@胶囊恕我直言,它是非标准的,因为你使用的密钥作为价值。我的意思是说它通常没有完成就是非标准的。我并不是说这是错误的,但通常当你需要围绕一个简单的内置代码解决方案时,它是非标准的。为了对付您的交换机,如果您有多个与页面名称相匹配的密钥,您将受到它们在交换机中出现的顺序的限制。 – 2014-01-31 17:44:09

+1

你只需要知道这一点,并使用我以前的评论中提出的那种开关,但是,我明白你的意思。如果你只想测试'if(isset($ _ GET ['profile'])){...}',那么只有“短”键的URL在交换机之外很方便。在这种情况下,订单无关紧要。 – Capsule 2014-02-03 11:17:36

2

$ _GET本身对您并不是很有用。我想你正在寻找一个关键字,比如“页面”,对吗?请记住声明一个默认值。

所以..

$page = $_GET['page']; 

switch ($page) { 
    case 'profile': 
    require_once('function/profile.php'); 
    break; 
    case 'team': 
    require_once('function/team.php'); 
    break; 
    default: 
    require_once('function/page-not-found.php'); 
} 
+0

我想我不是唯一一个称它为页面的人。在php.ini中,你也可以使用选择器。我们让它在生产之前建立了像'index.php?page-> home'这样的网址。老板并不认为这很有趣。 – r3wt 2014-02-02 07:41:20

0

实际上我用下面的产生LFI/RFI漏洞正常GET后。以下解决方案通过bug奖励计划提交给我,效果很好。请注意包含default属性。很重要。以下应该是唯一可以接受的答案。信贷的飞行面条怪物(他Noodly附加)

    switch($_GET['page']) { 

         case 'foo': 

          include('pages/foo.php'); 

          break; 

         case 'bar': 

          include('pages/bar.php'); 

          break; 
         default: 

          include('pages/home.php'); 

        } 
0

正如前面提到的,这似乎浮现在脑海中的第一件事就是传递信息的非标准方式。这在解析数值时会产生一些困难。虽然对我来说,主要问题不是检查/清除/清理$ _GET上的数据。可能这太明显了,因为几乎所有的答案都是由似乎知道他们在做什么的人给出的,所以我会假设他们只是没有提到它,因为那个

但请记住,如果你不'不检查它,你很容易受到你的脚本的攻击和故障。损害程度取决于您自己的应用程序,因此不容易预测。

在任何情况下,这是我会做什么,包括HTML

<?php 
    // initialize variables 
    $variable_1 = false; // assume this is the page you want to load 
    $variable_2 = false; 
    $default = 'index.php'; // the idea is to load something controlled by you. index, error, 404, etc. 

    // process $_GET, check, clean and assign values 
    if (isset($_GET) !== false) { 
     foreach ($_GET as $keys => $values) { 
      // check both, $keys and $values for; character set, length, validity against a white list, content 
      // using an if to match the $keys garantees that regardless of the order, you will get what you want 
      if ($keys === 'field_1') { 
       // do what you have to do with this, for instance ... 
       $variable_1 = $values; 
      } 
      if ($keys === 'field_2') { 
       // do what you have to do with this, for instance ... 
       $variable_2 = $values; 
      } 
      unset($_GET[$keys]); 
     } 
     unset ($keys, $values); 
    } 

    // check there are no surprises on $_GET. Load and study anything here 
    if (empty($_GET) === false) { 
     // it should be empty, so log what is in here and prepare your code for that 
     unset($_GET); 
    } else { 
     unset($_GET); 
    } 

    // process the variables according to what you want to do 
    // if there are just a few options, and they are not going to change often 
    // use a switch, otherwise, use a method to check if a file/content exists 
    // for the request and load it. If it doesn't exist, inform the user 
    // with out giving away internals and suggest a new destination 

    // process other variables, here or before this part, wherever makes sense 


?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>testing get</title> 
    </head> 
    <body> 
     <form method="get" action="test_get_00.php" accept-charset="utf-8"> 
      <p><label for="field_1">write something<input type="text" id="field_1" name="field_1" /></label></p> 
      <p><label for="field_2">write something<input type="text" id="field_2" name="field_2" /></label></p> 
      <p><button type="submit">send</button></p> 
     </form> 
    </body> 
</html> 

当然,你可以做一些事情,但如果你正确地准备你的形式,包括字符集,你有更少的担心,或至少有几个更多的已知元素。这不是失败的,但它有帮助。

此外,我上面提到的机制工作在白名单的心态上,这是foreach的想法,在记录日志之后检查你是否期望得到你想要的并丢弃其余部分。

0

您正试图以错误的方式存档SEO网址。

我看到index.php?profileindex.php?page=profile更好,但在这种情况下这是行为的错误方式。

您应该使用index.php?page=profile,然后应用重写规则创建的搜索引擎优化的URL,像这样的:

RewriteEngine On 

RewriteRule ^(.*)$ index.php?page=$1 

这样,您的用户将使用:

http://example.com/profile 

和显示页面会成为:

http://example.com/index.php?page=profile 
0

而不是开启密钥(按键($ _ GET)建议)您可以定义一个变量,以$ _GET(url)命名,例如命名为'action',它将包含'profile'或'team'或任何你希望的未来。那么你的开关,简单来说,将是:

switch ($_GET['action']) 

所以你分配给该键的任何行动,你可以作为一个案例在你的交换机使用