【问题标题】:2 forms on same page php同一页面上的 2 个表单 php
【发布时间】:2016-03-26 16:46:58
【问题描述】:

我的学习簿给了我一个作业,要求我在一页上有 2 个表格并将它们输出到同一页。这甚至可能吗?两种形式都可以独立工作。两者都有动作:

<?php echo $_SERVER['PHP_SELF']; ?>". 

两者都有一个提交按钮,但该按钮只提交它所属的表单。不过,这可能是有道理的。

问题是我需要页面在单击 2 个提交按钮中的一个时发布两个表单输出,或者随后按下它们,但第一个表单中的信息需要保留在页面上。

这是可能的还是我正在尝试做不可能的事?

形式如下;

表格1:

<form name="orderform" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Korting:
 <tr>
 <td>
 <input type="checkbox" name="korting[]" value=15 /> Student 15% <br>
 <input type="checkbox" name="korting[]" value=10 /> Senior 10% <br>
 <input type="checkbox" name="korting[]" value=5 /> Klant 5% <br>
 <hr />
 </td>
 </tr>
 <tr>
 <td>
 betalingswijze
 <input type="radio" name="betalingswijze" value="paypal"> Paypal
 <input type="radio" name="betalingswijze" value="mastercard"> Mastercard
 <input type="radio" name="betalingswijze" value="visa"> Visa
 <hr />
 </td>
 <tr>
 <td>
    <img src="toshiba.jpg" alt=" " />
 </td>
 </tr>
 <tr>
 <td>
    Toshiba Sattelite A100-510 Basisprijs 999.99
</td>
</tr>
<tr>
<td><!--Shopping Cart Begin-->
    <input type="hidden" name="toshibaproduct" value="001" />
    <input type="hidden" name="toshibamerk" value="toshiba" />
    <input type="hidden" name="toshibamodel" value="Sattelite A100-510" />
    Operating system <select name="toshibaos" value="Toshiba">
    <option value="xp">Windows XP</option>
    <option value="vista">Windows Vista</option>
    <option value="linux">Linux</option>
    </select>
    Aantal: <input type="text" size=2 maxlength=3 name="toshibaaantal" value="0" />
    <input type="hidden" name="toshibaprijs" value="999.99" />

    <input type="image" src="bestel.jpg" border=0 value="bestellen" />
    <hr />

 <tr>
 <td>
    <img src="acer.jpg" alt=" " />
 </td>
 </tr>
 <tr>
 <td>
    Acer Aspire 5735Z Basisprijs 529.99
</td>
</tr>
<tr>
<td>    
    <input type="hidden" name="acerproduct" value="002" />
    <input type="hidden" name="acermerk" value="acer" />
    <input type="hidden" name="acermodel" value="Aspire 5735Z" />
    Operating system <select name="aceros" value="Acer">
    <option value="xp">Windows XP</option>
    <option value="vista">Windows Vista</option>
    <option value="linux">Linux</option>
    </select>
    Aantal: <input type="text" size=2 maxlength=3 name="aceraantal" value="0" />
    <input type="hidden" name="acerprijs" value="529.99" />

    <input type="image" src="bestel.jpg" border=0 value="bestellen" />
    <hr />
    </td><!--Shopping Cart End-->
</tr>
</form>

表格 2

<form name="klant gegevens" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table border=1 >
<tr>
<td colspan="2">
    <b>Factuur klantgegevens</b>
</td>
</tr>
<tr>
<td width="100">Naam: </td>
<td>
    <input type="text" sie="55" name="naam" />
</td>
</tr>
<tr>
<tr>
<td>Adres: </td>
<td>
    <input type="text" sie="55" name="adres" />
</td>
</tr>
<tr>
<td>Woonplaats:</td>
<td>
    <input type="text size="34" name="woonplaats">
    Postcode:<input type="text" size="6" name="postcode">
</td>
</tr>
<tr>
<td>e-mail:</td>
<td>
    <input type="text" size="55" name="email">
</td>
</tr>
<tr>
<td>Feedback:</td>
<td>
<textarea cols="40" rows="3" name="commentaar">
</textarea>
</td>
</tr>
</table>
<input type="image" src="checkout.png" value="send"/>
</form>

两者都有在提交时启动的功能。对不起,间距。我在我自己的文件中更好地保​​存了它们,但我只是不知道如何在这个网站上正确使用它们。

您好,

伦纳特

【问题讨论】:

  • 是的,有可能。可以添加管理表单提交的php代码吗?
  • 感谢您的回复。我已经编辑了下摆。
  • 您只需要一个表单并过滤数据。

标签: php html forms


【解决方案1】:

动作代表将接收发布数据的页面。您可以使用不同的动作或具有不同参数的相同动作。 如果您使用相同的操作,则必须插入一个允许管理不同案例的参数。您可以插入一个隐藏字段来执行此操作。

