返回

PHP文本框内容保存到文件:添加分隔符的完美解决方案

php

PHP 文本框内容保存到文件,如何添加分隔符?

遇到个挺头疼的问题:用 PHP 把多个文本框(textarea)里的内容依次存到同一个文本文件里,结果发现每次新加的内容都直接粘在前一条的屁股后面了,挤成一团,完全没法看。 想要的格式是每条消息之间有个明显的分隔,比如一条横线,或者一排星号,再或者其他什么都行,总之得能清楚地区分开来。

为啥会这样?

看看代码,问题出在写入文件那块。原本的 PHP 代码只是简单地把每次提交的文本框内容($msg)追加(fwrite)到文件 (posts.txt) 里面,压根儿没考虑过加个分隔符啥的。

<?php
$filename = 'posts.txt';
$msg = (isset($_POST['msg']) ? $_POST['msg'] : null);

if (is_writable($filename)) {
  if (!$handle = fopen($filename, 'a')) {
    echo "Cannot open file ($filename)"; exit;
  }

  if (fwrite($handle, $msg) === FALSE) {
    echo "Cannot write to file ($filename)"; exit;
  }

  echo "Success, wrote ($msg) to file ($filename)"; fclose($handle);
}
else {
  echo "The file $filename is not writable";
}
?>

fopen 函数用了 'a' 模式,意思是追加模式打开文件,每次写入都在文件末尾添加,但不会自动帮你加换行或者分隔符。fwrite 也只是老老实实地写入你给它的内容,$msg 是啥样,写进去就是啥样。

咋解决?几种方案给你参考

既然知道了问题所在,解决起来也就不难了。 根本思路就是:在每次写入文本框内容后,再写入一个分隔符。下面几种方法都可以实现,挑一个你觉得顺眼的用就行。

1. 直接在 $msg 后面加上分隔符

最简单粗暴的方法,直接在写入文件前,给 $msg 变量屁股后面“粘”上分隔符字符串。

  • 原理: PHP 里用 . (点号) 来连接字符串。
  • 代码示例:
<?php
$filename = 'posts.txt';
$msg = (isset($_POST['msg']) ? $_POST['msg'] : null);
$separator = "\n**** **** **** **** **** \n"; // 分隔符,这里用一排星号,两边换行

if (is_writable($filename)) {
  if (!$handle = fopen($filename, 'a')) {
    echo "Cannot open file ($filename)"; exit;
  }

  if (fwrite($handle, $msg . $separator) === FALSE) { // 注意这里的 . 和 $separator
    echo "Cannot write to file ($filename)"; exit;
  }

  echo "Success, wrote ($msg) to file ($filename)"; fclose($handle);
}
else {
  echo "The file $filename is not writable";
}
?>
  • 解释: $separator 变量存的是分隔符字符串。 \n 是换行符,让分隔符单独占一行。 fwrite($handle, $msg . $separator) 这一句,先把 $msg$separator 连成一个更长的字符串,然后一起写入文件。

2. 使用 PHP_EOL 常量

为了跨平台兼容性(Windows、Linux、macOS 的换行符可能不同),建议使用 PHP_EOL 常量代替 \n

  • 原理 : PHP_EOL 会根据当前操作系统自动选择正确的换行符。
  • 代码示例:
<?php
$filename = 'posts.txt';
$msg = (isset($_POST['msg']) ? $_POST['msg'] : null);
$separator = PHP_EOL . "--------------------" . PHP_EOL; // 使用 PHP_EOL

if (is_writable($filename)) {
  if (!$handle = fopen($filename, 'a')) {
    echo "Cannot open file ($filename)"; exit;
  }

  if (fwrite($handle, $msg . $separator) === FALSE) {
    echo "Cannot write to file ($filename)"; exit;
  }

  echo "Success, wrote ($msg) to file ($filename)"; fclose($handle);
}
else {
  echo "The file $filename is not writable";
}
?>
  • 说明: 这段代码跟前一段差不多,只是把 \n 换成了 PHP_EOL,更规范一些。

3. 连续调用 fwrite

不用字符串连接,直接连续调用两次 fwrite 函数,分别写入文本框内容和分隔符。

  • 原理: fwrite 每次写入都会紧接着上一次写入的位置,不会自动换行。
  • 代码示例:
<?php
$filename = 'posts.txt';
$msg = (isset($_POST['msg']) ? $_POST['msg'] : null);
$separator = PHP_EOL . str_repeat('-', 20) . PHP_EOL; //用str_repeat生成20"-"

if (is_writable($filename)) {
  if (!$handle = fopen($filename, 'a')) {
    echo "Cannot open file ($filename)"; exit;
  }

  if (fwrite($handle, $msg) === FALSE) {
    echo "Cannot write to file ($filename)"; exit;
  }
  if (fwrite($handle, $separator) === FALSE) { // 第二次写入分隔符
    echo "Cannot write to file ($filename)"; exit;
  }

  echo "Success, wrote ($msg) to file ($filename)"; fclose($handle);
}
else {
  echo "The file $filename is not writable";
}
?>
  • 解释: 先用 fwrite($handle, $msg) 写入文本框内容,再用 fwrite($handle, $separator) 写入分隔符。注意这里用了 str_repeat('-', 20) 来生成 20 个连续的 - 字符,作为分隔线, 比手动输入更方便。

4. 使用 file_put_contents (进阶)

如果整个过程就是简单地追加内容,可以考虑用 file_put_contents 函数,更简洁。

  • 原理: file_put_contents 函数相当于 fopenfwritefclose 的组合拳,一步到位。FILE_APPEND 标志表示追加模式。
  • 代码示例:
<?php
$filename = 'posts.txt';
$msg = (isset($_POST['msg']) ? $_POST['msg'] : null);
$separator = PHP_EOL . "=====" . PHP_EOL;

if ($msg) { // 确保 $msg 不为空
    if (file_put_contents($filename, $msg . $separator, FILE_APPEND) === FALSE) {
        echo "Cannot write to file ($filename)";
    } else {
        echo "Success, wrote ($msg) to file ($filename)";
    }
} else {
    echo "No message to write.";
}
?>
  • 解释:
    file_put_contents($filename, $msg . $separator, FILE_APPEND) 一句话搞定:打开文件($filename)、写入内容($msg . $separator,记得加上分隔符)、设置追加模式(FILE_APPEND)、关闭文件。而且加了个判断if($msg), 只有$msg不为空的时候,才会执行写入,防止空内容也被当成一条消息写入。

  • 安全性建议
    无论你用那种方法写入文件,都要对用户输入的内容($msg)进行适当的过滤和转义,防止恶意代码注入。

    • 过滤: 比如去除 HTML 标签、JavaScript 代码等。
    • 转义: 比如把特殊字符(如 <>" 等)转换成 HTML 实体。

    可以用 htmlspecialchars() 或者 strip_tags() 这类函数来处理。

    $msg = isset($_POST['msg']) ? $_POST['msg'] : null;
    $msg = htmlspecialchars($msg); //转义
    //$msg = strip_tags($msg); // 过滤, 谨慎使用. 根据自己实际情况调整.
    

总结一下

小问题,大麻烦。不加分隔符,文本内容全糊在一起,根本没法看。 好在,通过在写入内容后加个分隔符的操作,完美解决了这个问题。 PHP_EOLfile_put_contents()htmlspecialchars(), strip_tags() 这几个小东西可以多用用。