【问题标题】:Save form data to SESSION variables before submit提交前将表单数据保存到 SESSION 变量
【发布时间】:2019-02-07 13:06:30
【问题描述】:

我有一个表单来提交数据,并且我正在使用以下代码作为会话变量

    if(!isset($_SESSION)) 
{ 
    session_start(); 
} 
if (isset($_SESSION['product'])) {
    $product = $_SESSION['product'];
    if($product == "loan"){$loan='selected="selected"';} else {$loan='';}
    if($product == "card"){$card='selected="selected"';} else {$card='';}
    if($product == "savings"){$savings='selected="selected"';} else {$savings='';}
    if($product == "morgage"){$mortgage='selected="selected"';} else {$mortgage='';}
} else { $loan = $card = $savings = $mortgage = '';}
if (isset($_SESSION['liked'])) {
    $liked = stripslashes(htmlspecialchars(($_SESSION['liked'])));
} else {
    $liked = '';
}
if (isset($_SESSION['disliked'])) {
    $disliked = stripslashes(htmlspecialchars(($_SESSION['disliked'])));
} else {
    $disliked = '';
}

表格是这样的

        <form id="msform" class="form-horizontal" method="POST" action="">
        <label for="product">Select product:</label>
          <select name="product" id="product">
              <option value="loan" '. $loan .'>Personal Loan</option>
              <option value="card" '. $card .'>Credit Card</option>
              <option value="savings" '. $savings .'>Savings Account</option>
              <option value="mortgage" '. $mortgage .'>Mortgage</option>
            </select> 
        <textarea rows="4" name="liked" placeholder="I really liked...">'. $liked .'</textarea>
        <textarea rows="4" name="disliked" placeholder="I did not like...">'. $disliked .'</textarea>

        <!-- php if statements here, if logged in show submit button if not show Facebook login button -->

        <input type="submit" name="submit" class="submit action-button" value="Submit"/>

提交按钮仅对登录用户显示。如果用户未登录,则会显示 Facebook 登录按钮。当他点击它时,他会被发送到 Facebook,如果他接受应用程序的权限,他会以登录用户的身份重定向回表单。但是随后,所有字段都被清除了。如果尚未调用 GET/POST,如何将数据保存到会话变量并重新填充?

【问题讨论】:

  • 用户点击Facebook登录按钮后去了哪里?使 Facebook 登录按钮 成为带有 formaction 属性的提交按钮到 PHP 页面,您可以将表单输入保存到 $_SESSION,然后将用户重定向到 facebook 到完成登录。

标签: javascript php forms session-variables


【解决方案1】:

我冒昧地对您的代码进行了一些改进。

看看下面的代码sn-p。这会将您的表单数据添加到会话中,并在页面刷新时保持可用。

<?php
// First, we'll check if the session is set. Otherwise, we'll set it
if (!isset($_SESSION)) {
    session_start(); 
}

$fb = new Facebook\Facebook([/* . . . */]);
$helper = $fb->getRedirectLoginHelper();
$permissions = ['email', 'user_likes'];
$loginUrl = $helper->getLoginUrl($_SERVER['REQUEST_URI'], $permissions);

// Is the form submitted? Add the formData to our session
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $_SESSION['formData'] = $_POST;
    unset($_POST);

    // If the user is not logged in, redirect them to the facebook login
    if (!$loggedIn) {
        header("location: " . $loginUrl);
        exit;
    }
}

// Predefine our select dropdown values
$options = [
    'loan' => 'Personal Loan',
    'card' => 'Credit Card',
    'savings' => 'Savings Account',
    'mortgage' => 'Mortgage',
];
?>

<!-- Your form -->
<form id="msform" class="form-horizontal" method="POST" action="">
        <label for="product">Select product:</label>
    <select name="product" id="product">
        <?php foreach ($options as $option => $optionValue): ?>
        <option value="<?= $option; ?>" <?= isset($_SESSION['formData']['product']) && $_SESSION['formData']['product'] == $option ? 'selected="selected"' : ''; ?>><?= $optionValue; ?></option>
        <?php endforeach; ?>
    </select>
    <textarea rows="4" name="liked" placeholder="I really liked..."><?= isset($_SESSION['formData']['liked'] ? $_SESSION['formData']['liked'] : ''; ?></textarea>
    <textarea rows="4" name="disliked" placeholder="I did not like..."><?= isset($_SESSION['formData']['disliked']) ? $_SESSION['formData']['disliked'] : ''; ?></textarea>
    <?php if ($loggedIn): ?>
        <input type="submit" name="submit" class="submit action-button" value="Submit"/>
    <?php else: ?>
        <input type="submit" name="submit" class="submit action-button" value="Login with Facebook"/>
    <?php endif; ?>
</form>

【讨论】:

  • 感谢您的回答。在我看来,您的代码在单击提交按钮后将数据添加到会话中。但是,我的问题是如何在 POST 之前将数据存储在会话中,因为注销的用户看不到提交按钮。
  • 啊……我明白了。好吧,如果不发布表单,您将无法在 PHP 中执行此操作。您正在寻找的是 Javascript。
  • @GeorgeP 看看我编辑的答案。我不确定 Facebook 是否支持这种方法,但值得一试。这样你就可以两全其美了。
  • 我明白你的意思。我可以试试。但是,我更喜欢使用 JavaScript 几乎立即或作为用户类型在会话中保存数据的方法。再次感谢您的宝贵时间。
【解决方案2】:

据我了解,您希望将 FormData 存储在内存中,以便以后用于重新填充字段。为此,最好使用 LocalStorage 而不是 SessionStorage。此处记录了 LocalStorage API。

https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

【讨论】:

  • 为什么?只需在服务器上使用会话变量
  • @mplungjan 我一定误解了这个问题。用户将被重定向到不同的域,然后当他回来时,我们希望重新填充表单。将表单数据存储到本地存储然后使用该对象重新填充字段不是更容易吗?
  • 除非在公共服务器上不太好 - 如果在客户端上,为什么不用 sessionStorage 而不是 localStorage
  • 我的错误...我不知道 sessionStorage 即使在切换域后仍然存在,只要您回到同一个域。
猜你喜欢
  • 1970-01-01
  • 2013-12-05
  • 2015-05-01
  • 2014-11-30
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
相关资源
最近更新 更多