PHP 8.0环境下Shopware出现TypeError错误的技术求助
解决PHP TypeError: Cannot access offset of type string on string问题
问题根源
你遇到的错误核心是误解了fetchOne()方法的返回值。在Shopware的数据库连接类中,fetchOne()会直接返回查询结果第一行的第一列值(也就是你SQL里COUNT(*)的结果,类型为字符串,比如'0'或'1'),而不是你预期的关联数组。所以当你尝试用$result['data']去访问一个字符串的数组偏移量时,PHP 8.0+会抛出这个TypeError。
你修改后的代码依然报错,是因为本质问题没解决——$result还是字符串,不是数组,$result['data']的写法从一开始就不成立。
解决方案
1. 直接使用返回的标量值
既然fetchOne()已经返回了COUNT(*)的结果,直接判断这个值即可:
$check = "SELECT COUNT(*) FROM g_product_stream_article WHERE `id_article` = '$IDarticle'"; try { $result = $this->connection->fetchOne($check); // 把字符串转为整数后判断:非0即为存在匹配记录 return (int)$result !== 0; } catch (\Exception $e) { // 建议添加异常处理逻辑,比如返回默认值或记录日志 return false; }
2. 修复SQL注入风险(重要)
你当前的代码直接将$IDarticle拼接到SQL中,存在严重的SQL注入漏洞。Shopware的数据库连接支持参数绑定,应该改为:
$check = "SELECT COUNT(*) FROM g_product_stream_article WHERE `id_article` = :id"; try { $result = $this->connection->fetchOne($check, ['id' => $IDarticle]); return (int)$result !== 0; } catch (\Exception $e) { return false; }
3. 若需返回关联数组(可选)
如果你确实需要获取包含data键的关联数组,可以改用fetchAssoc()方法:
$check = "SELECT COUNT(*) as `data` FROM g_product_stream_article WHERE `id_article` = :id"; try { $result = $this->connection->fetchAssoc($check, ['id' => $IDarticle]); // 此时$result是数组,可正常访问$result['data'] return $result['data'] !== '0'; } catch (\Exception $e) { return false; }
内容的提问来源于stack exchange,提问作者ily.ay
相关产品推荐
相关产品推荐

