Как сохранить содержимое текстовой области при обновлении страницы PHP?

Моя дилемма такова: у меня есть страница PHP с формой, которая включает в себя текстовое поле, где пользователь может ввести любой текст. Код ниже находится в верхней части моей 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 для формы и, в частности, для текстовой области:

...
// 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!!!

В текстовую область, но затем не проходит одна из других проверок на странице, поэтому форма/страница обновляется и показывает ошибку, я хочу сохранить то, что пользователь написал в текстовой области. Но с кодом, который у меня есть, отображаемый сохраненный текст превращается в:

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

Как я могу «сохранить» содержимое текстовой области, чтобы оно было идентично тому, что написал пользователь до обновления страницы PHP? Не могу придумать решение. :( Спасибо заранее!


person BeeDog    schedule 17.11.2010    source источник


Ответы (7)


Вы должны повторить исходное значение $_POST['location']htmlentities), а не его обрезанную и 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 />';
person deceze♦    schedule 17.11.2010
comment
Боже мой, почему я не додумался просто использовать значение $_POST... теперь я чувствую себя очень глупо. Большое спасибо за отличный ответ, и спасибо всем остальным! - person BeeDog; 17.11.2010

просто пропустите наложение на $loc = mysqli_real_escape_string($dbc, trim($_POST['location']));

htmlentities($loc) или htmlentities($_POST['location']) должно быть достаточно, чтобы вернуть то, что пользователь только что отправил.

person ajreal    schedule 17.11.2010

Если \r\n - единственная проблема, вы можете выполнить str_replace() перед вы отправляете его обратно в браузер:

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

Если есть и другие проблемы, этот метод может быть не самым идеальным.

person Veger    schedule 17.11.2010

можно попробовать заменить

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 />';
person jyggen    schedule 17.11.2010

если ваш метод формы - сообщение, вы можете просто предоставить своему пользователю необработанные данные сообщения . $_POST['location'] . и использовать свой «очищенный» ввод только для того, чтобы вставить его в БД

person Vadyus    schedule 17.11.2010

Используйте Куки. Вот пример кода для поиска в Google. Вот html >>

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>

person Jinbom Heo    schedule 17.11.2010

Добавьте обтекание в текстовое поле.

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

становится:

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

Вы также можете использовать обертывание: выключенное, жесткое, мягкое, физическое

Ваш текстовый ввод теперь должен быть обернут именно так, как вы его написали.

person Arthur Brown    schedule 13.09.2014