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

PHP报错Uncaught TypeError: string*string不支持操作数类型排查

问题描述

触发报错信息:

PHP 致命错误:未捕获类型错误:不支持的操作数类型:字符串 * 字符串

报错触发位置为购物车小计计算行,对应代码片段:
$value["shoe_quantity"] * $value["shoe_price"], 2);

关联业务场景为鞋品购物车金额计算:遍历Session中存储的购物车数据,通过商品数量乘以单价计算单项小计与订单总金额时触发上述报错。

根因定位
  • PHP 8.0及以上版本收紧了算术运算的类型校验规则,不再对非数值格式的字符串做隐式类型转换,直接对两个字符串类型值执行乘法运算会直接抛出类型错误。
  • Session中存储的shoe_quantity(商品数量)、shoe_price(商品单价)字段均为字符串格式,若字段写入Session时携带了非数值内容(如价格带$货币符号、数量带单位文字、首尾存在多余空格),会被判定为非合法运算值。
  • 现有代码未对从Session读取的购物车字段做任何格式清洗、类型校验、类型转换,直接传入算术运算逻辑,是报错的核心原因。
修复方案

核心处理逻辑:在执行算术计算前,先对数量、单价字段做格式清洗、类型转换,增加异常值兜底逻辑,替换原有重复的乘法计算代码。修复后的完整业务代码如下:

<?php
if(!empty($_SESSION["ShoeCart"])){
    $total = 0;
    foreach ($_SESSION["ShoeCart"] as $key => $value) {
        // 清洗转换商品数量:强制转为整型
        $shoeQuantity = (int)trim($value["shoe_quantity"]);
        // 清洗转换商品单价:过滤非数值字符、保留小数位后转为浮点型
        $shoePrice = (float)filter_var(trim($value["shoe_price"]), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
        // 异常值兜底:非法值统一置为0,避免负金额、计算异常
        $shoeQuantity = $shoeQuantity > 0 ? $shoeQuantity : 0;
        $shoePrice = $shoePrice > 0 ? $shoePrice : 0;
        $subtotal = $shoeQuantity * $shoePrice;
        ?>
        <tr>
            <td><?php echo $value["shoe_name"]; ?></td>
            <td><?php echo $shoeQuantity; ?></td>
            <td><?php echo number_format($shoePrice, 2); ?></td>
            <td><?php echo number_format($subtotal, 2); ?></td>
            <td><a href="ShoeCart.php?action=delete&ShoeID=<?php echo $value["shoe_id"]; ?>"><span
                        class="text-danger">Remove Item</span></a></td>
        </tr>
        <?php
        $total += $subtotal;
    }
    ?>
    <tr>
        <td colspan="3" align="right">Total</td>
        <th align="right">$ <?php echo number_format($total, 2); ?></th>
        <td></td>
    </tr>

修复点说明:

  • 对读取到的字段先做trim()处理,清除首尾多余空格,避免空格导致的格式判定异常
  • 商品数量强制转为整型,商品单价过滤非数值字符后转为浮点型,从根源解决字符串类型无法参与乘法运算的问题
  • 增加异常值兜底逻辑,若数量、单价为负数或非法值,自动置为0,避免出现负金额、计算报错
  • 提前计算单项小计金额,替换原有两处重复的乘法计算逻辑,减少代码冗余,降低后续维护成本

内容的提问来源于stack exchange,提问作者Horalo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 00:01:24