【问题标题】:Inserting and retrieving text with newlines使用换行符插入和检索文本
【发布时间】:2012-03-12 19:07:01
【问题描述】:

我在 textareas 中插入换行符时遇到了一点问题。在我提交表单后,数据库中的文本显示如下:

“文本\r\nfor”(我在 Windows 上)

对于以下文本:
“文本
为”

然后在我从文本区域中的数据库中检索到相应的文本后,它显示:

“文本\r\n\for”

我正在使用 PHP 并将文本放在 textarea 中,如下所示:

<textarea name="post_content">{$post_content}</textarea>

我希望它使用换行符而不是 \n 或 \r\n 正确呈现。

【问题讨论】:

  • 在回显内容之前,尝试用str_replace() 去除'\r'。例如:str_replace("\r\n", "\n");
  • 我现在很困惑。您只是想删除所有\r 还是您实际上在文本区域中有两个符号 \ 和 n 而不是新行?
  • 我希望 \n 或 \r\n(Windows 对应)呈现为新行,而不是纯“\r\n\”文本。
  • 如果您的数据库中有 \r\n\ 作为 5 个单独的符号,则您用于将此数据输入数据库的代码有问题。换行符\n 永远不会在任何地方存储为两个单独的字符。这只是编程语言告诉编译器或解释器你想要一个换行符的简写。例如echo strlen("\n"); 将输出1,因为\n 被解释为单个换行符。您可能想向我们展示处理 textarea 内容并将其放入数据库的代码。
  • 我在查询中发送的所有变量上都使用了 mysql_escape_string。这可能是原因吗?是的,我在我的数据库字符串中看到了 \r\n。

标签: php javascript html textarea newline


【解决方案1】:

存储在数据库中的文本有一个\,这意味着转义n,这发生在可以呈现换行符之前。

最简单的解决方法是使用第二个\ 存储文本,如下所示:

text\\r\\nfor

这会被 PHP 渲染为:

text\r\nfor

这将创建带有换行符的 HTML。

【讨论】:

  • 谢谢,我认为这是问题所在:D,我会做出必要的改变。
  • 不,不起作用 :(,现在当我将 str_replace \r\n 替换为 \\r\\n 时,我在 textarea 中得到了 rn
  • 我发现我的问题是什么,我正在使用 mysql_escape_string 并且它在每个 \n 和 \r 字符前加上一个反斜杠:(
  • 所以mysql_escape_string() 会自动将\n 变成\\n
  • 是的。 mysql_escape_string 转义所有对传输具有特殊含义的字符。如果您希望字符串\n(两个字符)在数据库中显示为这样,请在它们上使用mysql_escape_string。反斜杠是需要转义的特殊字符。如果在换行符上应用mysql_escape_string,它将被两个字符\n 替换。如果你再次应用mysql_escape_string,你最终会得到\\n
【解决方案2】:

我最后的赌注是,您正在使用准备好的语句并在输入之前另外转义您的值,例如

// newlines will be replaced with '\n' here
$value = mysql_escape_string($_POST["value"]);

$stmt = $dbh->prepare("INSERT INTO myTable (value) VALUES (?)");

// mysql will insert the contents of $value literally. 
// so instead of a newline, you will have '\n' (two characters) in your database
$stmt->bindParam(1, $value);

// if you did this statement, everything would be fine. mysql would see your '\n'
// and replace it back to a newline. 
mysql_query("INSERT INTO myTable (value) VALUES ('$value')");

如果是这种情况,您不必逃避您的价值观。 bindParam 会为你做这件事。以下是您可以安全地将用户输入传输到数据库的两种方法的一些示例。

// not escaped 
$value = $_POST["value"];

// escape characters that have special meaning for mysql
$value2 = mysql_escape_string($_POST["value2"]);

// $value2 gets inserted into the query-string. we needed to 
// escape it's contents to not mix it up with actual SQL code.
$stmt = $dbh->prepare("INSERT INTO myTable (value, value2) VALUES (?, '$value2')");

// $value gets inserted using bindParam. everything is fine here.
$stmt->bindParam(1, $value);

【讨论】:

  • 是的,你完全正确,我在 30 分钟前刚刚解决了我的问题,结果证明我的 PDO 课程正在准备我的查询,我不需要再次逃避它们。谢谢:)
【解决方案3】:

您需要做的是对文本区域中显示的值中的新行进行编码。您可以在服务器端或客户端 html_encode 函数中执行此操作。所以基本上你替换所有 \n, \r, \r\n&lt;br&gt;. 让我知道它是否有效

【讨论】:

  • &lt;br/&gt; 内的 &lt;textarea&gt; 标记不会显示为换行符。它只会显示文本&lt;br/&gt;。不要在&lt;textarea&gt; 标签内用&lt;br/&gt; 替换换行符。
  • 是的,它不会..对不起,我的意思是在 html 中不在 textarea 内..我想我没有很好地阅读问题。
猜你喜欢
  • 2012-10-15
  • 2014-11-15
  • 2014-03-11
  • 2015-04-05
  • 2011-10-26
  • 2019-05-14
  • 2017-01-22
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多