从$\u GET提交的PHP值不适用于回显数组
我有一个php页面,它从$\u GET中获取一个值,并根据该值在多维数组中选择不同的值从$\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
$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实际上也能正常工作,即使这是草率的。希望这有帮助!