2016-11-04 3 views
0

У нас есть старая версия CakePHP, что мы переехали на новый сервер PHP 5.6, и мы начали Получать эту ошибку при добавлении продукта в корзину:Нелегальная строка смещения PHP 5.6

предупреждение (2): Illegal строка смещения '' AddBasketData [APP/контроллеры/personalisation_controller.php, строка 848]

Вот строка 848 в файле:

if (is_array($this->data['AddBasketData'])) { 
    $personalisation_data['Personalise'] = $this->data['AddBasketData']; 
}else { 
     $personalisation_data['Personalise'] = array(); 
} 

Может ли кто-нибудь пролить свет на это, я думаю, что это до определенной версии PHP, в которой мы сейчас работаем, но любая помощь будет отличной.

Благодаря

+0

Что делает 'var_dump ($ this-> data);' return? – roberto06

+0

Hi roberto Я получаю: string (4) «skip». – WebDevB

+0

Тогда это проблема, '$ this-> data' не является' array', а 'string', поэтому вы не можете получить доступ к смещению' AddBasketData'. – roberto06

ответ

0

Как отметил @ roberto06 в комментариях к вашему вопросу, почему вы получаете ошибку, потому что вы пытаетесь лечить строковое значение как массив.
Причина этого конкретного сообщения об ошибке заключается в том, что вы можете использовать обозначение смещения массива для извлечения одного символа из строки. Как и в строковых массивах C. Но это поддерживает только числовые индексы, а не строковый индекс, как показано в коде, который вы опубликовали.

Теперь простой способ остановить возникшую ошибку - просто проверить тип данных и определить, действительно ли данный индекс существует.
Как так:

if (is_array ($this->data) && !empty ($this->data['AddBasketData'])) { 
    $personalisation_data['Personalise'] = $this->data['AddBasketData']; 
} else { 
    $personalisation_data['Personalise'] = array(); 
} 

Однако, видя, как вы не вдруг получаю эту ошибку после обновления намекает на что-то еще является проблемой. Тем более, что введенный вами код ожидает, что значение, хранящееся в индексе Personalise, будет массивом. Я проследил бы, где член $this->data будет установлен и изменен, чтобы узнать, можете ли вы найти основную причину, почему это кажущееся изменение в поведении. В конце концов, это может быть побочным эффектом более гнусной тонкой ошибки.

+0

Это еще вызовет предупреждение о смещении, вы должны сначала проверить 'is_array ($ this-> data)'. – roberto06

+0

@ roberto06 А, спасибо, что сообщили мне: Ошибка копирования-пасты. Исправлен пример кода. :) – ChristianF

0

Преобразование мои комментарии в ответ:

Проблема здесь, кажется, что $this->data является string и не array. Вы должны проверить это первое, а затем проверить, если смещение AddBasketData существует, и, наконец, если смещение AddBasketData является array:

if (is_array($this->data) && isset($this->data['AddBasketData']) && is_array($this->data['AddBasketData'])) { 
    $personalisation_data['Personalise'] = $this->data['AddBasketData']; 
} else { 
    $personalisation_data['Personalise'] = array(); 
} 

Конечно, это будет только исправить симптомы (что поднятое предупреждение), вам может потребоваться некоторая отладка кода, чтобы выяснить, почему $this->data является string вместо array.