考虑这些简单的形式:

<form name="form_a" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
    <input type="hidden" name="form" value="A">
    <button type="submit">Form A</button>
</form>

<form name="form_b" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
    <input type="hidden" name="form" value="B">
    <button type="submit">Form B</button>
</form>

要管理不同的提交,您必须检查隐藏字段的值:

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

    switch ($_POST['form']) {
        case "A":
            echo "submitted A";
            break;

        case "B":
            echo "submitted B";
            break;

        default:
            echo "What are you doing?";
    } 
} 

您不能同时提交两个单独的表单,因为每个提交代表对服务器的不同请求。

您可以手动合并两个表单的字段,或使用 Javascript 为您完成此操作。 请记住,如果您通过 Javascript 执行此操作,则表单的字段必须具有不同的名称。

你可以看到here,你可以简单地通过 jQuery:

var str1 = $("form_a").serialize();
var str2 = $("form_b").serialize();
$.post(url, str1 + "&" + str2);

其中url 是表单的操作参数

【讨论】:

  • 无需检查isset($_POST),因为它是超级全局的,并且将始终设置:-)
  • 谢谢!但是这篇文章会两种形式吗?看起来它只会发布“A”或“B”。我需要同时发布这两种表格。或者我必须然后将它们加入一种形式(现在我这么说,听起来很合乎逻辑)。问题是我的学习书要求我使用 2 个表单并在同一页面上同时输出它们。
  • 表单仍然是独立的模块。如果要同时发布两者,则需要将字段合并到一个表单中(使用单个提交按钮)。 ...或者您可以创建一个 javascript 函数来合并两个表单的字段并执行单个提交。
  • 感谢 Lipsyor!我会把它做成一个单一的表格。我没有足够的 javascript 经验来合并这两个字段。
【解决方案2】:

重复发布

是的,你可以!

首先,为所有表单添加适当的操作,其次,给它们一个唯一的名称

HTML 端

不要忘记添加你想要的 http 方法(GET 或 POST)

<form method="post">
  <input type="hidden" name="orderform" />
  <!-- rest of form goes here -->
</form>

<form method="post">
  <input type="hidden" name="klant_gegevens" />
  <!-- rest of form goes here -->
</form>

action-属性留空或将其完全删除将使表单提交到当前页面(see this post),使用$_SERVER["PHP_SELF"]会导致XSS注入read under "Big Note on PHP Form Security"

注意:

避免在字段名称中使用空格,匹配它们会产生一些问题...

PHP 端

通过过滤收到的表单名称获取输入值

if (isset($_POST["orderform"])) {
    // The first form was submitted
}

if (isset($_POST["klant_gegevens"])) {
    // The second form was submitted
}

注意:

使用print_r()var_dump(),调试交换值的内容

【讨论】:

  • 检查表单名称是否不为空将不起作用。最好命名提交名称并检查它(或表单的其他特定值)。另外,关于$_SERVER['PHP_SELF']; 的使用说明,请阅读"Big Note on PHP Form Security" on w3schools
  • 你很好,但这是一种反射。在此步骤中测试一个或一些特定值是不够的(与整个字段名称相同 - 太长)。此时,唯一需要的是知道表单是否已提交。有条件的在里面。这就是为什么条件的范围是空的! (我知道 php_self,我希望他的练习不会强加)
  • 我的意思是你不能在 PHP 中检查 &lt;form name="something",它不是通过 $_POST 发布的。表单中的值已提交,您可以检查这些名称。
  • 请投减票,我无法编辑它(stackoverflow 的 10 小时...睡觉时间:D)
  • 嗯,我已经改进了,但我建议删除,重复的原因,这就是我为什么要投票...以避免初学者阅读错误的代码!
【解决方案3】:

您的表单应该是这样的。
第一种形式

 <form method="post" >
      ... 
   <input type="hidden" name="form1submission" value="yes" >
    <input type="submit" name="submit" value="Submit" >
  </form>

第二种形式

  <form method="post" >
      ... 
   <input type="hidden" name="form2submission" value="yes" >
    <input type="submit" name="submit" value="Submit" >
  </form>

还有你的第一种形式的 php。

  if('POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['form1submission'])) {
        // first form code. 
   }

还有第二种形式的 php 代码。

  if('POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['form2submission'])) {
        // second form code. 
   }

就是这样。

【讨论】:

  • 感谢您的回复!这会发布两种形式,还是只发布其中一种?
  • 这将一次购买一种表格。没有js是不可能同时提交两个表单的。如果您需要同时提交两个表单,请使用 jQuery 或原始 js 函数一起提交。
猜你喜欢
  • 1970-01-01
  • 2017-04-22
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多