Запретить PHP очищать форму

У меня есть 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>
    
  • Что это за '/' в конце ввода, например, строки ввода в прикрепленном коде?

stackoverflow.com/q/3741896/3001761
jonrsharpe 11.06.2024 19:03

Это не php, который очищает форму. Php не запускается в вашем браузере. Ваш браузер отправляет форму обратно, что означает, что он отбрасывает отображаемую страницу и загружает все, что возвращает ваш PHP-скрипт, в качестве следующей страницы.

ADyson 11.06.2024 19:03

Если вы переместите код обработки формы в начало сценария, он будет запущен первым, прежде чем форма будет повторно отображена. Затем вы можете установить некоторые переменные в php, которые можно будет использовать позже для отображения значений обратно в новую копию формы, если они существуют. Подсказка: у вас уже есть $text в случае отправки формы.

ADyson 11.06.2024 19:08

Или вы можете научиться использовать javascript и ajax для асинхронной отправки формы (что, в свою очередь, означает, что браузер не уходит со страницы и, следовательно, ничего не удаляется).

ADyson 11.06.2024 19:09

Получили ли вы ответы, которые искали?

KIKO Software 11.06.2024 21:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это не очень хорошая практика, но вы можете сделать это, как показано ниже:

Обновлено: если вы хотите реализовать ту же систему, вам следует фильтровать значения сообщений в соответствии с требуемым типом данных и отображать их в полях ввода.

<?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>

Почему, по вашему мнению, это не «хорошая практика»?

ADyson 12.06.2024 16:06

P.S. В конце его можно сделать менее многословным, если использовать $text вместо $_POST['sometext'].

ADyson 12.06.2024 16:07

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

Abhishek Kumar 12.06.2024 16:08

Если под «уязвимостью» вы имеете в виду XSS, существует известное решение этой проблемы, а именно HTML-кодирование текста — в PHP это делается с помощью htmlspecialchars();. Кроме того, неясно, что вы имеете в виду, и проблемы XSS не имеют никакого отношения к «типам данных», как вы написали в ответе.

ADyson 12.06.2024 17:21

Извините, я медленный. Спасибо jonrsharpe за ответ на '/'. Теперь это имеет смысл. Я перейду к другим ответам и опубликую их позже.

Dave 12.06.2024 18:27

Ух ты! Это выше моего понимания, но я добираюсь туда. Спасибо, Абхишек, это имеет смысл. Но это также создает еще одну проблему. Внутри моего настоящего php-скрипта я использую require_once() для использования другого php-файла. Используя приведенный вами пример, сначала запускается php, а затем моя страница формы просто переходит к сценарию require_once(). Я думаю, что я близок, но пока нет.

Dave 12.06.2024 18:47

Как вы можете сказать, я борюсь. Моя форма имеет 34 поля ввода. Удаление требования, чтобы убрать его с дороги, и изменение только 1 поля на value = "" приводит к тому, что моя форма отображается как пустая страница. Новое изменение Абхишека, похоже, работает, хотя поле ввода теперь очищено (исходная проблема), а моя реальная форма по-прежнему остается пустой. Комментарий А.Дайсона может быть правильным решением. Раньше я занимался js (немного), но ничего не говорил об ajax, и боюсь, что попаду в кроличью нору.

Dave 12.06.2024 19:25

@Дэйв, посмотри в моем ответе более чистый и безопасный пример кода, чем этот. Не уверен, что вам действительно нужен ajax, но, конечно, это всегда вариант. Зависит от того, хотите ли вы углубиться в эту дополнительную сложность на этом этапе.

ADyson 12.06.2024 19:28

Все, я очень ценю помощь. Все очень старались ответить на мой вопрос. К сожалению, я сейчас в этой кроличьей норе. :-( Я прочитал все ответы и просмотрел несколько десятков или более веб-страниц, но оказалось, что с моими скудными знаниями html/php/javascript у меня просто нет возможности решить эту проблему. Мне нужно проверить пока прочистю голову и вернусь к этому позже. Спасибо, Дэйв.

Dave 12.06.2024 21:36

@Дэйв, есть ли в этих ответах что-то, что тебе не помогает? Я протестировал свой код, прежде чем написать ответ, и совершенно уверен, что он работает.

ADyson 12.06.2024 23:52

Вздох. Я мог только надеяться, что узнаю 1/20 того, что знаете вы, ребята. Вы знаете, как бывает, что вы смотрите на что-то так долго, что оно становится скорее размытым, чем более ясным. Спасибо, Эдисон. После долгих экспериментов мне удалось заставить ваш пример работать. Высшая признательность всем.

Dave 13.06.2024 02:13

@Дэйв, Дэйв рад, что тебе удалось заставить это работать. Практика делает совершенным. Я много знаю только потому, что много сделал

ADyson 13.06.2024 10:02
Ответ принят как подходящий

Это не 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>

Другие вопросы по теме