猿问

PHP提交的两个HTML表单互相触发

我在一页上有 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);

    }

}


?> 

如何在不触发另一个的情况下让其中之一采取行动?功能和位置不是这里的一个因素,我只是在做一些练习,但如果能了解为什么会发生这种情况以及如何解决,那就太好了。


慕标琳琳
浏览 120回答 2
2回答

一只名叫tom的猫

<?php echo $_SERVER['PHP_SELF'];?>给出当前的 URL,因此因为它们位于同一页面,所以会导致问题。您可以通过检查页面Ctrl + Shift + i然后单击ElementsChrome 来检查这一点。一种解决方案可能是为两个表单提供不同的 URL 或在发布请求上使用参数。例如<?php echo $_SERVER['PHP_SELF'].'?form=form1';?>-&<?php echo $_SERVER['PHP_SELF'].'?form=form2';?>if ($_SERVER["REQUEST_METHOD"] == "POST") {&nbsp; &nbsp; if(isset($_GET['form'])){&nbsp; &nbsp; &nbsp; &nbsp; if($_GET['form'] == 'form1'){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //code for form1&nbsp; &nbsp; &nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //code for form2&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}

胡子哥哥

好吧,让我们开始讨论为什么会发生这种情况。HTML 的参数action告诉浏览器使用表单数据发送 POST 请求的 URL。在您的例子中,它是$_SERVER['PHP_SELF'],这是当前的 PHP 脚本。您对这两种形式使用相同的内容。当提交其中一份表单时,您的 PHP 脚本将被调用,并且脚本中的所有 PHP 都会被执行。第一部分(第一个表单之后的部分)检查if ($_SERVER["REQUEST_METHOD"] == "POST"),确定这是一个 POST 请求,并尝试继续。之后,第二部分(第二个表单之后的部分)使用完全相同的检查,确定是的,这是一个 POST 请求,并尝试继续进行。理想情况下,使用两个不同的页面来处理两种不同的表单会更干净;但如果您希望将所有内容保留在同一页面中,则可以使用几个不同的选项来区分两者。1) 按照@sauhardnc 的建议,在每个表单的操作属性中使用不同的查询参数。表格看起来像:<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") {&nbsp; &nbsp; if ($_GET['form'] == 'form1') {&nbsp; &nbsp; &nbsp; &nbsp; // code for form1&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; // code for form2&nbsp; &nbsp; }}2) 在每个表单中使用不同的输入。表格看起来像:<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">&nbsp; &nbsp; ...&nbsp; &nbsp; <input type="hidden" name="form" value="form1"></form>...<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">&nbsp; &nbsp; ...&nbsp; &nbsp; <input type="hidden" name="form" value="form2"></form>而 PHP 端会做类似的事情if ($_SERVER["REQUEST_METHOD"] == "POST") {&nbsp; &nbsp; if ($_REQUEST['form'] == 'form1') {&nbsp; &nbsp; &nbsp; &nbsp; // code for form1&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; // code for form2&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Html5
我要回答