Передача значений из одной формы в другую — странный случай

Пожалуйста, взгляните на следующий код:

<?php

  $nomeDominio='';

  if (isset($_GET['infoDominio']))
  {          
      $nomeDominio = $_GET['nomeDominio'];
      echo "I'm getting ".$nomeDominio;
  }

  if (isset($_POST['atualizarDominio']))
  {
      echo "I'm posting ".$nomeDominio;
  }

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Test Case 99</title>
    </head>

    <body>

        <form name="infoDominio" action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>"  method="get">

            <input id="nome_dominio" type="text" name="nomeDominio" value="<?php echo $nomeDominio; ?>"/>
            <br />
            <button name="infoDominio" type="submit">Obtem informacao</button>

        </form>

        <form action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" name="atualizarDominio" method="post">

            <input type="hidden" value="<?php echo $nomeDominio ?>" name="nome-dominio"/>
            <br />
            <button type="submit" name="atualizarDominio">atualizar domínio</button>

        </form>

    </body>

</html>

Вы можете скопировать / вставить - это будет служить тестовым примером.

Таким образом, ЕСЛИ мы получаем, а затем отправляем: значение из GET НЕ БУДЕТ передаваться в POST.

Дело в том, что если мы просто изменим свойство action= второго элемента формы на вместо $_SERVER['PHP_SELF'], чтобы иметь только action=""; вы заметите, что значение БУДЕТ пройдено.

Мой вопрос: почему?

ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ. Это не то, что нужно решать. Вместо этого нужно понять, почему это происходит именно так. Почему, если мы изменим действие во второй форме на action="", значение, хранящееся в $nomeDominio, перейдет из одного условного выражения в другое? Пример кода можно использовать сам по себе, так что вы можете очень легко протестировать его и понять, о чем я говорю.


person MEM    schedule 08.09.2010    source источник
comment
-1 без каких-либо оснований. Это грубо. :(   -  person MEM    schedule 08.09.2010
comment
+1, в этом вопросе нет ничего плохого. Нет ничего хуже молчаливого даунвотера!   -  person Abe Miessler    schedule 08.09.2010
comment
@Abe Miessler: Спасибо за ваше чувство справедливости. :) @All: Если у кого-то по какой-либо причине возникает этот вопрос или недоумение, кажется, что проблема как-то связана с тем фактом, что у нас есть имя кнопки и имя формы, равные друг другу, что приводит к несоответствиям на стороне браузера. - но это НЕ подтверждено.   -  person MEM    schedule 08.09.2010


Ответы (4)


 {          
      $nomeDominio = $_GET['nomeDominio'];
      echo "I'm getting ".$nomeDominio;
  }

  if (isset($_POST['atualizarDominio']))
  {
      $nomeDominio = $_POST['nomeDominio']; //THIS HERE
      echo "I'm posting ".$nomeDominio;
  }

вам не хватает строки с комментарием ЭТО ЗДЕСЬ

Вы хотели передать _GET['nomeDominio'] из первой формы в скрытое поле второй формы, верно? Затем, когда мы отправляем ВТОРУЮ форму, вы снова повторяете значение nomeDominio (из скрытого поля второй формы). Вы где отсутствуете и назначение в $_POST: $nomeDominio = $_POST['nomeDominio'];

Ну вот. Если вы не понимаете, я не знаю, как сказать по-другому.

