如何检测按下哪个提交按钮?

问题描述:

我在PHP中有一个脚本,我需要检测HTML页面中按下哪个按钮。我发现了很多其他人提出的类似问题,但我遇到了问题。如何检测按下哪个提交按钮?

HTML

<form method="post" action="kode/kode_newsletter_operation.php" id="newsletter_step3Form"> 
        <p> 
         <label>Schedule newsletter:</label> 
         <select name="send_date_month" id="send_date_month"> 
          <option value="01">January</option> 
          <option value="02">February</option> 
          <option value="03">March</option> 
          <option value="04">April</option> 
          <option value="05">May</option> 
          <option value="06">June</option> 
          <option value="07">July</option> 
          <option value="08">August</option> 
          <option value="09">September</option> 
          <option value="10">October</option> 
          <option value="11">November</option> 
          <option value="12">December</option> 
         </select> 
         - 
         <select name="send_date_day" id="send_date_day"> 
          <option value="01">1</option> 
          <option value="02">2</option> 
          <option value="03">3</option> 
          <option value="04">4</option> 
          <option value="05">5</option> 
          <option value="06">6</option> 
          <option value="07">7</option> 
          <option value="08">8</option> 
          <option value="09">9</option> 
          <option value="10">10</option> 
          <option value="11">11</option> 
          <option value="12">12</option> 
          <option value="13">13</option> 
          <option value="14">14</option> 
          <option value="15">15</option> 
          <option value="16">16</option> 
          <option value="17">17</option> 
          <option value="18">18</option> 
          <option value="19">19</option> 
          <option value="20">20</option> 
          <option value="21">21</option> 
          <option value="22">22</option> 
          <option value="23">23</option> 
          <option value="24">24</option> 
          <option value="25">25</option> 
          <option value="26">26</option> 
          <option value="27">27</option> 
          <option value="28">28</option> 
          <option value="29">29</option> 
          <option value="30">30</option> 
          <option value="31">31</option> 
         </select> 
         - 
         <select name="send_date_year" id="send_date_year"> 
          <option value='2012'>2012</option><option value='2013'>2013</option>        </select>&nbsp; 
          <select name="send_date_hour" id="send_date_hour"> 
           <option value="00">0</option> 
           <option value="01">1</option> 
           <option value="02">2</option> 
           <option value="03">3</option> 
           <option value="04">4</option> 
           <option value="05">5</option> 
           <option value="06">6</option> 
           <option value="07">7</option> 
           <option value="08">8</option> 
           <option value="09">9</option> 
           <option value="10">10</option> 
           <option value="11">11</option> 
           <option value="12">12</option> 
           <option value="13">13</option> 
           <option value="14">14</option> 
           <option value="15">15</option> 
           <option value="16">16</option> 
           <option value="17">17</option> 
           <option value="18">18</option> 
           <option value="19">19</option> 
           <option value="20">20</option> 
           <option value="21">21</option> 
           <option value="22">22</option> 
           <option value="23">23</option> 
          </select>:<select name="send_date_min" id="send_date_min"> 
           <option value="00">00</option> 
           <option value="00">05</option> 
           <option value="10">10</option> 
           <option value="00">15</option> 
           <option value="20">20</option> 
           <option value="00">25</option> 
           <option value="30">30</option> 
           <option value="00">35</option> 
           <option value="40">40</option> 
           <option value="00">45</option> 
           <option value="50">50</option> 
           <option value="00">55</option> 
          </select> 
          <div>Server Time: October 12, 2012 04:54</div> 
         </p> 
         <p> 
          <label for="send_date">Preview in Email:</label> 
          <input type="text" id="preview_email" value="" name="preview_email" /> 
          <input type="button" id="preview_btn" name="preview_btn" class="btn btn_red" onclick="previewSendMail(1)" value="Send Preview"/> 
         </p> 
         <p>&nbsp; </p> 
         <div id="kode_result"></div> 
         <div id="content_buttons"> 
          <input type="button" class="btn btn_blue big" name="goback" value="Last Step" onclick="window.location.href='./newsletter_create_step2.php?id=1'" /> 
          <input type="submit" name="submit_btn_now" value="Send now!" class=" btn btn_red big"/> 
          <input type="submit" name="submit_btn" value="Schedule" class=" btn btn_green big"/> 
          <input name="action" type="hidden" value="newsletter_step3" /> 
          <input type="hidden" name="newsletter_id" id="newsletter_id" value="1"/> 
         </div> 
        </form> 

