在三个页面中传递变量


Passing variables through three pages

我想在三个页面中传递变量。我目前使用的方法是:

  1. 首页有一个形式,例如input type=”text” name=”username”

  2. 第二页通过$_POST功能接收来自第一页表单的输入例:$username=$_POST[“username”]

  3. 为了保存第一页的信息,我在第二页上创建了一个会话,并将输入存储在其中,例如如下:$_SESSION[“username”]=$username

  4. 然后导航到第三页并开始我的会话。如果我回显会话中存储的输入,服务器返回"未定义变量username"。我猜这是如此,因为变量$username根据定义是$_POST[“username”],在这种情况下,没有该帖子的输入(在第三页上)。

当然,我已经尝试将变量$username转换为字符串和/或文本与print()/print_r()函数。不改变任何东西

有人对这个问题有任何解决方案或变通方法吗?

我想出了一个不优雅的方法来解决一个问题:只需在第二页的value=$_POST[“username”] .......中重新创建第一页上表单的副本但我需要这是一个会话,因为这三个页面不是线性的(换句话说,不是步骤1,2,3,而是步骤1,2,1,3等)。

如果它有帮助:这是一个注册表单(没有密码)有三页。最后,必须能够导航回页面以检查输入(因此需要将数据存储在某个地方,以便在输入字段中调用它)。

代码第一页(输入在表中,左列指定输入是什么,右列指定输入字段):

<table>
<tr>
    <td class="table_column_1"><p>Title </p></td>
    <td>
        <p><select name="title" class="dropdown" style="width:145px">
        <option>Bitte waehlen</option>
        <option value="Frau">Mr</option>
        <option value="Herr">Mrs</option>
        </select></p>
    </td>
<tr>
    <td class="table_column_1"><p>First name: </p></td>
    <td><p><input type="text" name="firstname"</p>
    </td>
</tr>
<tr>
    <td><p>Surname: </p></td>
    <td><p><input type="text" name="surname" /></p></td>
</tr>   
<tr>
    <td><p>Email: </p></td>
    <td><p><input type="email" name="email" /></p></td>
</tr>
<tr>
    <td><p>Company: </p></td>
    <td><p><input type="text" name="company" /></p></td>
</tr>
<tr>
    <td class="table_column_1"><p>Department: </p></td>
    <td><p><input type="text" name="department" /></p></td>
</tr>
</table>

代码第二页:

<?php
//Change variable to text/string
$title=print_r($_POST["title"]);
$firstname=print_r($_POST["firstname"]);
$surname=print_r($_POST["surname"]);
$email=print_r($_POST["email"]);
$company=print_r($_POST["company"]);
$department=print_r($_POST["department"]);
if ($title != "Bitte waehlen" && $firstname != "" && $surname != "" && $email != "" && $company != ""  &&$department != ""){
    session_start(1);
    echo "Session: RUNNING";
    //list for registration values
    $_SESSION["registration"]="YES";
    $_SESSION["title"]=$title;
    $_SESSION["firstname"]=$firstname;
    $_SESSION["surname"]=$surname;
    $_SESSION["email"]=$email;
    $_SESSION["company"]=$company;
    $_SESSION["department"]=$department;
    //Test session department and variable firstname validity
    echo $_SESSION["department"];
    echo $firstname;
    }
else{
    session_start(1);
    $_SESSION["registration"]="NO";
    echo "Session: NO";
    header("location: registration.php");
    };
?>

代码第三页:

<?php
    session_start(1);
    echo "Session: RUNNING";
    //Check if session department data is returnable => no
    echo $_SESSION["department"];
?>

您必须显示您的代码,但基本上,这应该工作:

session_start();//before ANY output is sent to the client!
if (isset($_POST['username']))
{
    $_SESSION['username'] = $_POST['username'];
}
if (!isset($_SESSION['username']))
{
    //redirect, or present user with error message
}
$username = $_SESSION['username'];

如果发送了该post值,则将$_SESSION['username']设置为$_POST['username']的值,在所有情况下将$_SESSION['username']的值赋给$username。如果$_POST$_SESSION都没有设置用户名,则存在意外问题,您应该重定向,或者向用户显示错误消息…


在你的代码发布后,几个问题变得明显:

  • session_start期望没有参数,你正在传递1
  • session_start只能在头还没有发送(即:没有输出)时调用,你正在调用print_r,它会创建输出。
  • 如果你的脚本只包含PHP,不要使用结束的?>标签(如果你想知道为什么,请参阅php.net)
  • 确保<?php标签开始前没有空格
  • 函数返回值的原因:如果会话不能创建,session_start返回false: 检查返回值

这意味着你的page2.php脚本应该像这样,或多或少:

<?php
if (!session_start())
    exit('Output has already been sent!');//check for whitespace, use output buffering...
if (isset($_POST['title']) && $_POST['title'] !== 'Bitte waehlen')
{
    $_SESSION['title'] = $_POST['title'];
    $_SESSION["registration"]="YES";
    //avoid notices, always use isset:
    $_SESSION['firstname'] = isset($_POST['firstname']) ? $_POST['firstname'] : null;
}
else
{
    //form wasn't submitted, or the title was "Bitte waehlen":
    // show error message, or redirect
}

据我所知,你正在使用全局寄存器。

这是你的第一个错误。不要用它。只是不要。

然后,您将用户名存储在会话中,因此现在您可以使用 访问它
$_SESSION['username']

另外,当在会话中存储数据时,还需要调用session_start();