person Iznogood    schedule 08.09.2010
comment
Это название формы. Вы можете свободно копировать и вставлять этот код, так что убедитесь в этом сами. - person MEM; 08.09.2010
comment
Я имел в виду, что из-за этого он терпит неудачу. Попробуйте мое исправление. - person Iznogood; 08.09.2010
comment
@Iznogood - я попробую прямо сейчас. Между тем, чего мне ожидать? Что исправить в этом случае? - person MEM; 08.09.2010
comment
Я ошибался. Посмотрите на мой ответ, решение есть там, где вы пропустили задание. - person Iznogood; 08.09.2010
comment
@Iznogood - я проверяю ваше предыдущее предложение и получаю те же результаты. Сейчас буду тестировать твой новый. :) - person MEM; 08.09.2010
comment
Новый будет работать, я в этом уверен. Вы никогда не назначали $_POST['nomeDominio'] во второй форме. - person Iznogood; 08.09.2010
comment
@Iznogood - это сработает, да .. Но это побеждает все предложения. Суть в том, чтобы передать значение из условия GET в условие POST. И я утверждаю, что если мы изменим действие формы на действие = во второй форме, это будет сделано. И мне интересно, почему. :?? - person MEM; 08.09.2010
comment
Ну ты это делаешь. От GEt к скрытому полю обратно к POST. - person Iznogood; 08.09.2010
comment
Извините, не понял вашего ответа... не могли бы вы уточнить. Я довольно новичок в этих вопросах. :( - person MEM; 08.09.2010
comment
@Iznogood: Вы хотели передать _GET['nomeDominio'] из первой формы в скрытое поле второй формы, верно? НЕТ. :) Я вас прекрасно понимаю. :) Вопрос решен. Мой вопрос был: почему у меня это, а НЕ как я могу это решить. Однако обычно они смешиваются, но это не моя вина. Тем не менее, я нашел половину ответа, который искал. ;) У меня была эта проблема, потому что имя ФОРМЫ совпадало с именем кнопки, что приводило к несоответствиям. Однако это не полный ответ. Но я бы взял. :с - person MEM; 08.09.2010
comment
@MEM, да ладно. Думаю, это аргумент, чтобы лучше сформулировать свой вопрос в следующий раз. Если я помог вам, примите мой ответ или дайте мне балл. Если ты считаешь, что я этого не заслуживаю, это тоже нормально. - person Iznogood; 08.09.2010
comment
Конечно, ты заслуживаешь Изногуда. Точка дана. Вы помогли мне придумать новые способы формулировки этого вопроса, и диалектика всегда помогает. :) - person MEM; 08.09.2010

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

ИЗМЕНИТЬ

Дальнейшая разработка:

if (isset($_POST['nomeDominio']))
{
    echo "I'm posting ".$_POST['nomeDominio'];
}

Заменив этот код и предположив, что вы выбрали nomeDominio для имени, это должно сработать.

person Jimithus    schedule 08.09.2010
comment
Премисо спасибо. Однако я не слежу. Пожалуйста, наберитесь терпения. Я поставил одно и то же имя на обоих. Проблема остается точно такой же. Вы можете скопировать/вставить код, чтобы увидеть его. - person MEM; 08.09.2010
comment
Пожалуйста, ознакомьтесь с моим дополнительным примечанием к моему вопросу. Большое спасибо. - person MEM; 08.09.2010

Если я правильно вас понимаю, вы хотите иметь возможность распространять значение $_GET даже с помощью метода POST. Вы можете сделать это, добавив строку запроса к атрибуту действия второй формы POST:

<form action="<?php echo htmlentities($_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'] );?>" name="atualizarDominio" method="post">

РЕДАКТИРОВАТЬ: Хорошо, я думаю, что понимаю немного лучше.

В первом случае (со вторым действием формы как $_SERVER['PHP_SELF']) вы заставляете форму публиковать данные на странице без всех добавленных данных $_GET (если вы посмотрите на URL-адрес, данные $_GET добавляются к имени файла после ?), поэтому, когда вы ищете $_GET['infoDominio'], его больше не существует, и поэтому $nomeDominio по-прежнему устанавливается в пустую строку. Когда вы отправляете форму POST, устанавливается $_POST['atualizarDominio'] IS, и вы получаете сообщение I'm posting, но без значения, установленного в $nomeDominio.

Теперь, когда вы меняете действие второй формы на "", вы говорите браузеру отправить пользователя на ту же страницу, на которой вы только что были, которая включает все данные $_GET в URL-адресе (проверьте — вы найдете ?nomeDominio=whatever&infoDominio= в адресная строка еще). Когда вы отправляете вторую форму после отправки первой формы, все данные $_GET распространяются, поэтому $_GET['infoDominio'] устанавливается, $nomeDominio присваивается любое значение, которое вы указали в первой форме, и, таким образом, отображается на странице после отправки второй формы. .

Тот факт, что имя формы и имя кнопки отправки совпадают, не должно влиять на это.

Если я все еще не понимаю, о чем вы спрашиваете, пожалуйста, дайте мне знать. В противном случае я надеюсь, что это поможет.

person Aether    schedule 08.09.2010
comment
Нет, вы меня не правильно понимаете. :) Я не хочу ничего решать. Я хотел бы просто ПОНЯТЬ, почему он ведет себя так. Ознакомьтесь с дополнительным примечанием к вопросу. :) - person MEM; 08.09.2010

Вы сделали две ошибки. Первая ошибка

if (isset($_POST['atualizarDominio']))
{
  $nomeDominio = $_POST['nomeDominio']; ///Here
  echo "I'm posting ".$nomeDominio;
}

Вторая ошибка

<input type = "hidden" value="<?php echo $nomeDominio; ?>" name="nomeDominio"/><br/>
name="nome-dominio"   //This is another Mistake
name="nomedominio" //use it
person A.A Noman    schedule 09.02.2017