使用输出缓冲生成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
相关产品推荐
相关产品推荐

