从$\u GET提交的PHP值不适用于回显数组

从$\u GET提交的PHP值不适用于回显数组,php,arrays,get,multidimensional-array,Php,Arrays,Get,Multidimensional Array,我有一个php页面,它从$\u GET中获取一个值,并根据该值在多维数组中选择不同的值 $data = array( "index" => array( "name" => "title", "title" => "<img src = 'logo.png' alt=''>", "fallback_html" => "main.php", "gallery" => arra

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

$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")
     )
);
我得到了这样的输出

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

如果我将$page值更改为'index'或'gallery1',效果很好

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

$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\u key\u exists,以便逻辑可以处理对不存在的页面或数组索引发出的请求

编辑:另外,数组数据不一致。东安echo$数据['index']['title'];将导致:

<img src = 'logo.png' alt=''>
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[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>";
}

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

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

$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\u key\u exists,以便逻辑可以处理对不存在的页面或数组索引发出的请求

编辑:另外,数组数据不一致。东安echo$数据['index']['title'];将导致:

<img src = 'logo.png' alt=''>
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[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>";
}

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

检查var\u dump给了您什么

var_dump(isset($_GET['p']));
但我建议您创建允许的值数组

$allowed_vals = array_keys($data);
然后使用in_数组函数

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

检查var_dump为您提供了什么

var_dump(isset($_GET['p']));
但我建议您创建允许的值数组

$allowed_vals = array_keys($data);
然后使用in_数组函数

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

$data数组是否与$page处理代码在同一文档中定义?从你的问题上不完全清楚。为了确保这一点,请使用以下方法对$data数组进行调试,以检查该数组是否存在并包含请求的“index”键:

// 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"; 
}
[更新]根据您的最后一行,$data数组应该存在,因此调试$\u GET数组可能是检查它是否包含“p”项和正确值的一个好选项

print_r($_GET);

$data数组是否与$page处理代码在同一文档中定义?从你的问题上不完全清楚。为了确保这一点,请使用以下方法对$data数组进行调试,以检查该数组是否存在并包含请求的“index”键:

// 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"; 
}
[更新]根据您的最后一行,$data数组应该存在,因此调试$\u GET数组可能是检查它是否包含“p”项和正确值的一个好选项

print_r($_GET);
试试这个

  $page = "$_GET['p']";
试试这个

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

当您通过GET访问“p”时,它的值是多少?您有一个逻辑错误。如果用户不请求?p=index,则它将不起作用。@RPM,我在回答中编写了一个过滤器,以解决传递类似“?p=add1saa221ds”的逻辑问题。当您通过GET访问时,“p”的值是多少?您有一个逻辑错误。如果用户不请求?p=index,那么它将不起作用。@RPM,我在回答中编写了一个过滤器,以解决传递诸如“?p=add1saa221ds”之类的逻辑问题。isset仅在存在数组索引且不为空时返回true。这将删除该问题,但如果我将p='gallery1'。。。我没有得到正确的输出检查我在上面的编辑,我在标题中解释了你的内容从一个数组到另一个数组的变化。一个是图像标记,另一个是文本?@WHHelp您不应该在urlI中使用引号。我还修改了过滤逻辑:$raw_page=preg_replace'/[^a-zA-Z0-9]+/',trim$_GET['p'];首先对$_GET['p']这一概念进行修剪,然后去掉任何非字母数字字符。然后,if/else逻辑与更干净的输入一起工作,以查看页面索引是否存在。
这样,您的带有引号的URL实际上也能正常工作,即使这是草率的。希望这有帮助!仅当存在数组索引且不为null时,isset才会返回true。这会消除问题,但如果我将p='gallery1'。。。我没有得到正确的输出检查我在上面的编辑,我在标题中解释了你的内容从一个数组到另一个数组的变化。一个是图像标记,另一个是文本?@WHHelp您不应该在urlI中使用引号。我还修改了过滤逻辑:$raw_page=preg_replace'/[^a-zA-Z0-9]+/',trim$_GET['p'];首先对$_GET['p']这一概念进行修剪,然后去掉任何非字母数字字符。然后,if/else逻辑与更干净的输入一起工作,以查看页面索引是否存在。这样,您的带有引号的URL实际上也能正常工作,即使这是草率的。希望这有帮助!