PHP从HTML获取参数绘制圣诞树遇变量未定义及循环异常问题
问题修复方案
1. 「Undefined variable: h」报错解决
- 报错原因:
$h仅在表单提交成功的if(isset($_GET['submit']))代码块内定义,页面首次加载未提交表单时,后续代码调用$h就会触发未定义报错。 - 修复方案二选一:
- 方案1:在if判断前提前给
$h设置默认值,比如$h = 3;(默认树高为3) - 方案2:把生成圣诞树的所有逻辑(包括
$line = $h、星星输出、for循环输出树身)全部放到if(isset($_GET['submit']))的代码块内,这样只有提交表单后才会执行树生成逻辑,不会出现变量未定义的情况。
- 方案1:在if判断前提前给
2. for循环与换行问题修复
- 问题1:
str_repeat参数顺序写反,PHP的str_repeat(要重复的字符串, 重复次数),你写的str_repeat($i, '*')逻辑完全颠倒,要改成str_repeat('*', $i+1)(因为i从0开始计数,第一行要输出1个*所以加1) - 问题2:HTML里换行不需要用
nl2br,直接在每行星号输出后拼接<br>标签即可实现换行。 - 问题3:顶部星星输出后没有加换行,会和第一行树身内容连在一起。
另外补充几个代码小问题:
- input标签没有
int类型,正确类型为number,可加min和max属性限制输入范围3-12 - 表单内的
echo = "xxx"写法错误,直接输出文本即可 - 装饰判断部分你switch用的变量是定义的符号变量
$candle,不是用户提交的选择变量$candles,且每次直接给$decorations赋值字符串会覆盖之前的内容,改成数组追加更合理
修复后完整代码
<html> <head><title>Christmas Tree Shop</title></head> <body> <form> How long a tree would you like to buy (3-12)? <input type="number" name="height" placeholder="Height (3-12)" min="3" max="12"> <br> <br> <select name="candle" placeholder="candles (í) "> <option>Yes</option> <option>No</option> </select> <select name="bauble" placeholder="baubles (@) "> <option>Yes</option> <option>No</option> </select> <select name="pretzel" placeholder="pretzels (&) "> <option>Yes</option> <option>No</option> </select> <button type="submit" name="submit">Purchase</button> </form> <p>Here is your tree!</p> <?php $candle = "í"; $bauble = "@"; $pretzel = "&"; // 提前给变量设置默认值避免未定义报错 $h = 0; $candles = "No"; $baubles = "No"; $pretzels = "No"; if(isset($_GET['submit'])){ $h = intval($_GET['height']); $candles = $_GET['candle']; $baubles = $_GET['bauble']; $pretzels = $_GET['pretzel']; } $decorations = array(); if ($candles == "Yes"){ $decorations[] = "í"; } if ($baubles == "Yes"){ $decorations[] = "@"; } if ($pretzels == "Yes"){ $decorations[] = "&"; } // 仅当获取到合法树高时才生成圣诞树 if($h > 0){ $line = $h; $star = 1; // 顶部星星输出后加换行标签 echo str_repeat(' ',$h) . '*' . str_repeat(' ', $h) . "<br>"; for ($i = 0; $i < $h ; $i++) { // 修正参数顺序,输出星号后加换行 echo str_repeat('*', $i+1) . "<br>"; } } ?> </body> </html>
内容的提问来源于stack exchange,提问作者Suvi Salo
相关产品推荐
相关产品推荐

