如何在PHP的fwrite()函数中写入PHP代码?
问题根源
你遇到的核心问题是双引号字符串会被PHP自动解析内部变量,同时存在引号嵌套冲突的问题,导致代码提前执行或触发语法错误,无法原样写入目标文件。
解决方案
方案1:使用单引号包裹内容
单引号内的变量和特殊字符不会被PHP解析,只需转义字符串内部的单引号(用\')即可:
$fp = fopen('../blogs/' . $url . '.php', 'w'); fwrite($fp, ' <p>This is a paragraph</p> <?php $conn = mysqli_connect(\'server\', \'username\', \'password\', \'database\'); if(!$conn){ echo \'<h3 class="container bg-dark p-3 text-center text-warning rounded-lg mt-5">Not able to establish Database Connection</h3>\'; } // Get data to display on index page $sql = \'SELECT * FROM blog WHERE id = $id\'; $result = $conn->query($sql); while($row = $result->fetch_assoc()){ $content = $row[\'content\']; echo $content; } ?> '); fclose($fp);
方案2:使用NOWDOC语法(推荐)
NOWDOC是PHP专为大段纯文本设计的语法,用<<<'标识'开头、标识;结尾,内部内容完全原样输出,无需转义变量或引号:
$fp = fopen('../blogs/' . $url . '.php', 'w'); $phpCode = <<<'CODE' <p>This is a paragraph</p> <?php $conn = mysqli_connect('server', 'username', 'password', 'database'); if(!$conn){ echo '<h3 class="container bg-dark p-3 text-center text-warning rounded-lg mt-5">Not able to establish Database Connection</h3>'; } // Get data to display on index page $sql = 'SELECT * FROM blog WHERE id = $id'; $result = $conn->query($sql); while($row = $result->fetch_assoc()){ $content = $row['content']; echo $content; } ?> CODE; fwrite($fp, $phpCode); fclose($fp);
方案3:转义双引号内的变量
如果坚持使用双引号,需给所有不想被解析的变量前添加\,同时处理引号嵌套冲突:
$fp = fopen('../blogs/' . $url . '.php', 'w'); fwrite($fp, " <p>This is a paragraph</p> <?php \$conn = mysqli_connect('server', 'username', 'password', 'database'); if(!\$conn){ echo '<h3 class=\"container bg-dark p-3 text-center text-warning rounded-lg mt-5\">Not able to establish Database Connection</h3>'; } // Get data to display on index page \$sql = 'SELECT * FROM blog WHERE id = \$id'; \$result = \$conn->query(\$sql); while(\$row = \$result->fetch_assoc()){ \$content = \$row['content']; echo \$content; } ?> "); fclose($fp);
额外修复点
- 原代码中
$result_->fetch_assoc()多了下划线,已修正为$result->fetch_assoc() - 补充了未闭合的
<h3>标签 - 添加
fclose($fp)确保文件句柄正常关闭,写入操作完成
内容的提问来源于stack exchange,提问作者JohannesDev
相关产品推荐
相关产品推荐

