【问题标题】:Make a form sticky with php session使用 php session 使表单保持粘性
【发布时间】:2017-04-18 13:12:50
【问题描述】:

我正在尝试创建 php 多页表单,为此我使用 PHP 会话。 但是,当用户输入出现错误并且我希望表单要求用户使用正确的输入再次填写表单时,表单字段将不会保存用户已经输入的数据,因此用户必须开始操作重新来过。 如何使表单与 php 会话保持一致? 谢谢

我的代码如下

<?php
// Session starts here.
          if (!isset($_SESSION)) session_start();
?>
<form action="registration.php" method="post">
  <center><h8>Please create your user name and password</h8></center>
  <div class="imgcontainer">

    <img src="phone.gif" alt="Welcome" class="avatar">
  </div>

  <div class="container">

           <label><b>Username</b></label>
           <input type="text" placeholder="Enter Username" name="username" required value="<?php if(isset($_POST['username'])) echo $_POST['username'];?>">

            <label><b>Password</b></label>
              <input type="Password" placeholder="Enter Password" name="password" required>

              <label><b>Confirm Password</b></label>
    <input type="Password" placeholder="Confirm Password" name="confirm" required>
    <span id="error" width=100%>
     <!---- Initializing Session for errors --->
     <?php
     if (!empty($_SESSION['error'])) {
                echo "<error>".$_SESSION['error']."</error>";
                unset($_SESSION['error']);
      }

  if (isset($_POST['username'])){ 
       $_SESSION['username'] = $_POST['username'];
       echo $_SESSION['username'];
       echo $_POST['username'];
        }
 ?>
 </span>
<br>

    <input type="reset" value="Reset" />
 <input type="submit" value="Next" />

  </div>

并且注册php包含

<?php
if (!isset($_SESSION)) session_start();
// Checking first page values for empty,If it finds any blank field then redirected to first page.
if (isset($_POST['username']))
{
      if (($_POST['password']) === ($_POST['confirm'])) 
                 {
                     foreach ($_POST as $key => $value) 
                         {
                             $_SESSION['post'][$key] = $value;
                          }
                 }
       else 
                 {
                    $_SESSION['error'] = "Password does not match with Confirm Password.";
                    if (isset($_POST['username'])){ 
                               $_SESSION['username'] = $_POST['username'];
                               echo $_SESSION['username'];
                              echo $_POST['username'];
                    }
                    header("location: createlogin.php"); //redirecting to first page
                 }
}

【问题讨论】:

  • 你能显示你已经尝试过的代码吗?
  • 我没有在任何地方看到关闭的&lt;/form&gt;,甚至在编辑模式下也没有。因此,我们不知道这是否不是问题的一部分或“问题”。

标签: php forms session sticky


【解决方案1】:

类似这样的:

<input name="var" value="<?= isset($_SESSION['var']) ? $_SESSION['var'] : null  ?>" />

【讨论】:

  • 这里不是我的反对票,但我不明白为什么它被反对了;这是一个可能的解决方案。也许是因为“blah”,谁知道呢。编辑:我编辑以防万一。编辑 2:似乎他们收回了反对票。
  • 有兴趣可以试试我的表单库,省去很多麻烦github.com/delboy1978uk/form:-)
【解决方案2】:

换一种方式试试。将表单操作链接到当前页面,以及所有字段是否有效;将其重定向到下一页 (registration.php)。这样你仍然拥有所有的后期数据,你可以处理所有需要保存在会话中的东西——并且你可以在所有逻辑完成后重定向。

【讨论】:

    【解决方案3】:

    我的两分钱将保留在同一页面以验证内容和表单。
    您可以在单个页面中包含其他 PHP 文件,具体取决于表单是否有效。
    这样,您可以在两个页面之间保持相同的 $_POST,并且不需要将发布的数据存储在会话变量中。

    否则,如果要保持相同的架构,则需要在输入值中使用$_SESSION 变量而不是$_POST 变量,例如delboy 的回答。

    替换:

    <?php if(isset($_POST['username'])) echo $_POST['username'];?>
    

    与:

    <?php if(isset($_SESSION['username'])) echo htmlspecialchars($_SESSION['username']); ?>
    

    ^ 注意:如果用户输入" 作为用户名,则使用 htmlspecialchars 来防止反射 XSS。

    【讨论】:

    • 我尝试在同一页面等上进行验证,最后 Anthony 的解决方案有效。
    【解决方案4】:

    问题是,您的数据已发布到registration.php,因此您无法在原始文件中获取发布的值。您正在尝试使用 $SESSION 但不建议这样做,也不正确。你的整个解决方案都是错误的。

    忘记会话和分离文件,将所有内容放在registration.php文件中。

    您可以使用 $_SERVER['REQUEST_METHOD'] 变量检查用户是否发布。

    if($_SERVER['REQUEST_METHOD'] == 'POST'){
      print 'Something just posted';
    }
    

    PS:在存储之前不要忘记保护密码! :)

    【讨论】:

    • 非常感谢。似乎有些建议无需会话即可工作。我将尝试该解决方案并报告它的进展情况。
    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2011-12-26
    相关资源
    最近更新 更多