1

从表单中,我要求用户输入一些文本。我将使用 检索此文本$_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!]

如何避免这些斜线,我应该对我的数据做其他事情吗?

4

4 回答 4

3

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

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

于 2012-04-28T15:08:52.253 回答
-1

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

您可以创建 2 个变量,1 个用于 MySQL,1 个用于显示原始文本。

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

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

希望这能澄清一点。

于 2012-04-28T15:12:27.603 回答
-1

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

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

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

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

这样一个变量(称为占位符)在哪里s:text,它将被替换为$_POST['text']值,根据占位符名称中设置的类型正确准备(s意思是“字符串”,告诉你的函数转义并引用数据)
所以,所有必要的准备工作将在内部完成,不会破坏源变量。

于 2012-04-29T06:08:49.753 回答
-2

使用 mysql_real_escape_string() 正常保存

当您想以表格形式显示它时:

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

它会成功的。

于 2012-04-28T15:07:45.780 回答