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>
额外优化说明
- 去掉了冗余的
pricefixer和priceadder函数,直接从POST获取数值并计算总价,代码更简洁易维护。 - 给输入框添加了
min="0"和默认值value="0",避免用户输入负数,提升使用体验。 - 修正了菜单里的拼写错误(比如
Avalible→Available,Crossaint→Croissant等)。 - 使用
number_format($finalcost, 2)确保总价显示两位小数,符合货币格式规范。 - 当用户提交订单后,显示总价并提供重新下单的表单,提升交互流畅性。
内容来源于stack exchange
相关产品推荐
相关产品推荐

