5

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

为了找出要显示的页面,我尝试做这样的事情:

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

但它没有显示任何结果..

我这样发送 GET 请求:例如 index.php?profile ..

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

4

11 回答 11

9

为了使您的示例正常工作,您可以替换$_GETkey($_GET)

请注意,虽然这key()将返回数组的第一个键,因此如果您更改 URL 的变量顺序,此行将停止运行。

于 2012-04-19T23:24:45.237 回答
8

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

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

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

在 OP 示例中index.php?profile,您将得到一个 $_GET 数组,如:

Array(
    profile => null
)

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

以下是一些选项以及每个选项都有的问题:

  1. 您可以使用$_SERVER['QUERY_STRING']which 将?在 url 之后为您提供所有内容。如果在 url 中传递的唯一内容只是profile(或其他一些单一值),这很好。在那种情况下,除了它$_SERVER['QUERY_STRING']什么都没有profile。但是您也会失去在获取字符串中传递其他参数的能力。

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

  3. 另一种选择是只使用使用键和值的标准方法。无论页面如何,您都使用相同的键,只是值发生了变化。然后你就有了看起来像的 url,index.php?page=profile你可以随时使用$_GET['page'].

  4. 您可以使用mod_rewrite。它的设置很简单,大多数主机都支持它(或其他类似的),并且有数百万关于如何让它工作的教程和示例。您最终会得到最干净的 url,并且它适用于查询字符串参数。例如,/profile/可以重写为指向/index.php?page=profile. 用户看到/profile/了,php 看到了标准。这使您可以使用$_GET['page']来获取请求的页面,而不必进行额外的解析来获取 php.ini 中的其他值。

于 2012-04-19T23:25:52.487 回答
5

$_GET是基于 URL 的查询字符串填充的数组或变量。您需要执行以下操作:

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

您的 URL 如下所示:

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

有关更多信息,请参阅$_GET 的 PHP 手册

于 2012-04-19T23:22:09.387 回答
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');
}
于 2014-01-27T21:51:50.447 回答
1

它是一个数组,因此您需要使用循环来迭代值:

foreach($_GET as $key => $val){
    switch ($key) {
        case 'profile':
            require_once('function/profile.php');
            break;
        case 'team':
            require_once('function/team.php');
            break;
    }
}
于 2012-04-19T23:21:55.747 回答
1

$_GET 是一个超级全局变量,其中数据以数组形式存储。所以你必须使用索引来访问它

假设您在发送数据时尝试包含一个页面,如下所示:

domain.com?page=product

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

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

注意:也许我不必提醒您此代码对注入的脆弱性。

于 2012-04-19T23:21:56.043 回答
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;
  }
}
于 2012-04-19T23:22:23.383 回答
0

我实际上在正常获取导致 lfi/rfi 漏洞后使用以下内容。以下解决方案是通过错误赏金计划提交给我的,效果很好。注意包含default属性。很重要。以下应该是唯一可以接受的答案。归功于飞行的意大利面怪物(他的面条附属物)

                    switch($_GET['page']) {

                        case 'foo':

                            include('pages/foo.php');

                            break;

                        case 'bar':

                            include('pages/bar.php');

                            break;
                        default:

                            include('pages/home.php');

                    }
于 2014-02-02T07:39:15.883 回答
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 的想法,以检查你是否得到了你期望的结果,并在记录后丢弃其余部分。

于 2014-02-02T09:44:22.287 回答
0

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

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

您应该使用index.php?page=profile然后应用重写规则来创建 SEO url,如下所示:

RewriteEngine On

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

这样,您的用户将使用:

http://example.com/profile

显示的页面将是:

http://example.com/index.php?page=profile
于 2014-02-03T08:10:42.810 回答
0

您可以在 $_GET (url) 中定义一个变量,而不是打开键(如 key($_GET) 所建议的那样),例如“action”,其中包含“profile”或“team”或任何您希望的变量未来。那么你的开关,简单地说,就是:

switch ($_GET['action'])

所以无论你分配给这个键的什么动作,你都可以在你的开关中使用

于 2014-02-03T14:54:59.300 回答