
PHP 从 .txt 文件读取数据时会一并读入换行符(\n、\r\n 等),导致 strlen() 返回异常长度;需在入库前清除不可见控制字符,确保字符串纯净可用。
php 从 .txt 文件读取数据时会一并读入换行符(\n、\r\n 等),导致 `strlen()` 返回异常长度;需在入库前清除不可见控制字符,确保字符串纯净可用。
在使用 PHP 读取文本文件(如 fgets())并将内容插入 MySQL 数据库时,一个常见却容易被忽视的问题是:换行符被一同读入变量中。例如,.txt 文件中写的是 8,00(视觉上为 4 个字符),但 fgets() 实际读取的是 "8,00\n"(Linux/macOS)或 "8,00\r\n"(Windows),因此 strlen($ram) 返回 6 而非预期的 4。
这不仅影响长度判断,更可能导致后续逻辑出错——比如数值比较失败、JSON 编码异常、前端渲染多余空白,甚至因未过滤的换行符引发 SQL 注入风险(尽管本例中已用单引号包裹,仍属不良实践)。
✅ 正确做法:在处理每一行数据后,立即去除首尾空白及跨平台换行符:
$ram = trim(fgets($file)); // 推荐:一行解决(自动处理 \n, \r\n, \r, \t, 空格等) $cpu = trim(fgets($file)); $so = trim(fgets($file)); $gpu = trim(fgets($file));
trim() 是最简洁可靠的方案,它默认移除 ASCII 控制字符(包括 \n, \r, \t, \0, \x0B)和空格,兼容所有主流操作系统换行格式。
⚠️ 注意事项:
- ❌ 避免直接拼接变量进 SQL:当前代码 $sql = "INSERT ... ('$ram', ...)" 存在严重 SQL 注入漏洞。应改用预处理语句(Prepared Statements);
- ✅ 示例安全写法:
$stmt = $conn->prepare("INSERT INTO comparar (ram, cpu, gpu, so) VALUES (?, ?, ?, ?)"); $stmt->bind_param("ssss", $ram, $cpu, $gpu, $so); $stmt->execute(); - ✅ 若需进一步校验数值格式(如 8,00 表示浮点数),建议统一转换为小数点格式再存储(如 str_replace(',', '.', $ram)),便于数据库索引与计算;
- ✅ 建议对上传文件内容做基础合法性检查(如正则匹配 /^\d+(,\d{2})?$/ 验证金额类字段),提升健壮性。
总结:fgets() 读取的每行天然携带换行符,务必使用 trim() 清洗后再参与业务逻辑或持久化操作;同时,永远优先选用参数化查询替代字符串拼接,兼顾功能正确性与系统安全性。










