【问题标题】:PHP: Notice: Notice (8): Uninitialized string offsetPHP:注意事项:注意事项(8):未初始化的字符串偏移量
【发布时间】:2014-08-25 09:45:57
【问题描述】:

我收到此错误消息

Notice: Notice (8): Uninitialized string offset: 39

经常出现在这一行:

if(isset($getCity) && !empty($getCity)) $city = '/'.Inflector::slug($getCity[$this->request->params['named']['city']]); else $city = '';

我试图了解我收到此消息的原因并添加了调试日志

CakeLog::write('activity', 'getCity '.print_r($getCity, true).'===>'.$this->request->params['named']['city'] );

日志文件输出看起来总是这样:

Activity: getCity {"39":"Montuiri"}===>39

什么告诉我 $getCity 是一个带有 result => {"39":"Montuiri"} 的数组 并且$this->request->params['named']['city'] 不是空的并且有一个value => 39

那么是什么导致了通知消息?我真的不明白如何解决这个问题,因为这些消息每天都会写满我的调试日志......

【问题讨论】:

  • 调试时使用 var_dump 而不是 print_r。通知中提到了 string 偏移量。尝试将其类型转换为整数
  • 尝试利用“现代”CakePHP 特性而不是避免它。不要使用命名参数,使用查询字符串和查询()访问它。如果必须使用命名参数,请先检查是否存在:!empty($this->request->params['named']['city']) 等。

标签: php cakephp


【解决方案1】:

您可以将构造 $foobar[15] 应用于数组和字符串。如果是数组,则返回索引为15 的数组元素,如果是字符串,则返回请求的数字位置处的字母(本例中为第 16 位,因为计数从零开始)。

如果您收到消息“未初始化...偏移量”,则表示您正在请求不存在的数组或字符串的一部分。

虽然根据日志输出,$getCity 是一个数组,但 PHP 错误消息清楚地表明您在某些时候试图访问字符串的第 40 个字母。

可能是代码有一个分支/循环,其中数组变量被覆盖为字符串,然后再次运行上述行,导致错误。

【讨论】:

    【解决方案2】:

    如果以下任何变量实际上是字符串或 null 而不是数组,则会发生此错误。

    试试这个,我不确定它是否适合你,但试试这个

       if(is_array($getCity) && !empty($getCity)) 
       {
        $city = '/'.Inflector::slug($getCity[$this->request->params['named'] 
        ['city']]); else $city = '';
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2012-09-21
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多