2013-10-23 40 views
0

变量我有一个这样的代码:所有从URL

session_start(); 

$user = $_GET['user']; 
$mode = $_GET['mode']; 
$id1 = $_GET['id1']; 
$id2 = $_GET['id2']; 
$id3 = $_GET['id3']; 
$id4 = $_GET['id4']; 
$id5 = $_GET['id5']; 
$id6 = $_GET['id6']; 
$id7 = $_GET['id7']; 
$id8 = $_GET['id8']; 

$dep= $mode; 
switch ($dep) 
{ 
    case "3m": 
     $dep = "Text 1"; 
     break; 
    case "all": 
     $dep = "More text"; 
     break; 
    default: 
     $dep = "Text1"; 
} 

还有更多的其他案件。我想我很快会有更多的身份证件和案件。有没有一种更简单的方法可以将URL中的所有ID都推送到PHP代码中进行评估?

我已经找到了代码foreach

foreach($_GET as $key => $value) { 
     echo 'key is: <b>' . $key . '</b>, value is: <b>' .$value. '</b><br />'; 
    } 

而且它还有所有变量从URL,但如何更改代码,才能有这样的:

$variable = $_GET['variable']; 

任何帮助表示赞赏:)

+0

使用表单数组进行研究。如果你用input_name []设置表单域,那么你可以在服务器端循环它们。 – JimL

+0

您是否正在将值放入一个名称为值的变量中?为什么不只是使用数组来处理你打算做的事情? – George

+0

我一定会通过表单数组,thnks。 –

回答

1

假设我理解正确,并且希望所有GET变量都是可以使用的实际变量,那么有一个函数extract即可。

然而,如文档中指出:

不要使用提取物()在不可信数据,如用户输入(即$ _GET, $ _FILES等)。如果这样做,例如,如果您想要运行暂时依赖register_globals的旧代码 ,请确保使用非覆盖标志值(如EXTR_SKIP)中的一个 ,并且要知道 应该按照定义的相同顺序在php.ini中的variables_order 中。

所以基本上你不应该这样做,除非你有充足的理由,并且要小心如果你不要覆盖任何现有的值。

但是,如果你选择的是要做到这一点:

foreach($_GET as $key => $value) { 
     $$key=$value; 
} 

然后提取当然更好,作为一个),你可以将其设置为不覆盖任何现有的变量,和b)你可以有一个前缀,因此可以区分那些导入的变量。就像这样:

extract ($_GET, EXTR_SKIP); 

对于$用户,$模式,$ id,这将不覆盖任何东西,或

extract ($_GET, EXTR_PREFIX_ALL, 'user_input'); 

为$ user_input_mode,$ user_input_user,$ user_input_id等

+0

所以我不会使用它:)但thnks,我会熟悉此功能 –

+0

@ T_5警告并不严格关于此功能,而是关于一般的方法!使用带有EXTR_SKIP的函数比您刚刚接受的答案更安全*,因为它不会覆盖当前变量,您可以将它们放在名称空间中。 – eis

+0

thnks警告,所以你认为你的方法是好的(用EXTR_SKIP提取的那个)或者通过表单数组获取变量,或者可能使用其他方法?我需要获取用户选择的变量并将其推送到代码中,其中一些是PHP,一些MySQL查询(取决于这些变量),然后执行一些图表,结果。 –

2

使用数组,这正是他们的目的。命名的网址,如参数:

id[]=1&id[]=2&... 

然后$_GET['id']是一个数组,你可以很容易地遍历。

许多IDS意味着你正在寻找一个数组ids,不ID1,ID2,ID3的等数组,可以访问他们的虚拟方式$id[1]$id[2]等相同,但没有头痛需要放牧数百个独立变量。

也不需要将$_GET中的每个值分配到它自己的变量中,您可以直接从$_GET使用这些值。通过将它们分配到单个变量中,它们并没有变得更好。

+0

虽然不会帮助用户,模式等。如果这些将被塞进相同的变量,那么它实际上会比迭代'$ _GET'更糟。 – eis

+0

它不需要,每个只有一个。这是特别关于'id1','id2'等 – deceze

+0

这是一个好方法,但我会有更多不同的名称(不仅id []),所以这不会帮助,但thnks :) –

0
function getIDs() 
{ 
    $ids = array(); 

    if(isset($_GET['id'])) 
    { 
     foreach($_GET['id'] as $key => $value) 
     { 
      $ids[$key] = $value; 
     } 
    } 
    return $ids; 
} 

如果你可以让你的URL发送一个id GET参数数组到PHP脚本,你可以在上面的函数中解析$_GET['id']数组,假设URI看起来像?id[]=1&id[]=2&id[]=3

$ids = getIDs(); 
+0

严......你可以用'$ ids = $ _GET ['id']'替换那个循环。 – deceze

+0

@deceze我想告诉他如果'id'在URI中不存在,怎么不发出警告。 –

+0

我在说你可以替换*循环*。你可以离开'isset'。您将所有键和值从一个数组转换到另一个数组......这意味着您正在执行'$ arr1 = $ arr2'的复杂版本。 – deceze

-1

你可以写

foreach($_GET as $key => $value) { 
     $$key=$value; 
    } 

这将每一个键名分配为varibale。

+0

简单而快捷,thnks :) –

+0

不要这样做。它会覆盖代码中的任何匹配变量名称,允许任何人注入任何变量。如果您需要这样做,使用链接的提取物更好。 – eis

+0

eis你能否提出一些有用的解决方案呢?根据问题。 –