我们有一个旧版本的CakePHP,我们已经转移到运行PHP 5.6的新服务器上,我们已经开始在向篮子中添加产品时收到此错误:
警告(2):非法字符串偏移'AddBasketData' [APP / controllers / personalisation_controller.php,第848行]
以下是文件中的第848行:
if (is_array($this->data['AddBasketData'])) {
$personalisation_data['Personalise'] = $this->data['AddBasketData'];
}else {
$personalisation_data['Personalise'] = array();
}
任何人都可以对此有所了解,我认为这取决于我们现在运行的特定PHP版本,但任何帮助都会很棒。
由于
答案 0 :(得分:0)
正如@ roberto06在您的问题评论中所指出的,您收到错误的原因是因为您正在尝试将字符串值视为数组。
出现该特定错误消息的原因是您可以使用数组偏移表示法从字符串中获取单个字符。就像你在C&C的字符串数组中一样。但是这只支持数字索引,而不是你发布的代码中显示的字符串索引。
现在,阻止错误发生的简单方法是简单地测试数据的类型,以及给定的索引是否确实存在。
如此:
if (is_array ($this->data) && !empty ($this->data['AddBasketData'])) {
$personalisation_data['Personalise'] = $this->data['AddBasketData'];
} else {
$personalisation_data['Personalise'] = array();
}
然而,看到你在更新后没有突然收到此错误提示其他问题。特别是因为您发布的代码要求Personalise
索引中存储的值为数组。我会追踪$this->data
成员设置和更改的位置,看看是否可以找到导致此行为明显变化的根本原因。毕竟,这可能是一个更邪恶的微妙错误的副作用。
答案 1 :(得分: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
而不是{{1}的原因}}