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
相关产品推荐
相关产品推荐

