0

A custom field extension is added to a blog plugin causing this error "Fatal error: Uncaught Error: Cannot use string offset as an array" I'm using PHP7 I tried to use array_key_exists() but this didn't solve the error it accidentally disabled the extension

public function getCustomFields()
  {
    $cfData = getXML(BLOGCUSTOMFIELDS);
    $cf = array('options' => '', 'main' => '');
    $count_options = 0;
    $count_main = 0;
    $count_opt = 0;
    foreach($cfData->item as $custom_field)
    {
      if($custom_field->area == 'options')
      {
        $cf['options'][$count_options]['key'] = (string) $custom_field->desc;
        $cf['options'][$count_options]['label'] = (string) $custom_field->label;
        $cf['options'][$count_options]['type'] = (string) $custom_field->type;
        $cf['options'][$count_options]['value'] = (string) $custom_field->value;
        if ($custom_field->type == "dropdown") 
        {
          $count_opt = 0;
          $cf['options'][$count_options]['options'] = array();
          foreach ($custom_field->option as $option) 
          {
            $cf['options'][$count_options]['options'][] = (string) $option;
            $count_opt++;
          }
        }
        $count_options++;
      }
      elseif($custom_field->area == 'main')
      {
        $cf['main'][$count_main]['key'] = (string) $custom_field->desc;
        $cf['main'][$count_main]['label'] = (string) $custom_field->label;
        $cf['main'][$count_main]['type'] = (string) $custom_field->type;
        $cf['main'][$count_main]['value'] = (string) $custom_field->value;
        if ($custom_field->type == "dropdown") 
        {
          $count_opt = 0;
          $cf['main'][$count_main]['options'] = array();
          foreach ($custom_field->option as $option) 
          {
            $cf['main'][$count_main]['options'][] = (string) $option;
            $count_opt++;
          }
        }
        $count_main++;
      }
    }
    return $cf;
  }

According to the error it's referring to

$cf = array('options' => '', 'main' => '');

Your help is much appreciated.

EDIT: Dumping the XML File

object(SimpleXMLExtended)#483 (1) { ["item"]=> array(8) { [0]=> object(SimpleXMLExtended)#484 (4) { ["area"]=> string(7) "options" ["desc"]=> string(4) "slug" ["label"]=> string(8) "Slug/URL" ["type"]=> string(4) "text" } [1]=> object(SimpleXMLExtended)#485 (4) { ["area"]=> string(7) "options" ["desc"]=> string(4) "tags" ["label"]=> string(32) "Tags (separate tags with commas)" ["type"]=> string(4) "text" } [2]=> object(SimpleXMLExtended)#486 (4) { ["area"]=> string(7) "options" ["desc"]=> string(4) "date" ["label"]=> string(25) "Publish date (any format)" ["type"]=> string(4) "text" } [3]=> object(SimpleXMLExtended)#487 (4) { ["area"]=> string(7) "options" ["desc"]=> string(8) "category" ["label"]=> string(30) "Assign This Post To A Category" ["type"]=> string(8) "dropdown" } [4]=> object(SimpleXMLExtended)#488 (4) { ["area"]=> string(7) "options" ["desc"]=> string(6) "author" ["label"]=> string(14) "Author's Name:" ["type"]=> string(4) "text" } [5]=> object(SimpleXMLExtended)#489 (4) { ["area"]=> string(7) "options" ["desc"]=> string(7) "private" ["label"]=> string(15) "Post is private" ["type"]=> string(8) "checkbox" } [6]=> object(SimpleXMLExtended)#490 (4) { ["area"]=> string(4) "main" ["desc"]=> string(5) "title" ["label"]=> object(SimpleXMLExtended)#492 (0) { } ["type"]=> string(5) "title" } [7]=> object(SimpleXMLExtended)#491 (4) { ["area"]=> string(4) "main" ["desc"]=> string(7) "content" ["label"]=> object(SimpleXMLExtended)#493 (0) { } ["type"]=> string(8) "textarea" } } }

7
  • Could you explain $cfData = getXML(BLOGCUSTOMFIELDS); a bit? Commented Aug 15, 2018 at 0:53
  • Are you sure with that (string) $option; because it can be array defined in foreach loop with any key like $option[xxx] ?? It look like $option is an array and can not be typed to string. And you should see row number where error was occured. Commented Aug 15, 2018 at 0:53
  • @IncredibleHat it's a flat file CMS saving data in XML file instead of DB the CMS is called GetSimpleCMS get-simple.info so here it's querying the data from the XML file related to BLOGCUSTOMFIELDS section Commented Aug 15, 2018 at 0:57
  • @daremachine the row number is 25 - 30 this one $cf['options'][$count_options]['key'] = (string) $custom_field->desc; till $cf['options'][$count_options]['value'] = (string) $custom_field->value; Commented Aug 15, 2018 at 0:58
  • Ok. Because, just copy pasting your code into a test script, I'm not seeing that fatal error (making up some output for getXML). Soooo I'm not sure why you are getting that error too! Commented Aug 15, 2018 at 0:59

2 Answers 2

1

Change
$cf = array('options' => '', 'main' => '');
to
$cf = array('options' => array(), 'main' => array());

The error says that

Fatal error: Uncaught Error: Cannot use string offset as an array

Your code is wrong because you are trying add new key into $cf['options'] but it is string and not array

$cf['options'][$count_options] .....
Sign up to request clarification or add additional context in comments.

Comments

1

Since the release PHP 7.1+, is not more possible to initialize an array witrh As of PHP 7.1.0, applying the empty index operator on a string throws a fatal error. Formerly, the string was silently converted to an array.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.