You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:55:22