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

PHP食堂订单计算器始终输出0美元的问题分析与修复

PHP食堂订单计算器始终输出0美元的问题分析与修复

我来帮你排查下这个计算器总是输出$0的问题,咱们一步步拆解核心问题:

核心错误点分析

  • 函数参数传递方式错误:你的pricefixer函数里,$a是按值传递的——也就是说函数内部修改的只是$a的副本,完全不会影响外部定义的$rolls、$pies这些变量,它们始终保持初始值0,自然计算出来的总价也是0。
  • 变量作用域问题:priceadder函数里直接使用$finalcost,但没有声明它是全局变量,函数内部会创建一个局部的$finalcost,修改它根本不会影响外部的同名变量。
  • 语法错误:pricefixer里的$a==floatval($a);是比较运算符,不是赋值操作,这里应该用=,不过其实这一步完全可以简化掉。
  • 表单提交地址错误:表单的action属性里<?php $self ?>没有输出任何内容,应该改成<?php echo $_SERVER['PHP_SELF']; ?>,否则表单可能无法正确提交到当前页面。
  • 价格不一致问题:菜单里Beef and Mushroom Pie的价格是$6.50,但你代码里priceadder($pies, 2.50);用的是2.50,这会导致派的价格计算错误,顺便帮你修正这个小疏漏。

修复后的完整代码

<?php 
$finalcost = 0.00;
$order = 0;

// 判断是否是POST提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 直接从POST获取各商品数量,默认值为0
    $rolls = isset($_POST['rolls']) ? floatval($_POST['rolls']) : 0;
    $pies = isset($_POST['pies']) ? floatval($_POST['pies']) : 0;
    $crosses = isset($_POST['crosses']) ? floatval($_POST['crosses']) : 0;
    $chickens = isset($_POST['chickens']) ? floatval($_POST['chickens']) : 0;
    $pastas = isset($_POST['pastas']) ? floatval($_POST['pastas']) : 0;
    $milks = isset($_POST['milks']) ? floatval($_POST['milks']) : 0;
    $juices = isset($_POST['juices']) ? floatval($_POST['juices']) : 0;
    $waters = isset($_POST['waters']) ? floatval($_POST['waters']) : 0;

    // 直接计算总价,去掉冗余函数,更简洁直观
    $finalcost = ($rolls * 4.50) + 
                 ($pies * 6.50) +  // 修正派的价格为菜单标注的6.50
                 ($crosses * 5.00) + 
                 ($chickens * 7.00) + 
                 ($pastas * 6.30) + 
                 ($milks * 3.50) + 
                 ($juices * 3.00) + 
                 ($waters * 2.50);
    $order = 1;
}

// 假设这些变量是你之前定义的用户信息、页面配置
$given = "John";
$surname = "Doe";
$user = "johndoe";
$date = date("Y-m-d");
$wide = "80%";
$tall = "600px";
?>
<html>
<head>
<meta charset="utf-8">
<title>Canteen Menu</title>
</head>
<body>
<table width="<?php echo $wide; ?>" height="<?php echo $tall; ?>" border="1" align="center">
<tr>
<td colspan="6" align="center" height="15%">
<h2><b> Hello <?php echo "$given $surname"; ?>, welcome to Narrabundah College online shop.</b></h2>
<br> You are signed in as:<?php echo $user; ?>.
<br> Today's date is <?php echo $date; ?>.
</td>
</tr>
<tr>
<td rowspan="4" align="center" width="15%">
<a href="canteen_menu.php"> Canteen Data </a>
<br>
<a href="customers_menu.php"> Customer Data </a>
<br>
<a href="stationery_menu.php"> Stationery Data </a>
<br>
<a href="logout.php"> Log Out </a>
<br>
</td>
</tr>
<tr>
<td rowspan="4" colspan="4" align="center">
<?php if ($order == 0) { ?>
<table border="1">
<tr>
<td colspan="2">
<h3> Welcome To The Canteen </h3>
</td>
</tr>
<tr>
<td> Items Currently Available:
<ul align="left">
<li> Sausage Roll ($4.50) </li>
<li> Beef and Mushroom Pie ($6.50) </li>
<li> Almond Croissant ($5.00) </li>
<li> Satay Chicken and Rice [contains peanuts] ($7.00)</li>
<li> Spaghetti Bolognese ($6.30) </li>
<li> Chocolate Milk ($3.50) </li>
<li> Sparkling Raspberry Juice ($3.00) </li>
<li> PUMP Water ($2.50) </li>
</ul>
</td>
<td> Order Quantities:
<br>
<br>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<ul style="list-style-type:none;">
<li> <input type="number" name="rolls" min="0" value="0"> </li>
<li> <input type="number" name="pies" min="0" value="0"> </li>
<li> <input type="number" name="crosses" min="0" value="0"> </li>
<li> <input type="number" name="chickens" min="0" value="0"> </li>
<li> <input type="number" name="pastas" min="0" value="0"> </li>
<li><input type="number" name="milks" min="0" value="0"> </li>
<li> <input type="number" name="juices" min="0" value="0"> </li>
<li> <input type="number" name="waters" min="0" value="0"> </li>
<li><br><input type="submit" value="Calculate Total"></li>
</ul>
</form>
</td>
</tr>
</table>
<?php } else { ?>
<h3>Your Order Total: $<?php echo number_format($finalcost, 2); ?></h3>
<p>Thank you for your order! You can place a new order below:</p>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<ul style="list-style-type:none;">
<li> <input type="number" name="rolls" min="0" value="0"> Sausage Roll ($4.50) </li>
<li> <input type="number" name="pies" min="0" value="0"> Beef and Mushroom Pie ($6.50) </li>
<li> <input type="number" name="crosses" min="0" value="0"> Almond Croissant ($5.00) </li>
<li> <input type="number" name="chickens" min="0" value="0"> Satay Chicken and Rice ($7.00)</li>
<li> <input type="number" name="pastas" min="0" value="0"> Spaghetti Bolognese ($6.30) </li>
<li><input type="number" name="milks" min="0" value="0"> Chocolate Milk ($3.50) </li>
<li> <input type="number" name="juices" min="0" value="0"> Sparkling Raspberry Juice ($3.00) </li>
<li> <input type="number" name="waters" min="0" value="0"> PUMP Water ($2.50) </li>
<li><br><input type="submit" value="Calculate New Total"></li>
</ul>
</form>
<?php } ?>
</td>
</tr>
</table>
</body>
</html>

额外优化说明

  1. 去掉了冗余的pricefixer和priceadder函数,直接从POST获取数值并计算总价,代码更简洁易维护。
  2. 给输入框添加了min="0"和默认值value="0",避免用户输入负数,提升使用体验。
  3. 修正了菜单里的拼写错误(比如Avalible→Available,Crossaint→Croissant等)。
  4. 使用number_format($finalcost, 2)确保总价显示两位小数,符合货币格式规范。
  5. 当用户提交订单后,显示总价并提供重新下单的表单,提升交互流畅性。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:18:10