【问题标题】:Run PHP submit code prior to HTML form action to set SESSION variables在 HTML 表单操作之前运行 PHP 提交代码以设置 SESSION 变量
【发布时间】:2020-07-19 18:13:58
【问题描述】:

当用户提交 HTML 表单以运行 PHP 代码以在执行 HTML 表单的操作和离开页面之前将表单数据保存为会话变量时,有没有办法?当我将表单操作设置为转到下一页 (session2.php) 时,它不会运行与提交按钮关联的 PHP。如果我删除表单操作,那么我需要 PHP 提交脚本中的 JavaScript 将用户带到下一页。

有没有办法运行 PHP,然后运行表单操作,还是最好保持原样?我确实将 session_start(); 作为两个文件的第 1 行。

session1.php

<?php

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

    // Set Global Session Variables from Form's POST Values
    $_SESSION["favcolor"] = $_POST['favcolor'];
    $_SESSION["favanimal"] = $_POST['favanimal'];
    
    // Go To Next Page
    $URL="session2.php";
    echo "<script type='text/javascript'>document.location.href='{$URL}';</script>";
    echo '<META HTTP-EQUIV="refresh" content="0;URL=' . $URL . '">';

}       
?>


<form action="" method="post">
Enter Color: <input type="text" name="favcolor" /><br />
Enter Animal: <input type="text" name="favanimal" /><br />
<input type="submit" value="submit" name="submit" />
</form>

session2.php

<?php
// Echo session variables that were set on previous page
echo "Favorite color is " . $_SESSION["favcolor"] . ".<br>";
echo "Favorite animal is " . $_SESSION["favanimal"] . ".";
?>

【问题讨论】:

  • 在 php 中进行重定向,而不是使用 javascript。查找 PRG(发布、重定向、获取)模式。

标签: php html


【解决方案1】:

有几种方法可以做到这一点:

  1. 使用 PHP 的header('Location: /page-url');

  2. 如果设置了$_POST,则呈现不同的内容

<?php

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

    // Set Global Session Variables from Form's POST Values
    $_SESSION["favcolor"] = $_POST['favcolor'];
    $_SESSION["favanimal"] = $_POST['favanimal'];
    
    // Render other page content
    include "session2.php";
    
    // end the script to prevent loading this page contents
    die;
}       
?>


<form action="" method="post">
Enter Color: <input type="text" name="favcolor" /><br />
Enter Animal: <input type="text" name="favanimal" /><br />
<input type="submit" value="submit" name="submit" />
</form>
  1. 通过 AJAX 请求提交表单并根据响应重定向

【讨论】:

  • 对于 AJAX 请求,我建议对此进行一些研究,那里有很多关于它的信息
  • 感谢您的详细回复。我正在寻找选项 1 中列出的类似您的操作。我尝试过 header('Location: session2.php);但这导致 =>“无法修改标头信息 - 标头已发送。”是使用 ob_start() 的安全解决方案;缓冲输出还是更好地坚持使用带有 标记备份的 JavaScript 方法?
  • @Mike 通常在收到该错误时 - 这意味着已经生成了一些内容。我建议在生成任何 html 内容之前将其放在 PHP 文件的顶部 - 否则使用 ob_start();ob_clean(); 方法可能会有所帮助。
  • 谢谢。我确实尝试过这个,但是当我这样做时,似乎我的 SESSION 变量不是从 POST 数据提交中设置的。我到达 session2.php 时没有 SESSION 变量。
  • @Mike session_start(); 应该只被调用一次,如果你包含一个文件,你就不需要再次调用它。我不确定这是否发生在你身上,但我会检查以确保你没有在两个文件中调用 session_start();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多