【问题标题】:How can I pass this variable and check if it matches?如何传递这个变量并检查它是否匹配?
【发布时间】:2014-02-10 19:23:52
【问题描述】:

我怎样才能纠正/简化这个并将其放入一个数组中?

一个链接正在传递:somelink.php?w=a (or b,c,d)

我希望页面 (somelink.php) 确定是否设置了“w”,如果设置且 var 匹配,则包含指定的页面。

<?php
if(isset($_GET['w'])&&($GET['w'] == "a")){include("1.htm");}
if(isset($_GET['w'])&&($GET['w'] == "b")){include("2.htm");}
if(isset($_GET['w'])&&($GET['w'] == "c")){include("3.htm");}
if(isset($_GET['w'])&&($GET['w'] == "d")){include("4.htm");}
else{include("1.htm");}
?>

【问题讨论】:

  • 基本上,这用于动态数量的链接,每个链接的“w”变量不同(a、b、c、x、y、z 等)并对应于不同的页面( a.htm、b.htm、c.htm、x.htm、y.htm、z.htm 等)在侧导航栏中告诉容器页面包含相应的内容。如果我没有道理,我很抱歉。我有阅读障碍,这只是我的头脑,但我正在努力。
  • 如果你要到 Z 我会停止这种方法并开始使用数据库查看 CMS。您当前的方法适用于少量文件,但适用于大量文件
  • 链接数小于10,但可以更改。

标签: php variables get isset


【解决方案1】:

尝试使用:

$w = $_GET['w'];
if(isset($w)) {
    switch(strtolower($w)) {
        case "a":
            include("1.htm");
        break;
        case "b":
            include("2.htm");
        break;
        case "c":
            include("3.htm");
        break;
        case "d":
            include("4.htm");
        break;
        default:
            include("not-found.htm");
        break;
    }
}

【讨论】:

  • w 未设置时,这将创建一个Notice: undefined variable w
  • 它可以工作.. 有点.. 但每次只提取默认值(not-found.htm),而不是任何其他链接。尽管 URI 中有变量。 (page.htm?w=a)
  • @AdamRoper 好的,我已经更新了主要答案,试试吧。
  • 万岁!它完美地工作!你是绝对的宝石! :p 非常感谢!
  • @AdamRoper - 没问题先生 :)
【解决方案2】:

使用 switch 语句:

if(isset($_GET['w']))
{
    switch($_GET['w'])
    {
        case 'a':    include("1.html");   break;
        case 'b':    include("2.html");   break;
        case 'c':    include("3.html");   break;
        case 'd':    include("4.html");   break;
        default:     include("1.html");   break;
    }
} else {
    include("1.html");
}

【讨论】:

  • 太棒了!谢谢!我假设我每次都需要取消设置变量?
  • 应该不需要取消任何设置 :) 由你决定。
  • @AdamRoper 您想取消设置什么变量?为什么?
  • 没关系。只是我试图绕过它(但失败了)。
【解决方案3】:

一个简单的数组怎么样

$x=array('a'=>'1.html','b'=>'2.html');

然后

include $x[$GET['w']];

【讨论】:

  • 如果w 没有设置,或者w 的值不在数组中,这将不起作用。
  • 是的,我知道,这不是一个完整的答案,只是我的首选方法
【解决方案4】:

像这样:

if(isset($_GET['w'])){
    switch($_GET['w']){
        case "a":
            include("1.htm");
        break;
        case "b":
            include("2.htm");
        break;
        case "c":
            include("3.htm");
        break;
        case "d":
            include("4.htm");
        break;
    }
}

但我不会那样做。我会这样做,以便页面的名称对应于从 $_GET 变量中检索到的值。这样你就可以做这样的事情了。

if(!empty($_GET['w'])){
    include($_GET['w'] . ".htm");
}

当然,您也需要对 $_GET 变量进行一些过滤,以确保它不会得到您不想要的东西。也许是这样的。

$acceptable_values = array("some","acceptable","values");
if(!empty($_GET['w']) && in_array($_GET['w'],$acceptable_values) ){
    include($_GET['w'] . ".htm");
}

我相信您知道,将变量直接传递给包含语句或数据库查询是一个可怕的想法。请参阅此处了解在这种情况下的原因。

http://websec.wordpress.com/2010/02/22/exploiting-php-file-inclusion-overview/

【讨论】:

  • 如果你要做一个 $acceptable_values 数组,你也可以直接映射它我另一个贴。
  • 是的,但是有一组可接受的值,它不会允许有人利用 PHP 的 include 函数中存在的漏洞。
  • 我不明白,我的想法也列出了允许的文件,但似乎更容易管理
  • 抱歉,您提交时我显然是在打字。尽管我不同意管理,但有了这个答案,您只需更改一件事即可接受页面上的新文件和链接。另外,语义命名文件比尝试跟踪 1 => a 或 b 或 c 或.....
  • 文件和变量的命名纯粹是为了说明。我并不反对你的答案,它可能是更好和/或更安全的答案,但我选择了一个既有效又在视觉上对我有意义的答案。我的阅读障碍有时使掌握这一切变得有点挑战。但感谢您的意见。
【解决方案5】:

你可以做一些事情,让我们来看看其中的一些。

<?php
$webpage = '';
if(isset($_GET['w']))
  $webpage = strtolower($_GET['w']);

switch($webpage)
{
  case 'b':
    include '2.html';
    break;
  case 'c':
    include '3.html';
    break;
  case 'd':
    include '4.html';
    break;
  default:
    include '1.html';
    break;
}

或者我们可以使用数组

<?php
$webpage = '';
if(isset($_GET['w']))
  $webpage = strtolower($_GET['w']);

$included_pages = array(
  'a' => '1.htm',
  'b' => '2.htm',
  'c' => '3.htm',
  'd' => '4.htm',
);

// Check inside our array
if(array_key_exists($webpage, $includes))
{
  include $included_pages[$webpage];
}
else
{
  // Couldn't find the site
  include '1.htm';
}

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 1970-01-01
    • 2020-12-30
    • 2014-03-05
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多