2010-12-20 99 views
2

我在此代码的第3,6和7行中收到未定义索引“id”的通知。我想不通,我做错了什么:未定义的索引错误(PHP)

if (isset($_POST['action']) && $_POST['action'] == 'save') { 
    foreach ($options as $value) { 
     if(($value['type'] === "checkbox" or $value['type'] === "multiselect") and is_array($_REQUEST[ $value['id'] ])) 
      { $_REQUEST[ $value['id'] ]=implode(',',$_REQUEST[ $value['id'] ]); //This will take from the array and make one string 
      } 
     $key = $value['id']; 
     $val = $_REQUEST[$key]; 
     $settings[$key] = $val; 
    } 

我想这是解决一个小的事情,但还没有与任何东西我已经试过所有的运气。我做的一件事是运行var_dump($ key),有时$ key是空的,有时不是。所以我假设它与此有关。顺便说一下,这是WordPress主题的选项页面的一部分。这是作为“保存”功能的一部分运行的代码。

如果调试模式关闭,脚本实际上可以正常工作,但是当调试模式打开时,当点击选项页面上的保存按钮时,弹出这些通知。预先感谢任何见解,并让我知道是否需要发布更多代码以提供更多上下文。

编辑:我已经在pastebin中发布了选项页面。它的长。它包含t13lo的修复程序。该问题的代码是在线1957感谢:http://pastebin.com/NGX6qzgr

+0

我认为你应该从我这里得到一个退步,第一行是什么? – ajreal 2010-12-20 17:37:11

+0

对不起,我不明白“一行是干什么”的意思......我做错了什么?你问第一行是什么?它应该是保存选项......我也是编程新手,所以如果我做了一些非常愚蠢的事情,请告诉我! – orbit82 2010-12-20 17:39:23

+0

@ orbit82 - isset'? – ajreal 2010-12-20 17:40:58

回答

1

您可以更改第3行:

if (($value['type'] === "checkbox" || $value['type'] === "multiselect") && isset($_REQUEST['id']) && is_array($_REQUEST[ $value['id'] ])) 

然而,在你的foreach你的代码的其余部分似乎取决于$value['id']。此值并不总是被设置,因此它可能使这些线路:

$key = $value['id']; 
$val = $_REQUEST[$key]; 
$settings[$key] = $val; 

不着边际的话$value['id']未设置。如果是这种情况,将当前在foreach中的所有代码放在if (isset($value['id'])) {之内可能是合适的。

您需要进一步分析和理解代码(以及需要做)以确定正确的逻辑。

+0

感谢您的建议,@ webbiedave和@Mathias E,但它没有任何作用。我得到相同的错误... – orbit82 2010-12-20 17:48:12

+0

@ orbit82:我编辑过。 – webbiedave 2010-12-20 17:50:56

+0

非常感谢您的建议。我尝试将foreach块放在if(isset [$ value ['id'])中,并且在停止这些错误的同时,不管是否设置,这些选项都不再保存到数据库中。有没有办法来检查是否已经设置了一个选项,但无论如何保存它?为什么在没有isset检查的情况下它能够正常工作,但是它不适用于isset检查? – orbit82 2010-12-20 18:16:09

0

试试这个:

if(($value['type'] === "checkbox" || $value['type'] === "multiselect") && isset($value['id']) && is_array($_REQUEST[ $value['id'] ])){ ... 
+0

3次后期... – 2010-12-20 17:40:31

1

不知道你的代码是假设做,但基于您已经发布了什么给这个一杆..(更换显然只是的foreach循环的一部分代码)..

foreach ($options as $value) { 
    if(!isset($value['id'])) 
     continue; 
    if(!isset($_REQUEST[$value['id']])) { 
     $settings[$value['id']] = ''; 
     continue; 
    } 
    if($value['type'] === "checkbox" || $value['type'] === "multiselect") { 
     // No isset check here, the top conditional catches non-set items 
     if(is_array($_REQUEST[$value['id']])) 
      $_REQUEST[$value['id']] = implode(',', $_REQUEST[$value['id']]); 
    } 
    $settings[$value['id']] = $_REQUEST[$value['id']]; 
} 

应该做完全像以前一样,有异常检查瓦尔首先设置,在$设置数组中的值也设置为空字符串时匹配$ _REQUEST VAR ISN” t设置..(假设我跟着什么代码正在做的是)..

编辑:继意见讨论中,我已经更新上面的代码中,应该确定在1957年线这是有道理的,该键不为你的代码中设置的通知,并非所有的数组项$options实际上是选项,一些是指在你的主题的选项页面上获得输出的标题/选项卡(无论什么)(所以在上面的循环中跳过它们是有意义的)。

我认为这样可以解决您的问题,但是我曾经说过,我认为指出该函数中的代码并不理想,整个存储机制看起来并没有很好地整体消毒。我倾向于建议将该页面所需的功能设置为manage_options,因此它至少在管理员被限制到可以实施替换之前(建议应该在单独的问题中,并且理想地在WPSE上)。

+0

哇,谢谢这个差不多的作品! if(!isset($ _REQUEST [$ value ['id']])){ $ settings [$ value ['id']] =除非我保存,我得到一个警告, ''; 继续; } 该代码是WordPress主题选项面板的一部分。这部分代码负责将选项保存到数据库。通过调试模式保存时,通知显示。 – orbit82 2010-12-20 20:26:43

+0

好吧,那么可以很容易地修复,但选项保存正确吗? – t31os 2010-12-20 22:13:50

+0

嘿,感谢您的帮助,但我解决了这个问题!我会用修复程序更新问题! – orbit82 2010-12-21 18:54:40