未定义索引错误(PHP)

未定义索引错误(PHP),php,wordpress,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($_

在这段代码的第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主题选项页面的一部分。这是作为“save”函数的一部分运行的代码

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


编辑:我已经在pastebin中发布了选项页面。很长。它包含t13lo的修复程序。问题代码在第1957行。谢谢:

您可以将第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']){
中可能是合适的

为了确定正确的逻辑,您需要进一步分析和理解代码正在(和需要)做什么。

尝试以下方法:

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

不知道你的代码应该做什么,但是根据你所发布的内容,试一下……(显然只替换代码的foreach循环部分)

除了先检查变量是否已设置外,应与之前完全相同,在未设置匹配的$\u请求变量时,还应将$settings数组中的值设置为空字符串..(假设我遵循代码正确执行的操作)

编辑:在评论中的讨论之后,我更新了上面的代码,这应该可以修复第1957行的通知。不为代码设置该键是有意义的,并非所有的数组项都是选项,
$options
中的数组项实际上都是选项,有些引用了标题/选项卡(无论什么),它们可以在主题的选项页面上获得输出(因此在上面的循环中跳过它们是有意义的)


我认为这将解决您的问题,但我认为重要的是要指出,该功能中的代码并不理想,整个保存机制总体上看起来没有得到很好的净化。我倾向于建议将该页面所需的功能设置为
manage\u options
,因此它仅限于administrationOR至少在这样的时候可以安排一个替代者(建议应该在一个单独的问题中,最好是on)。

我认为你应该得到我的否决票,第一行是什么?对不起,我不明白你说的“第一行是什么”是什么意思…我做错什么了吗?你是在问第1行是做什么的吗?它应该是用来保存选项的…我也是编程新手,所以如果我做了一些非常愚蠢的事情,请告诉我!对不起,你能再详细一点吗?我是新手,哈哈!@orbit82,你有三个左大括号,但只有两个右大括号。@Geoffrey Van Wyk-我没有“不要发布所有代码,只发布相关代码,这样就可以解释缺少的右括号。感谢您的建议,@webbiedave和@Mathias E,但没有任何效果。我收到了相同的错误…谢谢,非常感谢您的建议。我试着将foreach块放在if中(isset[$value['id'))虽然这阻止了错误,但选项不再保存到数据库中,不管它们是否已设置。有没有办法检查选项是否已设置,但不管发生什么都保存它?为什么没有isset检查它可以正常工作,但isset检查不起作用?@orbit82,也许你可以发布选项表单,以便e可以在我们的计算机上测试它。我可以发布整个表单,但它可能不会自行运行,因为它需要在wordpress环境中运行。不过,我只在pastebin中发布表单,这样您就可以看到整个表单(警告:它太长了)@Geoffrey Van Wyk,我已经编辑了我的问题,添加了完整代码的链接。哇,谢谢,这几乎奏效了!除了在保存时,我收到一条警告,说明这行上的索引id未定义:if(!isset($_REQUEST[$value['id']]){$settings[$value['id']='';continue;}这段代码是WordPress主题选项面板的一部分。这部分代码负责将选项保存到数据库。在启用调试模式的情况下保存时会显示通知。好的,这很容易修复,但是选项是否正确保存?嘿,谢谢你的帮助,但我已经解决了问题!我将使用修复更新问题!Updated我的回答,在第1957行添加了错误修复,以及一些一般性评论,很乐意在任何情况下提供帮助……)
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']];
}