【问题标题】:Is there a way to make a form submit twice?有没有办法让表单提交两次?
【发布时间】:2019-06-28 16:39:20
【问题描述】:

我正在从 XML 文件加载值,然后在 php 页面上使用表单更新 XML。我的问题是这个 - 我有一个在节点上运行计数的查询,它工作得很好,但我也想用计数更新节点并获得准确的值。当我提交我的表单时,它会在我加载文件时提交值,但为了正确更新计数(因为我需要更新的节点计数)我需要提交两次。我试图让它在正文 onload 函数上提交表单,但是从我可以确定当您点击提交按钮时它不会执行真正的整页刷新。它会重新加载页面,但我无法让它实际运行任何脚本或 onload 函数。我想到但无法弄清楚如何实现的替代方法是,如果我将选项值更改为关闭,则计数会减少。

<!DOCTYPE html>
<?php
$xml->load('test.xml');
$xpath = new DOMXpath($xml);
$liftsopen = $xpath->query("//node/Lifts-Open")->item(0);
$lift1status = $xpath->query("//areas/area[@name='Lift1']/lifts/lift[@name='Lift1']/@status")->item(0);
$lift2status = $xpath->query("//areas/area[@name='Lift2']/lifts/lift[@name='Lift2']/@status")->item(0);

$liftcount = 0;
foreach ( $xpath->query('//lifts/lift[@status="OPEN"]') as $count1 )   {
 $liftcount++;
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $lift1->nodeValue = $_POST['lift1statusform'];
    $lift2->nodeValue = $_POST['lift2statusform'];
    $liftsopen->nodeValue = $liftcount;
    $xml->save('test.xml');
}
?>

<body>
<form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
        <h4>Lift1</h4>
        <select name="lift1statusform" >
          <option selected value="<?= htmlspecialchars($lift1status->nodeValue)  ?>"><?= htmlspecialchars($lift1status->nodeValue)  ?></option>
          <option value="OPEN">OPEN</option>
          <option value="CLOSED">CLOSED</option>
        </select>
        <h4>Gondola</h4>
        <select name="lift2statusform" >
          <option selected value="<?= htmlspecialchars($lift2status->nodeValue)  ?>"><?= htmlspecialchars($lift2status->nodeValue)  ?></option>
          <option value="OPEN">OPEN</option>
          <option value="CLOSED">CLOSED</option>
        </select>        
<input name="submit" type="button" value="Save"/>
</form>
</body>
</html>

使用以下 Ajax 函数提交了两次表单:

function Test() {
    var form = $('form');
    $.ajax({
      type: 'POST',
      url: form.attr('action'),
      data: form.serialize(),
      success: function(data) {
        $.ajax({
          type: 'POST',
          url: form.attr('action'),
          data: form.serialize(),
          success: function(data) {
          location.reload(true);
          }
        });
        }
      });
    }

【问题讨论】:

  • 您的问题毫无意义,原因如下:您页面的用户只在表单中输入值一次,而不是两次,因此您只需提交一次即可完成您可能想要的所有处理.
  • 嗨 KIKO 软件。这实际上是不正确的。加载页面时,通过提升的状态值加载跟踪计数。所以当我点击提交时,它会更新状态值,但计数值仍然相同。为了保存新的计数值,我需要重新提交页面。

标签: php forms submit


【解决方案1】:

AJAX 能有效解决您的问题吗?

如果您需要执行多个“表单提交”,您应该检查 AJAX 的功能。 Ajax 允许您在不离开(甚至刷新)当前页面的情况下使用后端 PHP 文件发送交换数据。也许这是您的解决方案。

与大多数 js 动作一样,它可以是事件驱动的(即由某个事件触发一次或多次),或者在循环中重复,等等。

AJAX 最常使用 jQuery 库实现:

$(document).ready(function(){
    $.ajax({
        type: 'post',
         url: 'my_backend_file.php',
        data: {varname:value}
    }).done(function(recd){
        console.log('data recd from PHP side, if needed: ' + recd);
    });
});

虽然在vanilla js 中也同样处理得很好。

参考和其他例子:

https://stackoverflow.com/a/54332971/1447509

Should I have one form or two separate forms

https://www.html5rocks.com/en/tutorials/file/xhr2

【讨论】:

  • 嗯,问题是一切都在一个 php 页面上。唯一单独的文件是我的 XML。
  • 您是否被阻止创建第二个 PHP 页面?如果没有,那么您会很高兴发现 AJAX 的额外好处。建议:花 20 分钟重新创建一个更简单的 ajax 示例,以了解它的工作原理。 我敢打赌,可能性(即如何将其应用到您的项目中)将开始渗透和具体化。 请注意,第二个 PHP 页面将是 ajax 接收器/处理器页面,它将充当表单action="pagename.php" 页。使用表单,您可以巧妙地将表单提交到同一个页面,但使用 AJAX 最好使用第二个页面。
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2013-09-14
相关资源
最近更新 更多