使用PHP fwrite生成文件后在线查看出现多余点的问题求助
问题描述
- 用PHP的
fwrite写了文件生成功能,主机在线文件管理器里能看到生成的文件有个多余的点,但下载到Linux Mint本地后看不到这个点 - 这个多余点会触发
Uncaught Error: Undefined constant ""错误,在线删掉该点后程序就正常了 - 试过修改生成函数、下载到本地修改文件,都解决不了问题;生成XML站点地图时也出现同样的多余字符情况
- 相关生成代码:
//regenerate the spam list using the updated database $path_to_file = '/home/xxxxxxx/domains/xxxxxx.com/public_html/xxxxxxx/banned_words.php'; $myfile = fopen($path_to_file, "w") or die("Unable to open file!"); $txt1 = "<?php // The list of not allowed words \$not_allowed_words = [ "; $txt3 = "];?>"; fwrite($myfile, $txt1); // Query to fetch stories $stmt = $pdo->prepare('SELECT * FROM banned_words ORDER BY id ASC'); $stmt->execute(); $data = $stmt->fetchAll(); foreach ($data as $row) { $banned_word = $row["banned_word"]; $txt2 = " '".$banned_word."', "; fwrite($myfile, $txt2); } fwrite($myfile, $txt3);
问题分析
- 不可见字符作祟:本地看不到但在线管理器能显示,根本不是普通的点,而是非打印控制字符(比如UTF-8 BOM、零宽空格、ASCII控制字符)。本地编辑器会自动过滤这类不可见字符,在线管理器则会强制显示所有字符。
- 数据来源污染:数据库的
banned_words字段里可能藏着不可见字符,循环写入时被带到了生成的文件里;也可能是代码里的字符串拼接过程中不小心引入了隐藏字符。 - 写入模式/编码冲突:
fopen用"w"模式是字节流写入,如果数据里有编码异常的字符,就会导致显示异常。
解决方案
1. 过滤数据库数据中的不可见字符
在获取banned_word后,先清理掉所有不可见控制字符:
$banned_word = preg_replace('/[\x00-\x1F\x7F]/u', '', $row["banned_word"]);
这个正则会删掉所有ASCII控制字符,包括各种藏在文本里的不可见字符。
2. 优化文件写入方式
用file_put_contents替代fopen+fwrite的组合,代码更简洁,也减少多次写入可能带来的异常:
// 直接拼接完整内容 $content = "<?php // The list of not allowed words\n\$not_allowed_words = [\n"; foreach ($data as $row) { $banned_word = preg_replace('/[\x00-\x1F\x7F]/u', '', $row["banned_word"]); $content .= " '$banned_word',\n"; } $content .= "];?>"; // 一次性写入文件 file_put_contents($path_to_file, $content) or die("Unable to write file!");
3. 排查代码文件本身的隐藏字符
如果上述方法无效,检查当前运行的PHP生成脚本本身是否有隐藏字符。可以在Linux环境下用命令cat -A your_generator_script.php查看所有字符,找到并删除那些看不见的控制字符。
4. XML文件的特殊处理
生成XML站点地图时,确保输出的是标准UTF-8编码,必要时可以在文件开头写入UTF-8 BOM(但PHP文件绝对不能加BOM):
// 生成XML时添加BOM(仅XML适用) file_put_contents($xml_path, "\xEF\xBB\xBF" . $xml_content);
内容的提问来源于stack exchange,提问作者cactusman
相关产品推荐
相关产品推荐

