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

使用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);
问题分析
  1. 不可见字符作祟:本地看不到但在线管理器能显示,根本不是普通的点,而是非打印控制字符(比如UTF-8 BOM、零宽空格、ASCII控制字符)。本地编辑器会自动过滤这类不可见字符,在线管理器则会强制显示所有字符。
  2. 数据来源污染:数据库的banned_words字段里可能藏着不可见字符,循环写入时被带到了生成的文件里;也可能是代码里的字符串拼接过程中不小心引入了隐藏字符。
  3. 写入模式/编码冲突: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:03:11