为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标琳琳 2023-10-24 21:14:56
我在一页上有 2 个表格,但是当我按下“提交”按钮时,另一个表格就会被执行。<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">  Name: <input type="text" name="fname">  <input type="submit" name="getNameSubmit"></form><?phpif ($_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><?phpif ($_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 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

<?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") {

    if(isset($_GET['form'])){

        if($_GET['form'] == 'form1'){

            //code for form1

        }else{

            //code for form2

        }

    }

}


查看完整回答
反对 回复 2023-10-24
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

好吧,让我们开始讨论为什么会发生这种情况。


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") {

    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

    }

}


查看完整回答
反对 回复 2023-10-24
  • 2 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信