PHP MySQL如何正确存储/转义字符串

时间:2016-05-30 01:56:36

标签: php mysql

我遇到包含<br/>或&amp;的字符串sting问题,&lt;等等。

我在将它们存储到DB

之前就这样逃避了
nl2br(htmlentities($string, ENT_QUOTES, 'UTF-8'));

然而,有时当我显示存储的结果时,我会得到像这样的东西

&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;<br /><br />

有人可以帮助/向我展示逃避字符串的最佳方法,但保留断点等等,当我想将其显示回屏幕时。

谢谢你

2 个答案:

答案 0 :(得分:2)

确保将double_encode设置为false,否则已经编码的字符串将再次编码,将&amp;转换为&amp;amp;。然后,当您使用html_entity_decode后显示它时,它将显示为仍然编码。

不良结果:http://ideone.com/uQxuAM

使用htmlentities($string, ENT_QUOTES, 'UTF-8', false);将确保不会发生这种情况。

然后使用html_entity_decode($string, ENT_QUOTES, 'UTF-8');显示值。

演示:http://ideone.com/8Jo7YA

但是,MySQL完全能够将解码后的值存储在数据库中。

您永远不希望在数据库中存储htmlentities编码的字符串。如果要生成CSV或PDF,发送电子邮件或任何非HTML的内容,会发生什么?

除了你必须执行双重编码数据编程,增加数据库中的数据量,然后仍然需要解码输出,有大量的文章在线回答为什么你不应该。< / p>

因此,您只需编码用于在html中显示结果数据输出的值。

相反,您应该使用mysqli_real_escape_string

来转义输入
$string = '<a href="/path/to/file?a=b&foo=bar#baz">My Link</a>';
$sql = "INSERT INTO links (link)"
     . "VALUES(" . mysqli_real_escape_string($string) . "')";

或更好地使用准备好的陈述

$stmt = $mysqli->prepare("INSERT INTO links (link) VALUES(?)");
$stmt->bind_param("s", $string);
$stmt->execute();

然后将输出格式化为成功消息,以显示实际添加到数据库的内容。

$html = "<div>Added Link: " . htmlentities($string, ENT_QUOTES, 'UTF-8', false) . "</div>";

现在无需使用html_entity_decode在浏览器中呈现html。

答案 1 :(得分:1)

html_entity_decode()可能会这样做。

$string = '<a href="http://test.com>test</a><br/>test';
$encode = nl2br(htmlentities($string, ENT_QUOTES, 'UTF-8'));

echo html_entity_decode($encode, ENT_QUOTES, 'UTF-8');

输出原始$string

<a href="http://test.com>test</a><br/>test

https://3v4l.org/qS5au