【问题标题】:Passing variables through three pages通过三个页面传递变量
【发布时间】:2014-07-07 04:55:55
【问题描述】:

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

  1. Fist Page 有一个表单,例如input type=”text” name=”username”

  2. 第二页使用$_POST 函数从第一页的表单接收输入 例如$username=$_POST[“username”]

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

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

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

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

我想出了一个简单的方法来解决一个问题:只需在第二页的第一页上重新创建表单的副本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"];
?>

【问题讨论】:

  • 你能给我们看看代码吗?
  • 您是否已在第 3 步中开始会话?
  • 你是用word写的吗?您经常使用“ 和”,这会影响您的代码。
  • 是的,我如何在不被本网站自动删除“”的情况下发布代码。
  • 会话在第二页开始

标签: php html forms session post


【解决方案1】:

你必须展示你的代码,但基本上,这应该可以工作:

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'];

这会将$_SESSION['username'] 的值设置为$_POST['username'](如果已发送该帖子值),并将$_SESSION['username'] 的值分配给$username 在所有情况下。如果$_POST 或$_SESSION 都没有设置用户名,则存在意外问题,您应该重定向,或向用户显示错误消息...


您的代码发布后,有几个问题变得很明显:

  • session_start 需要 no 参数,您传递的是 1。
  • session_start 只能在标头尚未发送时调用(即:无输出),您正在调用 print_r,它会创建输出。
  • 如果您的脚本仅包含 PHP,请不要使用结束 ?&gt; 标记(如果您想知道原因,请参阅 php.net)
  • 确保在开头&lt;?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['用户名']
  • @user3651945: 检查signature of session_start: bool session_start ( void ); session_start(1)) 而 PHP 需要 void。另请注意,您无法在 输出已发送后开始会话:print_r 发送输出。无论如何不要使用该功能:发布数据始终是一个字符串。还要确保&lt;?php 标记之前有 no 空格
  • 哇,这成功了!非常感谢!!你能解释一下第 7 行到底是做什么的吗?它可以工作,但我不熟悉代码。
  • @user3651945: $var = &lt;expression&gt; ? &lt;value1&gt; : &lt;value2&gt; 正在使用三元运算符。 if (&lt;expression&gt;) { $var = &lt;value1&gt;; } else { $var = &lt;value2&gt;;}的缩写
【解决方案2】:

据我所知,您正在使用寄存器全局变量。

现在这是您的第一个错误。不要使用它。只是不要。

然后,您将用户名存储在会话中,所以现在您可以使用

访问它
$_SESSION['username']

另外,在会话中存储数据时,您还需要调用 session_start();在将任何数据分配给您的会话之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多