Две HTML формы, отправленные PHP, запускают друг друга - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть 2 формы на одной странице, но когда я нажимаю "Отправить", другая начинает действовать.

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
  Name: <input type="text" name="fname">
  <input type="submit" name="getNameSubmit">
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {



    // collect value of input field

    if(isset($_REQUEST['fname']) && $_REQUEST['fname']!="")
        {   
         $name = htmlspecialchars($_REQUEST['fname']);
              if (empty($name)) {
                echo "Hello dear user.";
            } else {
                echo "Hello $name";
            }
    }

}

?>

и

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
  Full text: <input type="text" name="stringtoreplace" value="">
  Word(s) to change: <input type="text" name="wordstochange" value="">
  Change to: <input type="text" name="wordstoinput" value="">
  <input type="submit" name="wordReplaceSubmit">
</form>

<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") {



    // collect value of input field -- the if(isset) stops a pre-comparison that throws an E_NOTICE level error

    if(isset($_REQUEST['stringtoreplace']) && $_REQUEST['stringtoreplace']!="")
    {
     $stringoutput = htmlspecialchars($_REQUEST['stringtoreplace']);
    }

    if(isset($_REQUEST['wordstochange']) && $_REQUEST['wordstochange']!="")
    {
     $tochange = htmlspecialchars($_REQUEST['wordstochange']);
    }

    if(isset($_REQUEST['wordstoinput']) && $_REQUEST['wordstoinput']!="")
    {
     $changeto = htmlspecialchars($_REQUEST['wordstoinput']);
    }


    if (empty($stringoutput)) {
        echo "Please enter your text and the words to change.";
    } else {
        echo str_replace($tochange, $changeto, $stringoutput);
    }
}

?> 

Как я могу получить один к действию не вызывая другого? Функция и размещение здесь не имеют значения, я просто занимаюсь практикой, но было бы неплохо понять, почему это происходит и как решить.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

<?php echo $_SERVER['PHP_SELF'];?> дает текущий URL, поэтому, поскольку они находятся на одной странице, это вызывает проблему. Вы можете проверить это, просмотрев страницу Ctrl + Shift + i, а затем нажав Elements на Chrome.

. Одним из решений может быть предоставление разных URL-адресов обеим формам или использование параметров по запросу после отправки. Например: <?php echo $_SERVER['PHP_SELF'].'?form=form1';?> & <?php echo $_SERVER['PHP_SELF'].'?form=form2';?>

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if(isset($_GET['form'])){
        if($_GET['form'] == 'form1'){
            //code for form1
        }else{
            //code for form2
        }
    }
}
1 голос
/ 01 апреля 2020

Хорошо, давайте начнем с того, почему это происходит.

Параметр action HTML сообщает браузеру, какой URL-адрес отправить запрос POST с данными формы. В вашем случае это $_SERVER['PHP_SELF'], который является текущим PHP скриптом. Вы используете одно и то же для обеих форм.

Когда отправляется одна из форм, вызывается ваш скрипт PHP, и все PHP в скрипте выполняются. Первая часть (та, что после первой формы) проверяет if ($_SERVER["REQUEST_METHOD"] == "POST"), решает, что да, это был запрос POST, и пытается продолжить. После этого вторая часть (та, что после второй формы), использует точно такую ​​же проверку, решает, что да, это был запрос POST, и пытается выполнить тоже.

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

1) Используйте разные параметры запроса в атрибуте действия для каждого форма, предложенная @ sauhardn c. Формы будут выглядеть так:

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>?form=form1">
...
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>?form=form2">

, тогда как сторона PHP будет делать что-то вроде

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if ($_GET['form'] == 'form1') {
        // code for form1
    } else {
        // code for form2
    }
}

2) Использовать разные входные данные в каждой форме. Формы будут выглядеть так:

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
    ...
    <input type="hidden" name="form" value="form1">
</form>
...
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
    ...
    <input type="hidden" name="form" value="form2">
</form>

, а сторона PHP будет делать что-то вроде

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if ($_REQUEST['form'] == 'form1') {
        // code for form1
    } else {
        // code for form2
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...