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

PHP中如何通过单条SQL查询获取游戏库存表不同道具的数量值

问题原因分析
  • UNION ALL查询的结果集只会保留第一个SELECT语句定义的列名,你执行的查询返回的每一行只会存在airorbqty这一个字段,Fire Orb的数量不会存入fireorbqty字段,导致取值时字段不存在报错
  • 你代码中读取数组的键名末尾多了空格:$row['airorbqty ']、$row['fireorbqty '],和查询定义的别名不一致,也会导致取值失败
  • 补充说明:你使用的mysql_*系列函数是PHP早已废弃的扩展,存在安全风险,建议替换为mysqli或PDO扩展,同时使用参数化查询避免SQL注入风险
正确实现方案

第一步:单条SQL查询获取两个道具数量

使用条件聚合语法,一次查询直接返回两个道具的数量作为不同字段:

SELECT 
  SUM(CASE WHEN itemname = 'Air Orb' THEN itemqty ELSE 0 END) AS airorbqty,
  SUM(CASE WHEN itemname = 'Fire Orb' THEN itemqty ELSE 0 END) AS fireorbqty
FROM inventories 
WHERE username = ? 
  AND itemname IN ('Air Orb', 'Fire Orb')

第二步:PHP查询代码实现(以mysqli为例,含参数化查询)

// 初始化mysqli连接
$conn = new mysqli('数据库地址', '账号', '密码', '数据库名');
// 参数化查询防止SQL注入
$stmt = $conn->prepare("SELECT 
  SUM(CASE WHEN itemname = 'Air Orb' THEN itemqty ELSE 0 END) AS airorbqty,
  SUM(CASE WHEN itemname = 'Fire Orb' THEN itemqty ELSE 0 END) AS fireorbqty
FROM inventories 
WHERE username = ? 
  AND itemname IN ('Air Orb', 'Fire Orb')");
$stmt->bind_param('s', $username);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

$airqty = $row['airorbqty'];
$fireqty = $row['fireorbqty'];

echo "air orbs: " . $airqty . " Fire Orbs: " . $fireqty;

第三步:技能释放判断+库存扣减逻辑

// 火焰攻击消耗配置
$costAir = 1;
$costFire = 2;

if ($airqty >= $costAir && $fireqty >= $costFire) {
    // 开启事务避免并发场景下库存超扣
    $conn->begin_transaction();
    try {
        // 扣减Air Orb库存
        $stmt1 = $conn->prepare("UPDATE inventories SET itemqty = itemqty - ? WHERE username = ? AND itemname = 'Air Orb'");
        $stmt1->bind_param('is', $costAir, $username);
        $stmt1->execute();
        // 扣减Fire Orb库存
        $stmt2 = $conn->prepare("UPDATE inventories SET itemqty = itemqty - ? WHERE username = ? AND itemname = 'Fire Orb'");
        $stmt2->bind_param('is', $costFire, $username);
        $stmt2->execute();
        // 提交事务
        $conn->commit();
        echo "火焰攻击释放成功";
    } catch (Exception $e) {
        // 异常回滚
        $conn->rollback();
        echo "技能释放失败,请重试";
    }
} else {
    echo "道具不足,无法释放火焰攻击";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 09:06:03