【问题标题】:Undefined index errors (PHP)未定义的索引错误 (PHP)
【发布时间】:2010-12-20 17:32:39
【问题描述】:

我在此代码的第 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 为空,有时不是。所以我假设它与这个有关。

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

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

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

【问题讨论】:

  • 我认为你值得我投反对票,第 1 行是做什么的?
  • 对不起,我不明白你所说的“第一行是做什么的”是什么意思......我做错了什么吗?您是在问第 1 行是做什么的吗?应该是保存选项...我也是编程新手,所以如果我做了一些非常愚蠢的事情,请告诉我!
  • 很抱歉,您能提供更多细节吗?我是新手,哈哈!
  • @orbit82,你有三个左大括号,但只有两个右大括号。
  • @Geoffrey Van Wyk - 我没有发布所有代码,只发布了相关代码,以便解释缺少的右括号。

标签: php wordpress


【解决方案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'])) { 中可能是合适的。

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

【讨论】:

  • 感谢@webbiedave 和@Mathias E 的建议,但没有任何效果。我得到同样的错误......
  • 非常感谢您的建议。我尝试将 foreach 块放在 if(isset[$value['id']) 中,虽然这停止了错误,但无论是否设置了选项,它们都不再保存到数据库中。有没有办法检查选项是否已设置,但无论如何都要保存它?为什么没有isset检查它可以正常工作,但不能使用isset检查?
  • @orbit82,也许您可​​以发布选项表格,以便我们可以在我们的计算机上对其进行测试。
  • 我可以发布整个表单,但它可能不会单独运行,因为它需要在 wordpress 环境中。不过,我只会在 pastebin 中发布表格,所以也许你可以看到整个内容(警告它很长)。
  • @Geoffrey Van Wyk,我已经编辑了我的问题以包含指向完整代码的链接。
【解决方案2】:

不知道您的代码应该在做什么,但根据您发布的内容试一试..(显然只是替换代码的 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']];
}

应该做的和以前完全一样,除了首先检查 vars 是否被设置,当匹配的 $_REQUEST var 没有设置时,还将 $settings 数组中的一个值设置为一个空字符串..(假设 i' m 遵循代码正确执行的操作)..

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

我认为这将解决您的问题,但我认为重要的是要指出该函数中的代码并不理想,整个保存机制看起来并没有得到很好的清理。我倾向于建议将该页面所需的功能设置为manage_options,因此它仅限于管理员,至少在可以放置替代品之前(建议应该在一个单独的问题中,最好在@ 987654321@).

【讨论】:

  • 哇,谢谢这几乎可以工作了!除了保存时,我收到一条警告,指出此行上未定义索引 id: if( !isset( $_REQUEST[$value['id']] ) ) { $settings[$value['id']] = ' ';继续;代码是 WordPress 主题选项面板的一部分。这部分代码负责将选项保存到数据库。在打开调试模式保存时会显示通知。
  • 好的,这很容易解决,但是选项保存正确吗?
  • 嘿,感谢您的帮助,但我已经解决了这个问题!我将通过修复更新问题!
  • 更新了我的答案,添加了对第 1957 行错误的修复,以及一些通用的 cmets,无论如何都很乐意提供帮助.. ;)
【解决方案3】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 2016-08-17
    • 2012-05-23
    • 2012-06-27
    • 1970-01-01
    • 2019-04-03
    • 2015-03-06
    • 2018-04-14
    相关资源
    最近更新 更多