【问题标题】:Illegal string offsets非法字符串偏移
【发布时间】:2018-03-20 17:08:06
【问题描述】:

我已经搜索过,但找不到答案。

tl;dr 我有一个 wordpress 主题,不再得到创建者的支持,我正试图摆脱某些页面顶部弹出的警告文本。我不是程序员,所以我不确定该怎么做,但我确实理解代码足以从其他地方修补补丁。我需要帮助。

这是我得到的:

Warning: Illegal string offset 'group_no' in file1.php on line 196
Warning: Illegal string offset 'order_no' in file1.php on line 196
Warning: Illegal string offset 'group_no' in file1.php on line 200

file1.php的相关代码如下:

function get_location( $location, $post_id )
{
    // loaded by PHP already?
    if( !empty($location) )
    {
        return $location;
    }


    // vars
    $groups = array();
    $group_no = 0;


    // get all rules
    $rules = get_post_meta($post_id, 'rule', false);


    if( is_array($rules) )
    {
        foreach( $rules as $rule )
        {
            // if field group was duplicated, it may now be a serialized string!
            $rule = maybe_unserialize($rule);


            // does this rule have a group?
            // + groups were added in 4.0.4
            if( !isset($rule['group_no']) )
            {
                $rule['group_no'] = $group_no;

                // sperate groups?
                if( get_post_meta($post_id, 'allorany', true) == 'any' )
                {
                    $group_no++;
                }
            }


            // add to group
            $groups[ $rule['group_no'] ][ $rule['order_no'] ] = $rule; // this is line 196


            // sort rules
            ksort( $groups[ $rule['group_no'] ] );

        }

        // sort groups
        ksort( $groups ); //this is line 200
    }


    // return fields
    return $groups;
}

我知道这是某种数组分配错误,但我对 php 不够熟悉,无法理解错误是什么以及如何修复它。在保留功能的同时如何重建此代码以使错误消失?

【问题讨论】:

  • 您的警告表明$rule 是一个字符串,但您正尝试将其作为数组访问
  • 太好了——我该如何解决?
  • 可能在这里maybe_unserialize

标签: php arrays string warnings offset


【解决方案1】:

我不能保证这将修复您的代码的预期目的,但它应该摆脱 Illegal String Offset 错误:

<?php
// Lines 0..194
if (true === is_array($groups)
    && true === key_exists('group_no', $rule)
    && true === key_exists('order_no', $rule)
) {
    // original line 196
    $groups[ $rule['group_no'] ][ $rule['order_no'] ] = $rule; 
}

下面是$groups 是数组时的行为示例:https://eval.in/975271

以下是$groups 为字符串时的行为示例:https://eval.in/975273

两者都没有错误输出!

【讨论】:

    【解决方案2】:

    我不知道究竟是什么构成了代码,但跳出框框思考,我认为您可以禁用任何/所有 WordPress 和 PHP 警报,因为消息是什么你得到的是简单的警告,代码可以继续执行,尽管没有预期的行为。

    您可以尝试在文件开始时添加error_reporting(0) 或直接在php.ini 中禁用。更多信息:

    PD:我知道这个解决方案确实不能解决代码问题,但你现在的目标是消除消息并保持正常的页面外观。

    【讨论】:

      猜你喜欢
      • 2013-09-30
      • 2020-11-29
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多