$ _GET与switch语句
我有很多定义页面的用户会看到,例如用于获取值的“个人资料”我将显示个人资料页等..
找出页面显示我试图做这样的事情:
switch ($_GET) {
case 'profile':
require_once('function/profile.php');
break;
case 'team':
require_once('function/team.php');
break;
,但它没有显示出结果..
我发送这样的GET请求:index.php的配置文件,例如..
什么这里的问题是什么,我怎样才能设法做类似的工作。先谢谢你!
为了让你的榜样的工作,你可以用key($_GET)
更换$_GET
要知道,虽然key()
将返回的第一关键一个数组,所以如果你改变你的URL的变量顺序,这条线会停止运行。
多数民众赞成在惊人的,谢谢! – 2012-04-19 23:47:00
不客气:) – stewe 2012-04-19 23:48:50
谢谢!太棒了!从来没有那样。这种方法有什么不好吗? – 2014-01-27 19:39:24
它是一个数组,所以你需要使用一个循环迭代的值:
foreach($_GET as $key => $val){
switch ($key) {
case 'profile':
require_once('function/profile.php');
break;
case 'team':
require_once('function/team.php');
break;
}
}
这应该是foreach($ _ GET为$ key => $ val),然后切换($ key),谢谢,帮助我很多.. – 2012-04-19 23:41:28
再次检查,我指定'key => value' – Michelle 2012-04-19 23:43:57
$ _GET是一个超级全局变量,其中作为存储阵列中的数据被发送。所以,你必须把它利用 进入指数
假设你您要包括在数据都是这样发送的页面页面:
domain.com?page=product
然后,你必须使用开关这样
switch($_GET['page']) {
....
}
注意:可能我没有提醒你这个代码对注射是多么的脆弱。
对此的任何评论投票? – Starx 2012-04-19 23:37:29
$_GET
是根据URL的查询字符串填充的数组或变量。你需要做的是这样的:
switch ($_GET['myVar']) { ... }
在您的URL看起来像:
http://www.domain.com/index.php?myVar=value
欲了解更多信息,请参阅PHP Manual for $_GET。
用foreach你可以得到键值对
foreach ($_GET as $switchkey => $switchval) {
switch ($switchkey) {
case 'profile':
require_once('function/profile.php');
break;
case 'team':
require_once('function/team.php');
break;
}
}
这应该是foreach($ _GET为$ key => $ val),然后切换($ key),谢谢,帮了我很多.. – 2012-04-19 23:41:10
该死的我30秒太慢了。 :) – user1289347 2012-04-19 23:44:39
$ _GET是从查询字符串中找到的键值对(脚本名称和问号之后的部分url)中的数组。
例如,查询字符串test=1&foo=bar
将转化为:
Array(
test => 1
foo => 'bar'
)
在OP例子,index.php?profile
,你会结束了一个$ _GET数组,如:
Array(
profile => null
)
问题与做这样的网址是非标准的。当你以非标准的方式做事情时,你必须想出解决问题的非标准解决方案。
以下是与每个人都有问题,沿着几个选项:
您可以使用
$_SERVER['QUERY_STRING']
这将让你在URL中?
后的一切。如果在URL中传递的唯一东西只是profile
(或其他单个值),这很好。在这种情况下,$_SERVER['QUERY_STRING']
将只有profile
。但是你也失去了在get字符串中传递额外参数的能力。您可以使用@stewe描述的方法。 php key函数将从传入的数组中的当前位置返回键。如果没有执行任何循环,则当前位置是第一个元素。这对于多个get参数也可以很好地工作。您的查询字符串将看起来像
index.php?profile&test=1&foo=bar
。问题是profile
(或任何页面)必须是第一个或其他键将返回传递的第一个参数的密钥。另一种选择是使用键和值的标准方法。无论页面如何,您都使用相同的密钥,只是数值发生变化。然后您的网址看起来像
index.php?page=profile
,您可以随时使用$_GET['page']
访问该网页。可以使用mod_rewrite。安装很简单,大多数主机都支持它(或者其他一些类似的东西),并且有数以百万计的教程和例子来说明如何让它起作用。您最终会使用最干净的网址,并且它可以与查询字符串参数一起使用。例如,/profile/
可以重写为指向/index.php?page=profile
。用户看到/profile/
和php看到标准。这使您可以使用$_GET['page']
来获取请求的页面,而不必额外解析以获取php内的其他值。
+1替代方案和警告,但为什么传递空值查询字符串元素将是非标准的?我同意你必须特权重写,但在某些情况下,它是过度的。 你可以使用像'switch(true){case in_array('profile',array_keys($ _ GET)):...; break;}'这样的东西来解决“总是处于第一位”问题 – Capsule 2014-01-31 10:24:23
@胶囊恕我直言,它是非标准的,因为你使用的密钥作为价值。我的意思是说它通常没有完成就是非标准的。我并不是说这是错误的,但通常当你需要围绕一个简单的内置代码解决方案时,它是非标准的。为了对付您的交换机,如果您有多个与页面名称相匹配的密钥,您将受到它们在交换机中出现的顺序的限制。 – 2014-01-31 17:44:09
你只需要知道这一点,并使用我以前的评论中提出的那种开关,但是,我明白你的意思。如果你只想测试'if(isset($ _ GET ['profile'])){...}',那么只有“短”键的URL在交换机之外很方便。在这种情况下,订单无关紧要。 – Capsule 2014-02-03 11:17:36
$ _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');
}
我想我不是唯一一个称它为页面的人。在php.ini中,你也可以使用选择器。我们让它在生产之前建立了像'index.php?page-> home'这样的网址。老板并不认为这很有趣。 – r3wt 2014-02-02 07:41:20
实际上我用下面的产生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');
}
正如前面提到的,这似乎浮现在脑海中的第一件事就是传递信息的非标准方式。这在解析数值时会产生一些困难。虽然对我来说,主要问题不是检查/清除/清理$ _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的想法,在记录日志之后检查你是否期望得到你想要的并丢弃其余部分。
您正试图以错误的方式存档SEO网址。
我看到index.php?profile
比index.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
而不是开启密钥(按键($ _ GET)建议)您可以定义一个变量,以$ _GET(url)命名,例如命名为'action',它将包含'profile'或'team'或任何你希望的未来。那么你的开关,简单来说,将是:
switch ($_GET['action'])
所以你分配给该键的任何行动,你可以作为一个案例在你的交换机使用
可你打电话的print_r($ _ GET),并显示是什么印? – 2014-02-03 15:26:05