文本输出中的斜杠


Slashes in text output

在表单中,我要求用户输入一些文本。 我将使用 $_POST['text'] 检索此文本。

用户输入字符串"这是我的文本!

$newText = mysql_real_escape_string($_POST['text']);

现在,在我$newText插入要显示的数据库后,在同一页面上给用户的文本,并使用 PHP 将其用作输入文本框的值。

// I want to make sure the user hasn't added any unsafe html in their string
$newText = htmlentities($newText);
echo "You've entered: " . $newText . "<br />";
echo "<form action=someaction.php method=post>";
echo "<input type=text value='"" . $newText . "'">";
echo "</form>";

输出为:

You've entered: It''s my text!
[It''s my text!]

如何避免这些斜杠,我是否应该对我的数据执行任何其他操作?

您正在通过mysql_real_escape_string()传递文本,顾名思义,该文本转义了字符串,包括撇号。 mysql_real_escape_string()仅用于准备要保存到数据库的数据。向用户显示数据时不应使用它。

因此,解决方案很简单:删除该行并仅使用htmlentities()。在将字符串保存到数据库时使用mysql_real_escape_string()(并且仅此时(。

仅对要在查询中使用的变量使用 mysql_real_escape_string(),因为它将添加斜杠以转义字符串中的某些字符。这适用于 mysql,但是当想在页面上使用它时,它看起来会很奇怪。

您可以创建 2 个变量,1 个用于

MySQL,1 个用于显示原始文本。

$text = $_POST['text'];
$db_text = mysql_real_escape($text);

另请注意,稍后应对从数据库获取的数据使用 strip_slashes() 来删除斜杠。

希望这能把事情弄清楚一点。

现在,在将$newText插入数据库后的同一页面上,我想向用户显示文本

这就是你做错的地方。
HTTP 标准要求在每次成功的 POST 请求后进行 GET 方法重定向
因此,您必须在同一页面上重定向用户,您可以在其中从数据库中读取插入的数据并将其显示给用户。

至于你犯的错误 - 只需将转义移动到更接近数据库操作的地方,以确保它仅用于目的(但它是强制性使用的,没有忘记它的风险!
理想情况下,您必须使用一些变量来表示查询中的数据,并使用一些处理程序来处理它们。
因此,查询调用可能如下所示

DB::run("UPDATE table SET text=s:text",$_POST['text']);

其中s:text是这样的变量(称为占位符(,它将替换为$_POST['text']值,根据占位符名称中设置的类型正确准备(s表示"字符串",告诉您的函数转义并引用数据(
因此,所有必要的准备工作都将在内部完成,并且不会破坏源变量。

使用 mysql_real_escape_string(( 正常保存

当您想在表单中显示它时:

htmlspecialchars(stripslashes($row['text_data']))

它会解决问题。