【问题标题】:submit form only on button click not on page refresh仅在按钮单击时提交表单,而不是在页面刷新时提交
【发布时间】:2025-12-02 13:35:01
【问题描述】:

下面是我的代码,并且工作正常。唯一的问题是,当我刷新页面时,它会执行成功查询。

<form action="" method="post">
<input type="submit" value="Purchase" id="btn" name="link_credits">
</form>

if(isset($_REQUEST['link_credits'])) 
{
echo "success";
//some codes here with sql statements
}
Else 
{ 
echo " Please try Again tomorrow"; 
}

?>

问题:

我不想在页面刷新时运行查询,它应该只在按钮单击时运行代码。

【问题讨论】:

标签: php mysql sql forms


【解决方案1】:

只需添加行 unset($_REQUEST['link_credits']);在成功循环中

if(isset($_REQUEST['link_credits'])) 
    {
    echo "success";
    //some codes here with sql statements

    if($success){
    $_SESSION['msg']="Data Added successfully";
    }
    else{
    $_SESSION['msg']="Data Not Added successfully.Please Check";
    }
    unset($_REQUEST['link_credits']);
    header("Location:--somepage.php--");    
    }
    else 
    { 
    echo " Please try Again tomorrow"; 
    }

然后你可以在 --somepage.php-- 中显示$_SESSION['msg'] 的值,并在显示后使用unset($_SESSION['msg']);

【讨论】:

  • 这行得通...但问题是它不显示成功消息。我可以在重定向到下一页之前设置计时器吗
  • 要显示错误或成功消息,您需要使用 Session,然后在下一页取消设置会话;
  • 效果很好。除了不显示消息。我将它重定向到同一页面,在 uset 之后......并尝试在 header() 之后显示 echo "",但它不起作用.. 休息没问题..
【解决方案2】:

您的浏览器应该警告您页面刷新将重新提交表单。因此,即使您刷新页面,或者您使用的是损坏的浏览器,您也会点击按钮。

综上所述,以下是一些可能的解决方案:

  1. 在“成功”短语期间对浏览器进行 Cookie,并且仅在未设置/不存在 cookie 时允许运行成功条件。

  2. 了解“POST 后重定向”,这是您应该在此处执行的操作。本质上,您执行成功操作,将标志设置为适当的,然后将浏览器(通过 PHP 的 header())转发到显示“OK,它成功了!”的页面。

【讨论】:

    【解决方案3】:

    将您的 if 条件更改为。

    if(isset($_POST['link_credits'])){
    echo "success";
    //some codes here with sql statements
    }
    else 
    { 
    echo " Please try Again tomorrow"; 
    }
    

    【讨论】:

    • 它运行请再试一次,我按下按钮.. 有超过 5 个不同名称的表单。我希望这不会影响代码
    • 您可以使用任意数量的按钮,但每个按钮都应该有唯一的名称,并根据条件使用if(isset($_POST['button_name']))
    【解决方案4】:

    这是因为您将表单提交到与 post 方法相同的页面,所以当您刷新页面时,novamento 发送了另一个请求 post。

    解决方案:

    if(isset($_REQUEST['link_credits'])) {
      echo "success";
      $_REQUEST['link_credits'] = null;
    } else {
      echo " Please try Again tomorrow"; 
    }
    

    【讨论】:

      【解决方案5】:

      发生这种情况是因为只需刷新它就会再次提交您的请求。

      所以想从根本上解决这个问题。

      我的意思是我们可以在表单中设置一个会话变量并在更新时检查它。

      if($_SESSION["csrf_token"] == $_POST['csrf_token'] )
      {
      // submit data  
      }
      
      //inside from 
      
      $_SESSION["csrf_token"] = md5(rand(0,10000000)).time(); 
      
      <input type="hidden" name="csrf_token" value=" 
      htmlspecialchars($_SESSION["csrf_token"]);"> 
      

      【讨论】: