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

使用输出缓冲生成PHP文件时,HTML内嵌PHP代码未保留

问题

我有一个表单,提交后会将数据存入数据库。点击按钮时,PHP代码会生成一个新的PHP页面,该页面应展示刚上传至数据库的内容。目前数据存入、文件生成均正常,但生成的文件内容是普通文本而非PHP代码。

相关简化代码如下:

// 向数据库提交数据的PHP代码(篇幅过长,此处省略)
// 生成页面的代码(已大幅简化)

<?php

$filename = "../Recipes/".$_POST["name"].".php"; // 来自HTML表单的输入
$recipefile = fopen($filename, "w") or die("Unable to open file!");

ob_start();
?>

<!doctype html>
<html>
<head>
</head>
<body>
  
  <?php
  function display(){
    $con = mysqli_connect("localhost", "root", "", "cookbook");

    $product = "pizza";
    $sql = "SELECT * FROM product WHERE name = '$product'";
    $res = mysqli_query($con,$sql);

    while($row = mysqli_fetch_assoc($res)) {
        $name = $row['name'];
        $description = $row['description'];

        echo $name;
        echo "<br>";
        echo $description;
        echo "<br>";
    }

    mysqli_close($con);
  }

  if ($_SERVER['REQUEST_METHOD'] === 'POST'){ 
      display(); 
  }                    
        
  ?>

</body>
</html>

<?php
$pagecode = ob_get_clean();
ob_flush();

fwrite($recipefile, $pagecode);
fclose($recipefile);
?>

注:$product = "pizza";是占位符,先不考虑动态值的问题。

目前生成的pizza.php内容如下:

// pizza.php
<!doctype html>
<html>
<head>
</head>
<body>
  pizza<br>This is a very good pizza<br>
</body>
</html>

期望生成的文件body内保留完整的PHP代码(即display()函数),而非仅显示文本输出,该如何解决?

解决方案

核心问题是你使用了ob_start()/ob_get_clean()捕获内容,这会让PHP直接执行中间的代码并输出结果,而非保留代码本身。要解决这个问题,需要直接构建包含PHP代码的字符串,避免PHP解析执行这段代码。

修改后的代码示例

<?php
$filename = "../Recipes/".$_POST["name"].".php";
$recipefile = fopen($filename, "w") or die("Unable to open file!");

// 使用NOWDOC语法(单引号包裹的HEREDOC),让PHP完全不解析内部内容
$pagecode = <<<'EOT'
<!doctype html>
<html>
<head>
</head>
<body>
  
  <?php
  function display(){
    $con = mysqli_connect("localhost", "root", "", "cookbook");

    $product = "pizza";
    $sql = "SELECT * FROM product WHERE name = '$product'";
    $res = mysqli_query($con,$sql);

    while($row = mysqli_fetch_assoc($res)) {
        $name = $row['name'];
        $description = $row['description'];

        echo $name;
        echo "<br>";
        echo $description;
        echo "<br>";
    }

    mysqli_close($con);
  }

  if ($_SERVER['REQUEST_METHOD'] === 'POST'){ 
      display(); 
  }                    
        
  ?>

</body>
</html>
EOT;

fwrite($recipefile, $pagecode);
fclose($recipefile);
?>

关键说明

  • 使用<<<'EOT'(NOWDOC)语法,PHP会原封不动保留所有内部内容,不会解析变量或执行代码,完美满足你保留PHP代码的需求。
  • 如果后续需要将$product替换为动态值,可以去掉单引号使用普通HEREDOC,然后在字符串中插入变量,例如$product = "{$_POST['name']}";。
  • 注意NOWDOC的结束标记EOT;必须单独占一行,顶格书写,前后不能有任何空格或字符,否则会触发语法错误。

修改后生成的pizza.php文件会完整保留你需要的PHP代码,而非执行后的文本输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:29:10