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

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']))的代码块内,这样只有提交表单后才会执行树生成逻辑,不会出现变量未定义的情况。

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('&nbsp;',$h) . '*' . str_repeat('&nbsp;', $h) . "<br>";

        for ($i = 0; $i < $h ; $i++) {
          // 修正参数顺序,输出星号后加换行
          echo str_repeat('*', $i+1) . "<br>";
        }
    }
?>
</body>
</html>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 12:27:03