PHP

print_r($_POST); 

输出

Array(
[send_date_month] => 10 
[send_date_day] => 12 
[send_date_year] => 2012 
[send_date_hour] => 01 
[send_date_min] => 50 
[preview_email] => 
[action] => newsletter_step3 
[newsletter_id] => 1 
) 

两个按钮是<form>标签内,但$_POST阵列不包括任何有关他们的信息。我究竟做错了什么?最近的浏览器没有发送关于提交按钮的信息,或者我错过了什么? 我没有JavaScript技能来为此开发解决方法,我只知道PHP。

在此先感谢。

+0

您将不得不将按钮放在两个单独的窗体中。 – Cyclonecode

+0

从print_r($ _ POST)得到的输出是什么? – maiorano84

+1

不需要两种不同的形式。我已经使用了数百次单个表单中的两个提交按钮。 – maiorano84

你有JQuery的或任何其他JS库的形式运行?他们倾向于接管提交事件,因此提交不是来自实际的提交输入。尝试没有js库吗?

编辑:这里是一个变通:

$('#submit_btn_now').on('click', function() { 
    var hiddensubmit=document.createElement('input'); 
    hiddensubmit.value = this.value; 
    hiddensubmit.name = this.name; 
    hiddensubmit.setAttribute('hidden','hidden'); 
    $('#newsletter_step3Form').append(hiddensubmit); 
    $('#newsletter_step3Form').submit() 
    return false; 
}); 
+0

我更喜欢这个(只是添加隐藏的属性类型) – Scuzzy

+0

实际上,如果作为验证例程的一部分存在“返回false”,以防止提交,那么在创建新的动作之前,您应该“动态添加”字段那些。 – Scuzzy

+1

这是一个完整的提交,所以你不会看到它,真的,但没关系。我不确定通过清理动态添加的字段可以看出你的意思,但是如果处理程序已经传递false,我们就会遇到问题。 –

为提交按钮指定相同的名称属性,但使用不同的值,然后您可以对提交按钮上使用的文本进行测试。

<pre><? print_r($_POST);?></pre> 
<form method="post"> 
<input type="submit" name="button" value="AAA"> 
<input type="submit" name="button" value="BBB"> 
</form> 

输出继电器:

Array 
(
    [button] => AAA 
) 

编辑:其实,我什么也看不到你的代码错误?

<pre><? print_r($_POST);?></pre> 
<form method="post"> 
<input type="submit" name="submit_btn_now" value="Send now!" class=" btn btn_red big"/> 
<input type="submit" name="submit_btn" value="Schedule" class=" btn btn_green big"/> 
</form> 

输出只点击一个:

Array 
(
    [submit_btn_now] => Send now! 
) 
+0

+1,任何想法为什么他们没有出现在$ _POST? –

+0

其实,我把@gtugablue的代码放到了我的测试中(显然不知道他的

元素),并且诚实地说,它的工作方式和你所期望的一样,这里肯定还有其他一些潜在的问题。 – Scuzzy
+0

我在想什么是他除了按钮之外什么都没有,就像你的例子,并且GET作为方法,这给了他一个空的POST。 –

如果你要使用所有按钮相同的值(因为它是显示为文本的值),你可以使用name属性的信息持有人并加上前缀。获取价值的方式则是:

$information = substr(
    end(
    array_filter(
     array_keys($_REQUEST), 
     function ($key) { return substr($key, 0, strlen(PREFIX)) == PREFIX; } 
    ) 
), 
    strlen(PREFIX) 
); 

设置两个按钮属性为相同值。
给每个按钮不同属性,就像这样:

<input type="submit" name="submit" value="Log In"> 
<input type="submit" name="submit" value="Sign Up"> 

然后你就可以在你的PHP使用如果语句,就像这样:

if ($_POST['submit']=="Log In") {} 
else {} // ELSE DETECTS THE "Sign Up" BUTTON, OR ANY OTHER BUTTON WITH A DIFFERENT VALUE 

我觉得这个漂亮很多东西给你准确的答案你正在寻找:一种方法来检测哪些按钮被按下使用PHP和没有JavaScript。