PHP循环生成内容调用file_put_contents写入仅保留最后值问题
问题根因
循环内对$etage使用赋值运算符=,每次迭代都会覆盖上一轮存储的值,循环结束后变量仅保留最后一次迭代生成的内容。同时超长双引号字符串内嵌多层转义字符、变量,也容易出现解析错误。
修复方案
- 提前初始化存储楼层配置的变量,循环中使用拼接运算符
.=追加每一轮生成的配置内容,不要直接覆盖变量 - 使用PHP的heredoc语法组装大段JS内容,避免多层引号嵌套导致的转义混乱
- 对用户传入的POST参数做基础校验和转义,避免生成的JS出现语法错误或恶意注入问题
- 补全缺失的
session_start()调用,否则$_SESSION的存值逻辑不会生效
修复后的完整代码如下:
<?php // 启用SESSION,原代码缺失这一行会导致SESSION存值失效 session_start(); // 对传入参数做类型校验和转义 $floor = intval($_POST['floor']); $xmlpath = addslashes($_POST['xml']); $_SESSION["floor"] = $floor; // 初始化楼层配置,先存入底层rdc的配置 $etagesContent = "'rdc': { 'a': 'rdc.png', 'b': 'rdc_b.png', 'v': '0' },"; // 循环拼接所有楼层配置,使用.= 追加内容而非覆盖 for ($x = 1; $x <= $floor ; $x++) { $etagesContent .= "'r$x' : { 'a': 'r$x.png', 'b': 'r${x}_b.png', 'v': '$x' },"; } // 使用heredoc语法组装完整JS内容,无需额外转义内部双引号 $jsContent = <<<JS var appConfig = { 'helpwindow': { 'active': false, 'background': '#ffffff', 'text': '#333333', 'title': 'Aide', 'content': 'Naviguer autour de la résidence en saisissant avec la souris et en la faisant tourner <img src = "images/hand_icon.png" style = "vertical-align:middle;height:18px;"/><br/>Zoomer / dézoomer en utilisant les boutons <img src = "images/zooms.png" style = "vertical-align:middle;height:18px;"/><br/>Rechercher un bien en cliquant sur l\'icône <img src = "images/menu.png" style = "vertical-align:middle;height:18px;"/>' }, 'mainmenu': { 'background': '#ffffff', 'width': '160px', 'borderwidth': '2px', 'bordercolor': '#000000' }, 'margins': '30px', 'xmlPath': '$xmlpath', 'imagesPath': 'images', 'plansPath': '', 'photo_link': '', 'play_link': '', 'types': { 'active': true, 'items': { } }, 'etages_display': 'block', 'etages': { $etagesContent }, 'logos_padding': '10px', 'logos': { }, 'images': { 'aerial_4': 'aerial4.png', 'aerial_4_b': 'aerial4_b.png', 'aerial_5': '', 'aerial_5_b': '', 'photo': '', 'play': '', 'compass': 'compass.png', 'zoom_minus': 'zoom_minus.png', 'zoom_plus': 'zoom_plus.png', 'zoom_button': 'zoombutton.png', 'left': 'left.png', 'right': 'right.png', 'zoomin': 'zoomin.png', 'zoomout': 'zoomout.png', 'fullscreen': 'fullscreen.png', 'autorotate': 'autorotate.png', 'menu': 'menu.png', 'menu_open': 'menu_open.png', 'vues': 'vues.png', 'types': 'type_de_bien.png', 'close': 'close.png' } }; JS; // 写入配置文件,确保当前目录有PHP写入权限 file_put_contents("conf.js", $jsContent); ?>
额外说明
- 原代码中
images配置块最后一项末尾多了冗余逗号,在旧版IE浏览器中会触发JS语法错误,修复代码中已移除该冗余逗号 - 执行写入前请确认
conf.js所在目录对PHP运行进程开放写入权限,否则会出现写入失败的问题
内容的提问来源于stack exchange,提问作者tontongako
相关产品推荐
相关产品推荐

