【问题标题】:PHP value comming from $_GET does not work on echoing an array来自 $_GET 的 PHP 值不适用于回显数组
【发布时间】:2013-01-26 18:53:48
【问题描述】:

我有一个从 $_GET 获取值的 php 页面,并根据该值在多维数组中选择不同的值

$data =
array(
     "index" => array(
         "name" => "title",
         "title" => "<img src = 'logo.png' alt=''>",
         "fallback_html" => "main.php",
         "gallery" => array("1" => "nothing")),
     "gallery1" => array(
         "name" => "gallery1",
         "title" => "Gallery 1",
         "fallback_html" => "",
         "gallery" => array("1" => "jpg1.jpg","2" => "jpg2.jpg")
     )
);

这里是代码

if(isset($_GET['p'])){
  $page = $_GET['p']; 
} 
else { 
  $page = "index"; 
} 

echo $data[$page]['title'];

我得到了这样的输出

Notice: Undefined index: 'index' in D:\xampp\htdocs\egliphp\index.php on line 66

如果我将 $page 值更改为 'index' 或 'gallery1' 就可以了

【问题讨论】:

  • 当你通过 GET 访问时,'p' 的值是多少?
  • 你有一个逻辑错误。如果用户不请求?p=index,那么它将不起作用。
  • @RPM,我在我的回答中编写了一个过滤器,以解决像 `?p=add1saa221ds' 这样的逻辑问题。

标签: php arrays get multidimensional-array


【解决方案1】:

逻辑似乎合理,因此可能是空格和非字母数字字符问题。所以我建议这样做:

$raw_page = preg_replace('/[^a-zA-Z0-9]+/', '', trim($_GET['p']));
if(!empty($raw_page) && array_key_exists($raw_page, $data)){
  $page = $raw_page; 
} 
else { 
  $page = "index"; 
}

我还添加了一个array_key_exists,以便逻辑可以处理对不存在的页面或数组索引发出的请求。

编辑:另外,您的数组数据不一致。董安echo $data['index']['title'];会导致:

<img src = 'logo.png' alt=''>

但是执行echo $data['gallery1']['title']; 会导致:

Gallery 1

所以我认为你也需要解决这个问题。

编辑关于混合数组值的附加信息: 好的,从编程的角度来看,数组对值$data['title'] 具有混合值类型的方式仍然存在问题。我认为这是一个等待发生的问题。所以我建议重新修改 $data 数组结构:

$data =
array(
     "index" => array(
         "name" => "title",
         "title" => array("type" => "image", "value" => "<img src = 'logo.png' alt=''>"),
         "fallback_html" => "main.php",
         "gallery" => array("1" => "nothing")),
     "gallery1" => array(
         "name" => "gallery1",
         "title" => array("type" => "text", "value" => "Gallery 1"),
         "fallback_html" => "",
         "gallery" => array("1" => "jpg1.jpg","2" => "jpg2.jpg")
     )
);

具体来说,我对具有图像标签的$data["index"]["title"] 做了这个:

"title" => array("type" => "image", "value" => "<img src = 'logo.png' alt=''>"),

这对于有一个文本字符串的$data["gallery1"]["title"]

"title" => array("type" => "text", "value" => "Gallery 1"),

这将帮助您在事物的渲染方面更好地处理每种情况。所以你可以有如下代码:

if ($data["gallery1"]["title"]["type"] == "image") {
  echo $data["gallery1"]["title"]["value"] . "<br clear="all" />";
}
else if ($data["gallery1"]["title"]["type"] == "text") {
  echo "<h1>" . $data["gallery1"]["title"]["value"] . "</h1>";
}

上面的示例表明,如果您在数据源中标记类型,则可以在渲染时对每种类型执行不同的操作。如果你觉得工作量太大,那是公平的。但是,如果没有明确区分它们的方法,在值中混合数据类型绝不是一个好主意。

【讨论】:

  • isset 仅在存在数组索引且不为空时才会返回 true
  • 这消除了问题,但如果我把 p='gallery1' ... 我没有得到正确的输出
  • 检查我上面的编辑,我在title 中解释了您的内容从一个数组更改为另一个数组。一个是图片标签,下一个是文本?
  • @WHHelp 你不应该在网址中使用引号
  • 我还重新设计了过滤逻辑:$raw_page = preg_replace('/[^a-zA-Z0-9]+/', '', trim($_GET['p']));$_GET['p'] 的概念首先是trimmed,然后任何非字母数字字符也会被删除。然后你的if/else 逻辑使用更清晰的输入来简单地查看页面索引是否存在。这样,带有引号的 URL 实际上也可以正常工作,即使这很草率。希望这会有所帮助!
【解决方案2】:

检查 var_dump 给你什么

var_dump(isset($_GET['p']));

但我建议您创建允许值数组

$allowed_vals = array_keys($data);

然后使用 in_array() 函数

if(in_array($_GET['p'], $allowed_vals )){
...
else
....

【讨论】:

    【解决方案3】:

    $data 数组是否与“$page”处理代码定义在同一个文档中? (从你的问题中不完全清楚)。只是为了确定,检查 $data 数组是否存在并包含请求的“索引”键,使用以下调试它:

    // Just to check if the $data array actually exists and contains the 'index' key:
    print_r($data);exit();
    
    if(isset($_GET['p']) && array_key_exists(trim($_GET['p']), $data)){
      $page = trim($_GET['p']); 
    } 
    else { 
      $page = "index"; 
    }
    

    [update] 根据您的最后一行,应该存在 $data 数组,因此调试 $_GET 数组可能是检查它是否包含“p”条目和正确值的好选择;

    print_r($_GET);
    

    【讨论】:

      【解决方案4】:

      试试这个

        $page = "$_GET['p']";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-14
        相关资源
        最近更新 更多