刷新PHP页面时如何保留textarea内容?

时间:2010-11-17 08:54:31

标签: php html textarea html-entities

我的困境是这样的:我有一个PHP页面,其中包含一个包含 textarea 的表单,用户可以在其中输入任何类型的文本。下面的代码位于我的PHP页面的顶部,用于检查用户是否按下了表单的“提交”按钮,并错误地检查了所有用户输入:

<?php 
// check if user has pressed the Submit button earlier
if (isset($_POST['submit'])) {
    ...
    $loc = mysqli_real_escape_string($dbc, trim($_POST['location']));
    ...

下面的代码是表单的HTML / PHP代码,特别是textarea:

...
// location texarea entry
echo '<label for="location">Meeting location: </label><br />';
echo '<textarea name="location" id="location" cols="40" rows="5">' . htmlentities($loc) . '</textarea><br />';

// submit button
echo '<input type="submit" value="Submit" name="submit"/><br />';
...

当我进入时,让我们说:

Testing testing...

...

<>// HELLO!!!

进入textarea,但是然后在页面上的其他一个检查失败,因此表单/页面被刷新并显示错误,我想保留用户在textarea中写的内容。但是使用我的代码,显示的存储文本变为:

Testing testing...\r\n\r\n...\r\n\r\n<>// HELLO!!!

如何“保存”textarea内容,使其与用户在刷新PHP页面之前所写的内容完全相同?想不出解决方案。 :(非常感谢提前!

7 个答案:

答案 0 :(得分:5)

您应该回显原始$_POST['location']值(使用htmlentities),而不是它的trimmed和mysql_real_escaped版本。

$loc = null;
if (/* POST */) {
    $loc = $_POST['location'];
    ...
    $query = 'INSERT INTO ... "' . mysql_real_escape_string(trim($loc)) . '"';
    ...
}

echo '<textarea name="location" id="location" cols="40" rows="5">' . htmlentities($loc) . '</textarea><br />';

答案 1 :(得分:2)

只需跳过强加于$loc = mysqli_real_escape_string($dbc, trim($_POST['location']));

htmlentities($loc)htmlentities($_POST['location'])应足以返回刚刚提交的用户

答案 2 :(得分:1)

如果\r\n是唯一的问题,您可以在将其发送回浏览器之前执行str_replace()

$loc = str_replace("\\r\\n", "\n", $loc);

如果还有其他问题,这种方法可能不是最理想的方法。

答案 3 :(得分:1)

您可以尝试替换

htmlentities($loc)

htmlentities(stripslashes($loc))

因为它可能是mysqli_real_escape()打破\ r \ n。

或者您可以尝试输出原始POST数据

echo '<textarea name="location" id="location" cols="40" rows="5">' . $_POST['location'] . '</textarea><br />';

答案 4 :(得分:1)

如果您的表单方法是发布的,您可以简单地为您的用户提供原始发布数据. $_POST['location'] .并使用您的“已清除”输入只是将其插入到数据库

答案 5 :(得分:1)

使用Cookie。 这是谷歌搜索示例代码。 这是html&gt;&gt;

http://skymong9.egloos.com/1797665

<HTML>
<HEAD>
<TITLE>BLUE-B</TITLE>
<script>
function ReadCookie (Name)
{
 var search = Name + "="
 if (document.cookie.length > 0)
 {
  offset = document.cookie.indexOf(search)
  if (offset != -1)
  {
   offset += search.length
   end = document.cookie.indexOf(";", offset)
   if (end == -1)
    end = document.cookie.length
   return (document.cookie.substring(offset, end))
  }
  else
   return ("");
 }
 else
  return ("");
}

function WriteCookie (cookieName, cookieValue, expiry)
{
 var expDate = new Date();

 expDate.setTime (expDate.getTime() + expiry);
 document.cookie = cookieName + "=" + escape (cookieValue) + "; expires=" + expDate.toGMTString() + "; path=/";
}

function getCookies()
{
 document.noteForm.note.value = unescape(ReadCookie("note"));
}
</script>

</head>
<body>
<form NAME="noteForm">
<textarea ROWS="5" COLS="40" NAME="note" WRAP="VIRTUAL"></textarea>

<input TYPE="button" VALUE="Save Text" onClick="WriteCookie('note', document.noteForm.note.value, 2678400000)">
<INPUT TYPE="button" VALUE="새로고침" onClick='parent.location="javascript:location.reload()"'>
</form>
<script>
window.onload=function() { getCookies(); }
</script>

答案 6 :(得分:0)

换行添加到textarea

<textarea name="location" id="location" cols="40" rows="5">

变为:

<textarea name="location" id="location" cols="40" rows="5" wrap="virtual">

你也可以使用wrap:off,hard,soft,physical

您的textinput现在应该与您编写的完全相同。