У меня есть 2 вопроса:
Как запретить PHP-скрипту удалять поля формы при отправке? Я просмотрел здесь много сообщений, большинство из которых касаются JS, который я не использую. Я пробовал auto-complete = "new-password", но это не сработало. Я бы хотел, чтобы данные формы оставались после отправки, чтобы в случае необходимости обновления пользователю не приходилось вводить все заново. Вот пример того, что я имею в виду:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<meta charset = "UTF-8"></meta>
<meta name = "viewport" content = "width=device-width, initial-scale=1.0"></meta>
<title>create</title>
</head>
<body>
<form method = "post">
<label for = "sometext"></label>
<input type = "sometext" id = "sometext" name = "sometext" />
<button name = "save">Save File</button>
</form>
<?php
if (isset($_POST['save']))
{
$text = $_POST['sometext'];
$file=fopen("myfile.txt", "w");
fwrite($file, $text);
fclose($file);
}
?>
</body>
</html>
Что это за '/' в конце ввода, например, строки ввода в прикрепленном коде?
Это не php, который очищает форму. Php не запускается в вашем браузере. Ваш браузер отправляет форму обратно, что означает, что он отбрасывает отображаемую страницу и загружает все, что возвращает ваш PHP-скрипт, в качестве следующей страницы.
Если вы переместите код обработки формы в начало сценария, он будет запущен первым, прежде чем форма будет повторно отображена. Затем вы можете установить некоторые переменные в php, которые можно будет использовать позже для отображения значений обратно в новую копию формы, если они существуют. Подсказка: у вас уже есть $text в случае отправки формы.
Или вы можете научиться использовать javascript и ajax для асинхронной отправки формы (что, в свою очередь, означает, что браузер не уходит со страницы и, следовательно, ничего не удаляется).
Получили ли вы ответы, которые искали?






Это не очень хорошая практика, но вы можете сделать это, как показано ниже:
Обновлено: если вы хотите реализовать ту же систему, вам следует фильтровать значения сообщений в соответствии с требуемым типом данных и отображать их в полях ввода.
<?php
if (isset($_POST['save']))
{
$text = $_POST['sometext'];
$file=fopen("myfile.txt", "w");
fwrite($file, $text);
fclose($file);
}
?>
<html>
<head>
<meta charset = "UTF-8"></meta>
<meta name = "viewport" content = "width=device-width, initial-scale=1.0"></meta>
<title>create</title>
</head>
<body>
<form method = "post">
<label for = "sometext"></label>
<input type = "sometext" id = "sometext" name = "sometext" value = "<?=$text; ?>" />
<button name = "save">Save File</button>
</form>
</body>
</html>
Почему, по вашему мнению, это не «хорошая практика»?
P.S. В конце его можно сделать менее многословным, если использовать $text вместо $_POST['sometext'].
использование полей сообщений непосредственно во входных значениях может привести к уязвимостям, если поля сообщений не фильтруются строго в соответствии с желаемыми значениями в полях ввода.
Если под «уязвимостью» вы имеете в виду XSS, существует известное решение этой проблемы, а именно HTML-кодирование текста — в PHP это делается с помощью htmlspecialchars();. Кроме того, неясно, что вы имеете в виду, и проблемы XSS не имеют никакого отношения к «типам данных», как вы написали в ответе.
Извините, я медленный. Спасибо jonrsharpe за ответ на '/'. Теперь это имеет смысл. Я перейду к другим ответам и опубликую их позже.
Ух ты! Это выше моего понимания, но я добираюсь туда. Спасибо, Абхишек, это имеет смысл. Но это также создает еще одну проблему. Внутри моего настоящего php-скрипта я использую require_once() для использования другого php-файла. Используя приведенный вами пример, сначала запускается php, а затем моя страница формы просто переходит к сценарию require_once(). Я думаю, что я близок, но пока нет.
Как вы можете сказать, я борюсь. Моя форма имеет 34 поля ввода. Удаление требования, чтобы убрать его с дороги, и изменение только 1 поля на value = "" приводит к тому, что моя форма отображается как пустая страница. Новое изменение Абхишека, похоже, работает, хотя поле ввода теперь очищено (исходная проблема), а моя реальная форма по-прежнему остается пустой. Комментарий А.Дайсона может быть правильным решением. Раньше я занимался js (немного), но ничего не говорил об ajax, и боюсь, что попаду в кроличью нору.
@Дэйв, посмотри в моем ответе более чистый и безопасный пример кода, чем этот. Не уверен, что вам действительно нужен ajax, но, конечно, это всегда вариант. Зависит от того, хотите ли вы углубиться в эту дополнительную сложность на этом этапе.
Все, я очень ценю помощь. Все очень старались ответить на мой вопрос. К сожалению, я сейчас в этой кроличьей норе. :-( Я прочитал все ответы и просмотрел несколько десятков или более веб-страниц, но оказалось, что с моими скудными знаниями html/php/javascript у меня просто нет возможности решить эту проблему. Мне нужно проверить пока прочистю голову и вернусь к этому позже. Спасибо, Дэйв.
@Дэйв, есть ли в этих ответах что-то, что тебе не помогает? Я протестировал свой код, прежде чем написать ответ, и совершенно уверен, что он работает.
Вздох. Я мог только надеяться, что узнаю 1/20 того, что знаете вы, ребята. Вы знаете, как бывает, что вы смотрите на что-то так долго, что оно становится скорее размытым, чем более ясным. Спасибо, Эдисон. После долгих экспериментов мне удалось заставить ваш пример работать. Высшая признательность всем.
@Дэйв, Дэйв рад, что тебе удалось заставить это работать. Практика делает совершенным. Я много знаю только потому, что много сделал
Это не php, который очищает форму. Php не запускается в вашем браузере. Ваш браузер отправляет форму обратно, что означает, что он отбрасывает отображаемую страницу и загружает любой URL-адрес, по которому была опубликована форма, и возвращается в качестве следующей страницы.
Поскольку ваша форма отправляет данные обратно в тот же сценарий, если вы переместите код обработки формы в верхнюю часть сценария PHP, он будет запущен первым, прежде чем форма будет повторно отображена.
Затем вы можете установить переменную в php, которую можно будет использовать позже для отображения значений обратно в новую копию формы, если они существуют.
У вас уже есть $text в случае отправки формы, так что это идеально подходит для этой цели. Все, что вам нужно сделать дополнительно, это HTML-кодирование, чтобы его эхо не оставляло страницу открытой для атак XSS-инъекций.
Пример:
<?php
if (isset($_POST['save']))
{
$text = $_POST['sometext'];
$file = fopen("myfile.txt", "w");
fwrite($file, $text);
fclose($file);
}
?>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<meta charset = "UTF-8" />
<meta name = "viewport" content = "width=device-width, initial-scale=1.0" />
<title>create</title>
</head>
<body>
<form method = "post">
<label for = "sometext"></label>
<input type = "sometext" id = "sometext" name = "sometext" value = "<?php echo (isset($text) ? htmlspecialchars($text) : ""); ?>" />
<button name = "save">Save File</button>
</form>
</body>
</html>