未定义的索引错误(PHP)

时间:2010-12-20 17:32:39

标签: php wordpress

我在这段代码的第3,6和7行收到了未定义索引“id”的注意事项。我无法弄清楚我做错了什么:

    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是null,有时候不是。所以我假设它与此有关。

顺便说一句,这是WordPress主题的选项页面的一部分。这是作为“保存”功能的一部分运行的代码。

如果关闭调试模式,脚本实际上可以正常工作,但是当调试模式打开时,当按下选项页面上的保存按钮时会弹出这些注意事项。提前感谢任何见解,如果我需要发布更多代码以提供更多上下文,请告诉我。

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

3 个答案:

答案 0 :(得分: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'])) {中可能是合适的。

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

答案 1 :(得分: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']];
}

应该与之前完全相同,除了检查变量首先设置,同时在$ settings数组中将值设置为空字符串时,匹配的$ _REQUEST var未设置..(假设我' m遵循代码正确的做法,即...)

编辑: 在评论中进行了讨论后,我更新了上面的代码,这应该修复1957行的通知。有意义的是,不为代码设置该密钥,并非$options中的所有数组项都是实际选项,有些是指在主题选项页面上输出的标题/标签(无论如何)(所以在上面的循环中跳过它们是有意义的。)

我认为这样可以解决您的问题,但我已经说过,我认为重要的是要指出该功能中的代码并不理想,整个保存机制整体看起来并不是很好。我倾向于建议将该页面的所需功能设置为manage_options,因此它至少限制在管理员之前,直到可以实施替换为止(建议应该在单独的问题中,理想情况下)在WPSE)。

答案 2 :(得分:0)

试试这个:

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