【问题标题】:Warning: Illegal string offset in PHP 5.4 [duplicate]警告:PHP 5.4 中的非法字符串偏移 [重复]
【发布时间】:2013-04-22 06:16:34
【问题描述】:

我今天升级到 PHP 5.4,收到一些奇怪的警告:

Warning: Illegal string offset 'quote1' in file.php on line 110
Warning: Illegal string offset 'quote1_title' in file.php on line 111

这些行是这部分代码:

for($i = 0; $i < 3; $i++) {
    $tmp_url = $meta['quote'. ($i+1)];
    $tmp_title = $meta['quote' . ($i+1) .'_title'];

    if(!empty($tmp_url) || !empty($tmp_title)) {
        $quotes[$src_cnt] = array();
        $quotes[$src_cnt]['url'] = $tmp_url;
        $quotes[$src_cnt]['title'] = $tmp_title;
        $src_cnt++;
    }
}

所以$tmp_url 和$tmp_title 行。

为什么我会收到这个奇怪的警告,解决办法是什么?

更新:

此代码用作 Wordpress 插件。 $meta 包括:

$meta = get_post_meta($post->ID,'_quote_source',TRUE);

所以我怀疑每当引号字段为空时,都会出现此警告。当字段为空时,有什么办法可以解决这个问题?

【问题讨论】:

  • quote1_title 和 quote1 在 $meta 数组中不存在。你能告诉我们你的 $meta 内容吗?
  • var_dump($meta) 显示什么?它可能不是一个数组。
  • 这是一个 Wordpress 网站的插件:$meta = get_post_meta($post-&gt;ID,'_quote_source',TRUE);
  • 消息很清楚($meta 是一个字符串,而不是一个数组),Marc 的提示 (var_dump()) 是确定的方法。代码属于未公开的 Wordpress 插件这一事实并没有改变这一点,因为 Wordpress 插件也是 PHP 代码。
  • 在引用字段中没有写入任何内容的页面上执行var_dump($meta) 时,它会显示NULL。这是我收到警告的时候。但是,在已填写报价字段的页面上,它可以正常工作。我该如何解决这个问题?

标签: php string warnings


【解决方案1】:

您需要确保$meta 实际上是数组类型。警告明确告诉您,$meta 似乎是 string 而不是 array

Illegal string offset
        ^^^^^^

为避免此错误,您还可以检查所需的字段

for($i = 0; $i < 3; $i++) {
    if ( !is_array($meta) || !array_key_exists('quote'. ($i+1), $meta) ){
         continue;
    }
    // your code
}

【讨论】:

  • 在引用字段中没有写入任何内容的页面上执行var_dump($meta) 时,它会显示NULL。这是我收到警告的时候。但是,在已填写报价字段的页面上,它可以正常工作。我该如何解决这个问题?
  • 在之前检查 null:isset($meta['quote'. ($i+1)]) 或 array_key_exists('quote'. ($i+1), $meta)
  • 你能否用这个建议更新你的答案。
  • 我已经相应地更新了答案
  • 另外,使用这个插件的其他人似乎也遇到了同样的错误,如果你看到这个帖子:wordpress.org/support/topic/…建议在运行for循环之前添加if(!empty)调用。这就是我们在这里所做的,对吗?
【解决方案2】:

如果$meta 是null,只要没有数据要处理:

if( !is_null($meta) ){
    for($i = 0; $i < 3; $i++) {
        // ...
    }
}

如有必要,您应该能够进行更多检查。这取决于 get_post_meta() 函数旨在返回什么。

【讨论】:

  • 看来其他人对这个插件也有同样的问题:wordpress.org/support/topic/… 在该线程中,建议在运行 for 循环之前添加 if(!empty) 调用。您能否通过此修复更新您的答案,我会接受它是正确的。
  • 请随意回答您自己的问题,Stack Overflow 实际上鼓励这样做。但如果$meta 为空,我的答案应该没问题。
  • 奇怪的是,MatthiasLaug 的解决方案有效。感谢您的努力。
  • 这并不奇怪。它们是解决同一问题的无穷无尽的方法。这就是我进行更多检查的意思:您需要根据get_post_meta() 可以返回的内容进行或多或少的检查。试着理解你得到的每一个答案,并使用对你更有意义的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2013-04-11
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多